1 redis cluster
- redis cluster是多主多从结构,节点间通过gossip协议通信
- redis集群创建,redis按单机启动后,执行命令:前三个为主 后三个为从
./redis-cli --cluster create ip1:6379 ip2:6379 ip3:6379 ip4:6379 ip5:6379 ip6:6379 --cluster-replicas 1 - 扩容:需要分配hash槽该扩容节点才可以用
- 缩容也需要进行hash槽重新分配
- 缺少一个主节点则集群不可用
参考:
redis面试题
Redis-Cluster集群搭建
Redis - 集群Hash槽分配
2 redis 哨兵
- 哨兵模式是Redis的高可用方式,可以监听主从模式的redis,在主节点故障后,将slave升级为master
- 哨兵节点是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点
- Sentinel 与 Sentinel 、Sentinel 与 Redis Node都使用redis的pubsub(sentinel:hello)进行通信
心跳:PING返回PONG
信息:INFO - 每个Sentinel启动时只需要监听master就行,master上将会有所有Sentinel的信息, Sentinel通过master就可以获得其他Sentinel的信息
- 每个 sentinel 哨兵节点每隔1s 向所有的redis node发送心跳,如果 master 节点回复 PING 命令的时间超过阈值(默认30s),则判断master为主观下线,然后询问其他sentinel 是否同意下线,当一半以上的sentinel 同意后,master为客观下线,即master节点不可用
- 基于Raft算法选举领头sentinel,用来负责故障转移,选择一个slave成为新的master。选择领头sentinel的过程符合先到先得的原则,判断客观下线的sentinel节点向其他 sentinel 节点发送选举自己为头,其他sentinel只回复收到的第一个节点为同意,后面的都不同意
- 选择slave的策略:
① 选择优先级最高的节点,通过sentinel配置文件中的replica-priority配置项,这个参数越小,表示优先级越高
② 如果第一步中的优先级相同,选择offset最大的,offset表示主节点向从节点同步数据的偏移量,越大表示同步的数据越多
③ 如果第二步offset也相同,选择run id较小的 - sentinel 进行主从切换时,客户端如何知道地址变更了?
①旧的主库挂掉了,那么所有正在使用的连接都会被关闭,然后在重连时就会用上新地址
②sentinel 主动进行主从切换,主库并没有挂掉,主从切换后,之前的主库被降级到从库,所有的修改性的指令都会抛出ReadonlyError