而在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