redis——集群
为保证服务高可用,一般会对服务进行多节点分布式部署,redis有主从、哨兵、切片集群几种模式,这几种模式可以共存
1、主从集群
在slaver的redis.conf中添加主节点地址
主节点ip 主节点端口
1.1、同步过程
- slaver向master发送psync,传递runID(第一次为?,后面为主库runID)和offset(第一次为-1,后面为从库的复制进度)
- master回复fullresync,表示第一次全量复制
- master执行bgsave生成rdb文件,发给slaver
- slaver接收rdb文件,先清空当前库,再加载rdb
- 当同步完成后,后续master再接收到写指令,会先执行指令再发给slaver
1.2、特殊同步点
- master向slaver同步时(生成rdb并传输的过程),新接收的写操作会放到replication buffer中,master针对每个slaver都会创建对应的replication buffer,用于缓存增量操作,等rdb传输完成后再发给slaver,让slaver追加执行
- master和slaver断连期间,master接收到的写请求会同时写到replication buffer和repl_backlog_buffer中,repl_backlog_buffer是master在拥有slaver时创建的,所有slaver共享,是一个环状缓存队列,用于master记录少量的写入操作。当slaver恢复连接后,会向master发送psync并携带slave_repl_offset表示自己同步数据的偏移量,master收到后同自己当前写入数据的偏移量master_repl_offset对比,将区域间的指令复制到对应slaver的replication buffer中,再发送给slaver
1.3、主从级联模式
为了防止master同时对多台slaver全量复制导致的子进程fork堆积和rdb文件传输的带宽占用,一般会将master下的部分slaver部署在某几台slaver之后,形成间接的主从关系并进行主从复制传递,以减少master全量同步的压力
2、哨兵集群
主从集群没有主从切换的功能,主节点可读写,从节点只能读。为了解决主节点挂掉后写操作不可用的问题,引入哨兵节点监控主从节点状态并管理主从状态
在sentinel.conf中添加主节点配置
sentinel monitor 主节点名 主节点ip 主节点端口 哨兵集群中的多少个节点判定主节点不可用时会进行切换
2.1、哨兵通信
通过redis的发布订阅模式,各个哨兵节点启动后将自己的ip端口发布到主节点的__sentinel__:hello频道上,并订阅该频道,各个哨兵之间的地址就都互通了
2.2、监控和选主
- sentinel向master发送INFO指令,获取slave信息,并进行heartbeat
- 当某个sentinel判断master断连时,向其他sentinel发送is-master-down-by-addr,进行master状态判断,并作出投票反馈
- 赞成master切换的票数大于配置时,这个sentinel会给其他sentinel发送指令进行Leader选举,表示自己来执行主从切换
- Leader选举的赞成票过半表示同意该sentinel负责主从切换
- sentinel淘汰掉下线的slaver和断连次数过多的slaver,以优先级、同步程度和ID号三个信息依次进行比较,优先级高的直接被选为主库,相同的再比同步程度,再相同再比ID
3.、切片集群
主从模式下,redis随着内存占用越大,持久化操作的时间越长,这样会拖垮redis性能,为此将单主下的大内存拆成若干小内存分布在多主下,减少每个主节点的持久化压力,属于水平扩展
开启切片
cluster-enabled yes
3.1、写操作流程
- claster会同步相关联claster的信息,以拥有完整的hash槽对照表
- client与claster建立连接,并获取对照表
- client想要进行写操作时,将key进行crc16计算并对16384取模(所有claster共有16384个hash槽,默认平均分配),再根据对照表就能知道他要往哪个claster发指令
3.2、特殊点
- 当节点个数变化时,需要对槽进行重新分配,并设计数据迁移
- 重新负载后,客户端的hash槽对照表失效,请求会打到老claster,由老claster根据自己的hash槽对照表告诉client失效key所在最新节点,client再直连新claster进行写操作
- 重新负载时,如果请求打到正在迁移的的claster,claster会返回数据的位置和对应节点状态,client会向数据所在的新的claster发送asking命令,让claster允许执行后续命令,此时client再向claster发送指令