ToB企服应用市场:ToB评测及商务社交产业平台

标题: 浅谈 Redis 主从复制原理(二) [打印本页]

作者: 尚未崩坏    时间: 5 天前
标题: 浅谈 Redis 主从复制原理(二)
各人好,我是此林。
【浅谈 Redis 主从集群原理(一) 】
上一篇文章中,说到了 Redis 主从复制的全量同步和增量同步,repl_baklog 复制缓冲区,以及 slave 挂掉之后数据同步的措施。
下面先容的上一篇遗留问题,主节点 master 宕机了,怎么办?
1. 哨兵(Sentinel)

这里贴一张网上的图,对哨兵有个团体了解。

 哨兵的作用有三个:
1. 监控:不断地检查 master 和 slave 是否按照预期工作。
2. 自动故障恢复:如果 master 宕机,哨兵会推举一个 slave 提拔为 master。
3. 通知:当集群发生故障转移时,会将最新信息推送给 Redis 客户端(如:RedisTemplate)

2. 服务监控

哨兵基于心跳机制监测服务状态,每隔 1 秒向集群的每个实例发送 ping 下令。


3. master 推举

如果发现 master 宕机了,须要在 slave 中推举一个作为新的 master。
推举优先级规则:
1. 先根据 slave 和 master 断开时间的长短,剔撤除凌驾指定阈值的 slave。
2. 然后在剩余的节点中,比较 slave-priority 的大小,越小优先级越高(可以通过设置文件设置)
3. 如果 slave-priority 一样,就比较 slave 的 offset,就是同步进度,越大的代表数据越新。
4. 最后比较 slave 节点的 id 大小,越小优先级越高。

4. 故障转移

当选了一个 slave 作为新的 master 后,开始举行故障转移。
1. 哨兵向新的 master 发送 slaveof no one 下令,让 slave 酿成 master。
2. 哨兵再向其他节点发送 slaveof  新master的IP  新master的端口,让其他节点成为新 master 的 slave。
3. 最后,把故障节点标记为 master,如许故障节点恢复后就会成为新 master 的 slave。

5. 哨兵集群搭建

哨兵集群信息如下:
哨兵节点IP地址端标语
s1192.168.183.12827001
s2192.168.183.12827002
s3192.168.183.12827003
主从集群信息如下:
节点IP地址端标语
master192.168.183.1287001
slave1192.168.183.1287002
slave2192.168.183.1287003
目录信息如下:

在s1、s2、s3目录下创建 sentinel.conf,这是 s1 的。

   注:vi 下令编辑,:wq 保存,:q! 不保存退出,键盘按下 i 是insert 模式,\+关键字是搜索
    设置解释:
  port 27001:指定哨兵端口
  sentinel announce-ip :声明当前哨兵的IP地址
  sentinel monitor:指定主节点信息。mymaster 是主节点名称,IP 和 端口也是主节点的,2 是当凌驾两个哨兵认为某个节点主观下线的时候,那么该节点客观下线。
  为什么只要设置 master:master 上可以通过 info replication 下令查询到 slave 的信息,以是现实上还是会监控整个集群的。
  sentinel down-after-milliseconds:slave 和 master 断开的最大时长
  sentinel failover-timeout:slave 故障恢复的超时时间
  哨兵启动:
  1. redis-sentinel s1/sentinel.conf
  2. redis-sentinel s2/sentinel.conf
  3. redis-sentinel s3/sentinel.conf
复制代码
 
6. RedisTemplate 哨兵模式

RedisTemplate 作为 Redis 的一个客户端,底层使用 lettuce 实现节点的感知和自动切换。
在application.yml 里设置如下:

   这里我们发现只要设置哨兵节点即可。
  以是总结之前的,可知哨兵有如下作用:
  1. 服务监控
  2. master 推举和 slave 故障转移
  3. 通知 Redis 客户端节点变革
  主从读写设置:
  1. @Bean
  2. public LettuceClientConfigurationBuilderCustomizer configurationBuilderCustomizer() {
  3.     return configBuilder -> configBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
  4. }
复制代码
这里的 ReadFrom 是设置 Redis 的读取计谋:
MASTER:从主节点读取
MASTER_PERFERRED:优先从 MASTER 读取,MASTER 不可用才读取 slave。
REPLICA:从从节点读取
REPLICA_PERFERRED:优先从从节点读取,slave 不可用才读取 MASTER。
主从切换、读写分离、故障转移通知接收由 RedisTemplate 全自动完成,底层已经封装好了,我们无需关注。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4