侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Redis 哨兵模式

再见理想
2022-05-27 / 0 评论 / 0 点赞 / 328 阅读 / 1,494 字

一,简介

哨兵 (sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。

避免了当 Redis 主从架构的Master宕机了从而导致整个集群的不可用。

思考几个问题:

怎么确定 master 宕机?

怎么选新的 master?

修改配置后,原理的 master 恢复了怎么办?

二,哨兵的作用原理

监控

不断的检查 master 和 slave 是否正常运行;master存活检测、master 与 slave 运行情况检测。

原理:同步各节点的状态信息(各 Sentinel 状态及是否在线、master状态及各 slave 的详细信息、slave 状态)。

通知

当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。

原理:任一 Sentinel 去获取 master 和 slave 的工作状态,通知给其它 Sentinel。

故障转移

断开 master 与 slave 连接,选取一个 slave 作为 master,将其他 slave 连接新的 master,并告知客户端新的服务器地址。

原理: 当一个 Sentinel 发现 master 宕机时,将 master 标记为主观下线 s_down ,并通知到其它 Sentinel, 其它 Sentinel 向 master 发送请求检查 master 的状态,超过设定的哨兵数认定 master 宕机时,将 master 标记为客观下线 o_down

此时,所有 Sentinel 中通过投票选举出其中一个 Sentinel 去处理故障转移。执行处理的 Sentinel 从服务器列表中挑选备选的 master。需要考虑 slave 的下面一些信息:
1,排除与 master 连接断开最久的slave;
2,按照 slave 优先级(配置中指定)来排序,取最高优先级;
3,同一优先级,则看哪个 offset 最多,即同步数据最多的作为 master;
如果都一样,那么就看哪个 slave 的 run id 最小,就取那个。

挑选好后,自动修改相关配置,向新的 master 发送 slaveof no one 指令,向其他 slave 及原来的 master 发送 slaveof 新 masterIP 端口的指令。

三,数据丢失问题

**哨兵 + redis主从的部署架构,是不能保证数据零丢失的,只能保证redis集群的高可用性。**Redis哨兵主备切换有两种情况会造成数据丢失:

异步复制导致的数据丢失

master -> slave 的复制是异步的,所以可能有部分数据还没复制到 slave,master 就宕机了,此时这些部分数据就丢失了

解决:

修改redis主从复制的延迟参数,比如可以修改为10秒,那么如果主发现数据同步到备所需时间超过了十秒,就会拒绝客户端的数据写入,以保证主数据能够同步到备。设定时长的目的,主要是确保这个数据丢失范围是可控的,即便丢失也是在一个短时间范围内。

当主拒绝接收新的写入请求,就需要客户端从处理,对新的数据进行缓存或者写入频率降级,比如本地数据缓存,或者把数据缓存到kafka中,再慢慢消费到redis中等等。

脑裂导致的数据丢失

脑裂,也就是说,某个 master 所在机器突然脱离了正常的网络,跟其他slave机器不能连接,但是实际上 master 还运行着这个时候,集群中就会出现两个 master。 此时虽然某个slave被切换成了 master,但是可能 client 还没来得及切换到新的 master,还继续写向旧 master 数据可能就会丢失。因此 master 在恢复的时候,会被作为一个 slave 挂到新的master上,自己的数据会被清空,从新的 master 复制数据。

解决:

还是一样设置 slave 数据落后于 master 数据时间的时长,比如设置为10秒,那么只要 master 发现 slaver 落后了,就会停止 client 写入数据。于是真正丢失的数据也只有10秒钟。

四,Redis主从架构 + 哨兵机制搭建

哨兵至少部署三个实例。启动的顺序,主机–>从机–>哨兵。哨兵命令行语句:info 可以查看当前服务器信息。

这里不介绍Redis主从架构的搭建。下面介绍配置哨兵:

设置哨兵监听的主服务器信息, sentinel_number 表示参与投票的哨兵数量

sentinel monitor master_name master_host master_port sentinel_number

设置判定服务器宕机时长,该设置控制是否进行主从切换

sentinel down-after-milliseconds master_name million_seconds

设置故障切换的最大超时时长

sentinel failover-timeout master_name million_seconds

设置主从切换后,同时进行数据同步的slave数量,数值越大,要求网络资源越高,数值越小,同步时间越长

sentinel parallel-syncs master_name sync_slave_number

以下新建3个哨兵配置文件,除了端口不一致,其它配置一样。端口分表为26379、26380 和 26381:

port 26379										
daemonize no									
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2		
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1				
sentinel failover-timeout mymaster 18000	
port 26380										
daemonize no									
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2		
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1				
sentinel failover-timeout mymaster 18000
port 26381									
daemonize no									
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2		
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1				
sentinel failover-timeout mymaster 18000
0

评论区