主从复制存在的问题:
出现问题要手动进行故障转移
写能力和存储能力受限
自动故障转移:
客户端不会管谁是master谁是slave 客户端链接sentinel 由sentinel通知客户端master是那个然后进行直连;
sentinel可以监控多套主从复制 以master-name来区分,当master出现故障时候选取一个sentinel作为领导将主从复制进行故障转移;由于此操作只需要一个sentinel就可以完成所以在第二步会选取sentinel
sentinel故障转移原理
sentinel的三个定时任务
第二个定时任务为第三个的基础,相当于每个sentinel都采用发布订阅模式订阅了相同的频道 ,每2秒通过sentinel的master节点的channel和其他的sentinel交换信息;
主观下线和客观下线
主观下线:是单个sentinel节点对redis节点失败的判定;
客观下线:是所有sentinel节点对redis节点失败的判定,如果设置为2 那么两个sentinel节点认为该redis失败那么它才算失
败,一般这个数值设置为总sentinel的数量除以2然后加1;
redis下线后 选出sentinel领导者
sentinel集群内部会选出一个领导者,来对redis主从进行故障转移;
选出领导者进行故障转移
什么是合适的slave:
1.优先级
2.偏移量最大说明复制的越完整
3.runId最小 说明最先创建
节点维护
手动故障转移,通过sentinel发送命令,进行故障转移
高可用读写分离
sentinel中,读写分离时客户端读数据连接的是slave节点,但是当slave节点宕机sentinel是无法对slave节点进行故障转移的,因为sentinel监控的只是master节点只会转移master节点 对slave只会做一个主下线的判断,所以可以将slave进行一个池连接,但是这样写会出现其他问题(例如主观下线判断不准确) 并且提高复杂度,如果redis的性能下降,可以考虑集群
搭建sentinel
1.sentinel 端口
2.sentinel地址
3.sentinel日志
4.sentinel monitor 监控名称 地址 端口 2(这个2代表至少有两个sentinel认为sentinel有问题那么才进行故障转移)
5.相当于sentinel去连接master 如果30000毫秒还不通; 如果当前sentinel与master直接的通讯中,在指定时间内没有响应或者响应错误代码,那么 当前sentinel就认为master失效(SDOWN,“主观”失效)
6.这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步。在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长。,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
7.默认超过这个时间认为故障转移失败,需要人工进行故障转移
9.sentinel auth-pass mymaster 123456 主节点的密码
10.正常redis-server可以通过配置文件来指定守护进程启动以及指定日志路径,但sentinel就不一样了。正常启动redis的sentinel时,进程会直接在前台跑,一退出sentinel进程就关了,解决方案 以守护进程的方式启动 daemonize yes
11.解除保护模式 允许远程访问 protected-mode no
只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后(sentinel本身也有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要将sentinel集群,这样有几个好处:
- 即使有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换;
- 如果只有一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换(单点问题);
- 如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息。
sentinel的集群 只需要复制一样的配置sentinel.conf文件,修改端口号,然后分别启动就可以。sentinel会根据 master 名字 地址 来互相关联,交互信息。
sentinel 启动命令:redis-server.exe sentinel.conf --sentinel
redis-cli -p sentinel端口 登陆然后输入info 查询sentinel信息
spingBoot配置sentinel
spring:redis:password: 123456sentinel:#sentinel监听的名称master: mymaster #sentinel的ip和端口 如果有多个sentinel用逗号隔开nodes: 192.168.1.127:26379
比较有用的文章:
redis哨兵主备切换的数据丢失问题:异步复制、集群脑裂
sentinel 启动步骤