集群模式
架构图
客户端通过hash算法吧key均匀分配到各个master中
单个master还是主从架构
搭建主要配置
配置信息写入文件(自动写入),命名最好和实际端口一致
另外如果需要安全设置一下密码
foobared就是密码,可以改成需要的
如果集群机器配置了有密码则需要配置机器之间通讯所用密码
创建主从命令
修改了配置文件后启动的redis并没有联系起来
需要运行
redis-cli [-a password] --cluster create host1:prot1 … hostN:protN
–cluster -replicas <arg>
arg:是所有主节点几个从节点的意思
假设有6台机器,这里配置1,就会自动组成3主3从
配置2就会自动组成2主4从
主节点=总机器数/(arg+1)
执行完命令会出现
和大致的分槽策略
确认默认分槽策略ok(平均分配)就输入yes继续
注意:创建集群命令只需要执行一次,如果关闭集群,下次需要启用
只需要启动所有的redis实例,集群就会自动创建,因为创建好的配置信息已经写入文件中了,具体见配置项:cluster-config-file
访问
redis-cli -a password -c -h oneMasterIp -p oneMasterPort
进入集群
-c 代表集群模式
-a 集群密码
cluster info
cluster nodes
key的hash算法
先把key用高性能hash算法计算一个Hash CRC16(key)
然后把hash%16384 得到一个 0 ~ 16383之间的一个数作为 solt
每个机器存什么solt在创建的时候已经指定好了
直接根据solt找到机器存进去
Redis集群间通讯
集群之间通过 gossip 协议通讯
超时时间配置不能太短也是避免机器间通讯万一只是网络抖动问题,也不会立即重新选举,cluster-node-timeout
选举
- 从节点发现主节点FAIL
- 记录currentEpoch+1,广播FAILOVER_AUTH_REQUST信息
- 其他实例收到消息后,只有mater会判断是否合法并相应FAILOVER_AUTH_ACK
- 每收到一次ACK就计数+1
- 如果技术超过半数master ack 则slave成为master
- 广播Pong通知集群其他节点
为了避免同时发请求,同时收到ACK的情况
每个slave发送FAILOVER_AUTH_REQUST会延时随机时间
并且数据越新的slave随机时间越短
脑裂问题
如果一个master和集群断开连接且集群又重新选举成功
此时对应一些槽位可能不同客户端连接不同的master,如果此时2边都有命令写入
后续如果原master重新和集群连接应该作为从节点接入
则数据丢失
解决方案:
配置:min-slaves-to-write 1
主节点接收到消息后至少同步1个从节点成功才返回客户端成功
如果没有从节点则master也不能提供服务所以开启这个配置要慎重
会报错:
小集群挂掉
如果有槽位主备都挂了,默认是整个集群不再提供服务
如果仍希望集群可用则改为"no"
批量操作
失败,集群无法支持例如 MSET 多个key 的操作,只有在这些key算出来的槽位在一个的时候才能成功,所以如果实在有需求就需要使用{}key了。因为带有{}的key,计算时只会计算{}里边的内容,保持一致槽位就一致
集群扩容
启动新的redis实例作为游离节点
指定原节点邀请新节点加入集群,新加入做主节点,但是没有槽位
redis-cli -a password --cluster add-node newNodeIp:newNodePort srcNodeIp:srcNodePort
做主节点
进入任意原主节点,进行槽位迁移
注意这里的迁移时直接迁移所有节点的槽位和内容
假如原来有3主,迁移600个就各分200各迁移到新节点
redis-cli -a password --cluster reshard srcNodeIp:srcNodePort
询问要迁移多少槽位过去,指定多少‘
给谁(nodeID)
做从节点
进入
cluster replicate masterNodeId