写点什么

如何保证高可用?搞定三种集群模式,Redis 还不是手到擒来

用户头像
极客good
关注
发布于: 刚刚


① slave 启动成功之后,连接 master,发送 sync 命令;


② master 接收 sync 命令之后,开始执行 BGSAVE 命令生成 RDB 文件,并使用缓冲区记录此后执行的所有写命令。


③ master 执行完 BGSAVE 后,向所有的 slave 发送快照文件。并在发送期间记录被执行的写命令。


④ slave 接收到快照文件后载入收到的快照。


⑤ master 快照发送完毕后,开始向 slave 发送缓冲区的写命令。


⑥ salve 完成对快照文件的加载,开始接受命令请求。并执行主数据库缓冲区的写命令。(从数据库初始化完成。)


⑦ master 每执行一个写命令就像 slave 发送相同的写命令。slave 接受并执行写命令。(从数据库初始化完成后的操作)


⑧?出现断开重连后,2.8 之后的版本会将断线期间的命令传给重数据库,增量复制。⑨ 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。Redis 的策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。


4、 主从复制优点:


①支持主从复制,master 会自动将数据同步到 slave,可以进行读写分离;②为了分载 Master 的读操作压力,Slave 服务器可以为客户端提供只读操作的服务,写服务仍然必须由 Master 来完成;③Slave 同样可以接受其它 Slaves 的连接和同步请求,这样可以有效的分载 Master 的同步压力;④Master Server 是以非阻塞的方式为 Slaves 提供服务。所以在 Master-Slave 同步期间,客户端仍然可以提交查询或修改请求;⑤Slave Server 同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis 则返回同步之前的数据;


5、主从复制缺点:


①Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复(也就是要人工介入);②主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,降低了系统的可用性(需要手动将一台 slave 切换成 master);③如果多个 Slave 断线了,需要重启的时候,尽量不要在同一时间段进行重启。因为只要 Slave 启动,就会发送 sync 请求和主机全量同步,当多个 Slave 重启的时候,可能会导致 Master IO 剧增从而宕机。Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂;


####二、哨兵(Sentinel)1、作用


主从复制当 master 出现故障时,需要手动切换 master。哨兵模式就是为了解决手动切换这个问题。Redis2.8 中提供了哨兵工具,来实现自动化的系统监控和故障恢复。哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行多个 Redis 实例。


① 通过发送命令,让 Redis 服务器返回运行状态,包括 master 和 slave。


② 当哨兵(Sentinel)检测到 master 宕机,会自动将 slave 切换成 master。然后通过发布订阅模式通知其他的 slave。让其他 slave 切换主机。



2、故障自动切换


假设主服务器宕机,哨兵 1 先检测到这个结果,系统并不会马上进行 failover 过程,仅仅是哨兵 1 主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行 failover 操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。?


3、工作机制??


① 每个 Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的 Master 主服务器,Slave 从服务器以及其他 Sentinel(哨兵)进程发送一个 PING 命令。② 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)③ 如果一个 Master 主服务器被标记为主观下线(SDOWN),则正在监视这个 Master 主服务器的所有 Sentinel(哨兵)进程要以每秒一次的频率确认 Master 主服务器的确进入了主观下线状态④ 当有足够数量的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认 Master 主服务器进入了主观下线状态(SDOWN), 则 Master 主服务器会被标记为客观下线(ODOWN)⑤ 在一般情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有 Master 主服务器、Slave 从服务器发送 INFO 命令。⑥ 当 Master 主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master 主服务器的所有 Slave 从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。⑦ 若没有足够数量的 Sentinel(哨兵)进程同意 Master 主服务器下线, Master 主服务器的客观下线状态就会被移除。若 Master 主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master 主服务器的主观下线状态就会被移除。


4、为什么要那么多哨兵组成网络


当只有 1 个 Sentinel 的时候,如果这个 Sentinel 挂掉了就不能实现故障的自动切换。在 Sent


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


inel 网络中,只要还有 1 个?Sentinel 活着,就可以实现故障的自动切换。??


5、Sentinel(哨兵)优点


① 哨兵模式是基于主从的,所有主从的优点,哨兵模式都具有。② 主从可以自动切换,系统更健壮,高可用性。(可以看做自动版的主从复制)


6、Sentinel(哨兵)缺点


因为只有 1 个 master,较难支持在线扩容,在集群容量达到上限时,在线扩容很复杂。


####三、cluster 集群模式(Redis 官方推荐)


Redis 的哨兵模式基本实现了读写分离+高可用。


但是只有 1 个 master 的话,存储会有性能的瓶颈。如果要支持更大数据量的缓存,那就横向扩容更多的 master 节点即可。假如假如 1 个 master 节点可以支持存放 32GB 内存。30 台左右差不多就是 1 个 T 的内存啦。

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
如何保证高可用?搞定三种集群模式,Redis还不是手到擒来