redis集群形式
数据分区方案
客户端分区
客户端分区方案的代表为Redis Sharding, Redis Sharding是Redis Cluster出来之前,业界普遍使用的Redis多实例集群方法。Java的Redis客户端驱动库Jedis,支持RedisSharding功能,即Shardedledis以及结合缓存池的ShardedJedisPool.
代理分区
代理分区常用方案有Twemproxy和Codis。
高可用方式
Sentinel哨兵
Sentinel哨兵机制支持高可用。
哨兵的作用就是监控Redis系统的运行情况。主要功能包括以下三个:
- 监控(Monitoring):.哨兵(sentinel)会不断地检查你的Master和Slave是否运作正常。
- 提醒(Notification):当被监控的某个Redis出现问题时,哨兵(sentinel)可以通过API向管理员或者其他应用程序发送通知
- 自动故障迁移(Automatic failover):当主数据库出现故障时自动将从数据库转换为主数据库。
Redis-cluster
Redis的官方多机部署方案,Redis Cluster。一组Redis Cluster是由多个Redis.实例组成,官方推荐我们使用6实例,其中3个为主节点,3个为从结点。一旦有主节点发生故障的时候,Redis Cluster可以选举出对应的从结点成为新的主节点,继续对外服务,从而保证服务的高可用性。那么对于客户端来说,知道知道对应的key是要路由到哪一个节点呢?Redis Cluster把所有的数据划分为16384个不同的槽位,可以根据机器的性能把不同的槽位分配给不同的Redis.实例,对于Redis.实例来说,他们只会存储部分的Redis数据,当然,槽的数据是可以迁移的,不同的实例之间,可以通过一定的协议,进行数据迁移。
redis cluster缺点:
- key批量操作支持有限
- key事务操作支持有限
- key作为数据分区的最小粒度
- 不能将一个大的键值对象如hash、list等映射到不同的节点
- 不支持多数据空间
- 复制结构只支持一层
- 命令大多会重定向
一致性hash:
一致性哈希可以很好的解决稳定性问题,可以将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临接的存储节点存放。而当有节点加入或退出时,仅影响该节点在Hash环上顺时针相邻的后续节点。
部署Cluster集群
创建6个redis节点
for port in $(seq 7001 7006);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.48
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF
docker run -p ${port}:${port} -p 1${port}:1${port} --name redis-${port}
-v /mydata/redis/node-${port}/data:/data
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf
-d redis:5.0.7 redis-server /etc/redis/redis.conf;
done
建立集群
docker exec -it redis-7001 /bin/bash
redis-cli --cluster create 192.168.1.48:7001 192.168.1.48:7002 192.168.1.48:7003 192.168.1.48:7004 192.168.1.48:7005 192.168.1.48:7006 --cluster-replicas 1
测试
redis-cli -c -h 192.168.1.48 -p 7001
set a1 a
set hello h
get a1
get hello
查看集群信息
cluster info
模拟主节点宕机
docker stop redis-7001
docker exec -it redis-7002 /bin/bash
redis-cli -c -h 192.168.1.48 -p 7002
cluster nodes
观察到:7001宕机了,但是7006主动变成master了。
现在主动恢复7001节点:
docker start redis-7001
观察节点:
cluster nodes
7001变成7006的slave了。
通过redis cluster可以做到节点的故障切换。