【Redis】三种集模式(主从、哨兵、集)+如何保证数据⼀致
⽂章⽬录
前⾔
Redis有三种集模式:
第⼀个就是主从模式(经典⽤来存储数据)
offset命令第⼆种哨兵模式(监控主从服务器,保证⾼可⽤)
第三种是Cluster集模式
这三种模式都如何保证节点间的数据⼀致性呢?
⼀、主从集模式
1、第⼀次连线时
1. 当向⼀个节点输⼊slaveof 命令时,他会变成某个节点的从服务器,之后从服务器向主服务器发送PSYNC ? -1命令(SYNC是⽼版
的同步命令,只⽀持全量同步,现在已经舍弃),开始同步请求。
2. 收到SYNC命令的主服务器执⾏BGSAVE命令, 在后台⽣成⼀个RDB⽂件, 并使⽤⼀个缓冲区(注意,这个缓冲区不是复制积压缓
冲区)记录从现在开始执⾏的所有写命令。
3. 当主服务器的BGSAVE命令执⾏完毕时, 主服务器会将RDB⽂件发送给从服务器, 从服务器接收并载⼊这个RDB⽂件, 将⾃⼰的数
据库状态更新⾄主服务器刚开始执⾏BGSAVE时的数据库状态。
4. 主服务器将记录在缓冲区⾥⾯的所有写命令发送给从服务器, 从服务器执⾏这些写命令, 将⾃⼰的数据库状态更新⾄主服务器数据库
当前所处的状态。
2、从服务器重连时
需要⽤到三个东西:
1. 偏移量
2. 复制积压缓冲区
3. 主服务器运⾏ID(补充⼀下,其实主从服务器都有⾃⼰的ID,只不过在这⾥我们只说主服务器ID)
另外,我们所说的复制积压缓冲的概念仅仅是;增量同步时才有的概念。
当从服务器重新连上主服务器时, 从服务器会通过PSYNC+主机ID(40个随机的16进制字符)+偏移量offset 命令将⾃⼰的复制偏移量offset发送给主服务器,:
1. ⾸先,主服务器会对⽐从服务器发过来的ID是否与⾃⼰的ID⼀致,如果不⼀致那么说明从服务器断线之前复制的主服务器并不是当前
连接的这个主服务器, 主服务器将对从服务器执⾏完整重同步操作。
2. 如果⼀致,主服务器会根据这个复制偏移量来决定对从服务器执⾏何种同步操作。
3. 如果offset偏移量之后的数据(也即是偏移量offset+1开始的数据)仍然存在于复制积压缓冲区⾥⾯, 那么主服务器将对从服务器执
⾏部分重同步操作。主服务器向从服务器发送+C0NTINUE回复, 表⽰数据同步将以部分重同步模式来进⾏。接着主服务器会将复制积压缓冲区偏移量之后的所有数据都发送给从服务器。从服务器只要接收这些缺失数据, 就可以回到与主服务器⼀致的状态。
4. 如果,偏移量之后的数据已经不存在于复制积压缓冲区(可能是由于时间过长,缓冲区毕竟就1M的⼤⼩), 那么主服务器将对从服
务器执⾏完整重同步操作。
流程图
主从模式的优缺点
优点:
1. ⼀个Master可以同步多个Slaves
2. Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压⼒。因此我们可以将Redis的Replication架
构视为图结构
3. Master Server是以⾮阻塞的⽅式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求
4. Slave Server同样是以⾮阻塞的⽅式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据
5. 为了分载Master的读操作压⼒,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统
的伸缩性还是得到了很⼤的提⾼
6. Master可以将数据保存操作交给Slaves完成,从⽽避免了在Master中要有独⽴的进程来完成此操作
7. ⽀持主从复制,主机会⾃动将数据同步到从机,可以进⾏读写分离
缺点:
1. Redis不具备⾃动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者⼿动切换前端的IP才能恢
2. 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引⼊数据不⼀致的问题,降低了系统的可⽤性
3. Redis的主从复制采⽤全量复制,复制过程中主机会fork出⼀个⼦进程对内存做⼀份快照,并将⼦进程的内存快照保存为⽂件发送给
从机,这⼀过程需要确保主机有⾜够多的空余内存。若快照⽂件较⼤,对集的服务能⼒会产⽣较⼤的影响,⽽且复制过程是在从机新加⼊集或者从机和主机⽹络断开重连时都会进⾏,也就是⽹络波动都会造成主机和从机间的⼀次全量的数据复制,这对实际的系统运营造成了不⼩的⿇烦
4. Redis较难⽀持在线扩容,在集容量达到上限时在线扩容会变得很复杂。为避免这⼀问题,运维⼈员在系统上线时必须确保有⾜够的
空间,这对资源造成了很⼤的浪费
⼆、哨兵模式(Sentinel)
Sentinel (哨岗、 哨兵) 是Redis的⾼可⽤性(high availabiUty)解决⽅案
哨兵是 redis 集机构中⾮常重要的⼀个组件,哨兵集会对redis集实时三项监控,来监控节点的可⽤性。
1、当⼀个Sentinel启动时,它需要执⾏以下步骤:
1. 初始化服务器。
2. 将普通Redis服务器使⽤的代码替换成Sentinel专⽤代码。
3. 初始化Sentinel状态。
4. 根据给定的配置⽂件, 初始化Sentinel的监视主服务器列表。
5. 创建连向主服务器的⽹络连接
主要有以下功能:
集监控:负责监控 redis master 和 slave 进程是否正常⼯作。
消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
故障转移:如果 master node 挂掉了,会⾃动转移到 slave node 上。
配置中⼼:如果故障转移发⽣了,通知 client 客户端新的 master 地址。
哨兵⽤于实现 redis 集的⾼可⽤,本⾝也是分布式的,作为⼀个哨兵集去运⾏。
故障转移时,判断⼀个 master node 是否宕机了,需要⼤部分的哨兵都同意才⾏,涉及到了分布式选举的问题。
即使部分哨兵节点挂掉了,哨兵集还是能正常⼯作的,因为如果⼀个作为⾼可⽤机制重要组成部分的故障转移系统本⾝是单点的,那就很坑爹了。
2、哨兵对节点的三项监控
(1)info命令:
每隔 10 秒,每个哨兵节点都会向主、从 Redis 数据节点发送 info 命令,⽬的是获取新的拓扑结构信息。Redis 拓扑结构信息包括了:
1. 本节点⾓⾊:主或从
2. 主从节点的地址
3. 端⼝信息。
这样,哨兵节点就能从 info 命令中⾃动获取到从节点信息,因此那些后续才加⼊的从节点信息不需要显式配置就能⾃动感知。
(2)向 sentinel:hello 频道同步信息
每隔 2 秒,每个哨兵节点将会向 Redis 数据节点的 sentinel:hello 频道同步⾃⾝得到的主节点信息以及当前哨兵节点的信息。
这个命令的⽬的是:每⼀个主从服务器中,都有⼀块区域是⽤来进⾏ 同步__sentinel__:hello 的,不同的哨兵节点通过服务器上的这个频道,来发现新的哨兵节点,也就是说,这个频道是⽤来给哨兵间通信⽤的。
其他哨兵节点也订阅了这个频道,这个操作可以交换哨兵节点之间关于主节点以及哨兵节点的信息。
发现新的哨兵节点:如果有新的哨兵节点加⼊,此时保存下来这个新哨兵节点的信息,后续与该哨兵节点建⽴连接。
交换主节点的状态信息,作为后续客观判断主节点下线的依据。
(3)向数据节点做⼼跳探测
每隔 1 秒,每个哨兵节点向主、从数据节点以及其他 Sentinel 节点发送 Ping 命令做⼼跳探测,这个⼼跳探测是后续主观判断数据节点下线的依据。
主观下线
上⾯三个监控任务中的第三个探测⼼跳任务,如果在配置的 down-after-milliseconds 之后没有收到有效回复,那么就认为该数据节
点“主观下线(sdown)”。
为什么称为“主观下线”?因为在⼀个分布式系统中,有多个机器在⼀起联动⼯作,⽹络可能出现各种状况,仅凭⼀个节点的判断还不⾜以认为⼀个数据节点下线了,这就需要后⾯的“客观下线”。
客观下线
当⼀个哨兵节点认为主节点主观下线时,该哨兵节点需要通过”sentinel is-master-down-by addr”命令向其他哨兵节点咨询该主节点是否下线了,如果有超过半数的哨兵节点都回答了下线,此时认为主节点“客观下线”。
3、选举领头Sentinel
结合上⼀⼩结,当⼀个主服务器被判断为客观下线时, 监视这个下线主服务器的各个Sentinel会进⾏协商,选举出⼀个领头Sentinel,并由领头Sentinel对下线主服务器执⾏故障转移操作。
4、故障转移
在选举产⽣出领头Sentinel之后, 领头Sentinel将对已下线的主服务器执⾏故障转移操作,包含以下三个步骤:
1. (选个新头⼉)在已下线主服务器属下的所有从服务器⾥⾯, 挑选出⼀个从服务器, 并将其转换为主服务器。
2. (⼩弟认新⼤哥)让已下线主服务器属下的所有从服务器改为复制新的主服务器。
3. (原来的⽼⼤当⼩弟)将已下线主服务器设置为新的主服务器的从服务器, 当这个旧的主服务器重新上线时, 它就会成为新的主服务
器的从服务器。
接下来会详细介绍上述三点:
(1)新的主服务器选举规则
领头Sentinel会将已下线主服务器的所有从服务器保存到⼀个列表⾥⾯, 然后按照以下规则, ⼀项⼀项对列表进⾏过滤:
1. 删除列表中所有处于下线或者断线状态的从服务器, 这可以保证列表中剩余的从服务器都是正常在线的。
2. 删除列表中所有最近五秒內没有回复过领头Sentinel的ZNFO命令的从服务器,这可以保证列表中剩余的从服务器都是最近成功进⾏
过通信的。
3. 删除所有与已下线主服务器连接断开超过⼀定时间的服务器,可以保证列表中剩余的从服务器都没有过早地与主服务器断开连接 换句
话说,列表中剩余的从服务器保存的数据都是⽐较新的。
4. 之后, 领头Sentinel将根据从服务器的优先级, 对列表中剩余的从服务器进⾏排序,并选出其中优先级最⾼的从服务器。
5. 如果有多个具有相同最⾼优先级的从服务器, 那么领头Sentinel将按照从服务器的复制偏移量, 对具有相同最⾼优先级的所有从服务
器进⾏排序, 并选出其中偏移量最⼤的从服务器(复制偏移量最⼤的从服务器就是保存着最新数据的从服务器) 。
6. 最后, 如果有多个优先级最⾼、 复制偏移量最⼤的从服务器, 那么领头Sentinel将按照运⾏ID对这些从服务器进⾏排序, 并选出其
中运⾏ID最⼩的从服务器。
(2)选举之后,让其他从服务器服从主服务器
当新的主服务器出现之后, 领头Sentinel下⼀步要做的就是, 让已下线主服务器属下的所有从服务器去复制新的主服务器, 这⼀动作可以通过向从服务器发送SLAVEOF来实现。
(3)将旧的主服务器变为从服务器

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。