一、集群的意义
1、 性能
2、 扩展
3、 可用性、 安全
二、Redis主从复制
replicaof 192.168.44.186 6379
无盘复制 repl-diskless-sync=no
适用于master节点所在机器磁盘性能较差但网络宽带较充裕的场景
主从复制的不足
- 没有解决高可用问题
- 需要手动切换主从
三、Sentinel哨兵
1.高可用思路
目标:
服务端: 自动切换主从
客户端: 自动发现路由
2.Sentinel
是一个特殊状态的Redis服务监控master/slave并且相互监控
3.Sentinel工作原理
1、 主观下线与客观下线
2、 Raft算法
4.故障转移
master选举因素
1、 如果与哨兵连接断开的比较久, 超过了某个阈值, 就直接失去了选举权。
2、 如果拥有选举权,那就看谁的优先级高, 这个在配置文件里可以设置 (replica-priority 100) , 数值越小优先级越高。
3、如果优先级相同, 就看谁从master中复制的数据最多(复制偏移量最大) , 选最多的那个
4、 如果复制数量也相同,就选择进程id最小的那个。
5.不足
主从切换的过程中会丢失数据, 因为只有一个master。
只能单点写, 没有解决水平扩容的问题。
四、Redis分布式方案
1.Redis Cluster 故障转移
1.slave发现自己的master变为FAIL
2.将自己记录的集群currentEpoch加1, 并广播FAILOVER_AUTH_REQUEST信息
3.其他节点收到该信息, 只有master响应, 判断请求者的合法性, 并发送FAILOVER_AUTH_ACK, 对每一个epoch只发送一次ack
4.尝试failover的slave收集FAILOVER_AUTH_ACK
5.超过半数后变成新Master
6.广播Pong通知其他集群节点
2.Redis Cluster 特点
- 无中心架构。
- 数据按照slot存储分布在多个节点, 节点间数据共享, 可动态调整数据分布。
- 可扩展性, 可线性扩展到1000个节点(官方推荐不超过1000个) , 节点可动态添加或删除。
- 高可用性, 部分节点不可用时, 集群仍可用。 通过增加Slave做standby数据副本, 能够实现故障自动failover, 节点之间通过gossip协议交换状态信息, 用投票机制完成Slave到Master的角色提升。
- 降低运维成本, 提高系统的扩展性和可用性