# Redis Cluster集群 *** ## 传统Redis集群存在那些问题 1. Redis哨兵集群模式,每个节点都保存全量同步数据,冗余的数据比较多; 2. 只能允许一个主节点 3. 中心化模式 而在Redis Cluster模式中集群中采用分片集群模式,可以减少冗余数据,缺点就是构建该集群模式成本非常高。 * 去中心化模式 ## 传统RedisCluster集群的原理 Redis3.0开始官方推出了集群模式 RedisCluster,原理采用hash槽的概念,预先分配16384个卡槽,并且将该卡槽分配给具体服务的节点; 通过key进行**crc16(key)%16384**获取余数,余数就是对应的卡槽的位置,一个卡槽可以存放多个不同的key,从而将读或者写转发到该卡槽的服务的节点。 最大的有点:动态扩容、缩容。 1. 为每个server节点部署从节点,保证高可用 2. 一个卡槽可以分配不同的key 3. 可以通过重定向来找到对应的server 4. 卡槽(数据库的具体分表)其实就是服务器位置的标识符,从而实现数据均摊存放 5. 动态的实现扩容和缩容 ```shell # 自动分配卡槽 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 ``` ![image-20220522144243791](assets/image-20220522144243791.png) ## 扩容 如果我们新增一个节点,我们需要重新分配卡槽。数据会一起迁移到主节点 ```shell redis-cli --cluster add-node 新增集群地址:端口 集群中已经存在的任意一台连接地址:端口 redis-cli --cluster add-node 192.168.245.20:7006 192.168.245.20:7000 ``` ![image-20220522155302372](assets/image-20220522155302372.png) > **原因:redis配置文件复用,但是数据不同步** > > **解决办法:将rdb文件和aof文件改个名字** ![image-20220522161015869](assets/image-20220522161015869.png) **分配卡槽** ```shell # 扩容从节点: 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 ``` ![image-20220522162300489](assets/image-20220522162300489.png) ## RedisCluster master宕机效果 如果master宕机之后,会自动的在从节点会顺利的选为主节点;当原来的主节点在恢复启动的时候会变为从节点; ## RedisCluster集群模式缩容节点 ```shell 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 ```