而在Redis Cluster模式中集群中采用分片集群模式,可以减少冗余数据,缺点就是构建该集群模式成本非常高。
Redis3.0开始官方推出了集群模式 RedisCluster,原理采用hash槽的概念,预先分配16384个卡槽,并且将该卡槽分配给具体服务的节点;
通过key进行crc16(key)%16384获取余数,余数就是对应的卡槽的位置,一个卡槽可以存放多个不同的key,从而将读或者写转发到该卡槽的服务的节点。 最大的有点:动态扩容、缩容。
动态的实现扩容和缩容
# 自动分配卡槽
redis-cli --cluster create  192.168.245.20:7000  192.168.245.20:7001  192.168.245.20:7002  192.168.245.20:7003  192.168.245.20:7004  192.168.245.20:7005  --cluster-replicas 1
# 默认不转发,应该使用集群模式连接
# 修改为Redis的集群方式连接
redis-cli -h 192.168.245.20 -p 7000 -c
如果我们新增一个节点,我们需要重新分配卡槽。数据会一起迁移到主节点
redis-cli --cluster add-node  新增集群地址:端口  集群中已经存在的任意一台连接地址:端口 
redis-cli --cluster add-node 192.168.245.20:7006   192.168.245.20:7000  
原因:redis配置文件复用,但是数据不同步
解决办法:将rdb文件和aof文件改个名字
分配卡槽
# 扩容从节点:
redis-cli --cluster add-node   192.168.245.20:7007  192.168.245.20:7000  --cluster-slave   --cluster-master-id  583ad82a8582733f278d1afb740dd3a5ca89c6ef
# 如何分配卡槽节点
redis-cli --cluster reshard  192.168.245.20:7000
# 输入需要接受的id
如果master宕机之后,会自动的在从节点会顺利的选为主节点;当原来的主节点在恢复启动的时候会变为从节点;
redis-cli --cluster  reshard  192.168.245.20:7000  --cluster-from   需要缩容的卡槽节点  --cluster-to  接受卡槽的节点  --cluster-slots 4096
redis-cli --cluster  reshard  192.168.245.20:7000  --cluster-from   9299bfa1bb47dc7d53ed737f32bd0630ff5c8136  --cluster-to bdd488f3e42b2b05649856c9d59e2fc8acec7ed1  --cluster-slots 4096