Redis要点总结二

发布于:2025-03-01 ⋅ 阅读:(91) ⋅ 点赞:(0)

大纲

一.Redis的数据结构

二.Redis的数据库原理

三.Redis的复制原理

四.Redis的哨兵原理

五.Redis的集群原理

四.Redis的哨兵原理

1.Redis Sentinel和高可用

2.Redis如何保存更多的数据

3.一个普通Redis服务器的初始化过程

4.一个Sentinel服务器的初始化过程

5.Sentinel如何向主从服务器获取信息和发送信息

6.Sentinel如何检测主客观下线并实现故障转移

7.Sentinel客户端的基本实现原理

8.Sentinel的基本实现原理(哨兵机制的基本流程)

9.关于Sentinel的一些问题

1.Redis Sentinel和高可用

Redis哨兵主要负责三个任务:监控、选主、通知。

Redis Sentinel是一个分布式架构,其中包含若干个Sentinel节点和若干个Redis数据节点。每个Sentinel节点会对Redis数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对不可达节点做下线标识。如果被标识的是主节点,它还会和其他Sentinel节点进行协商。当大多数节点都认为主节点不可达时,这些Sentinel节点会选举出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化实时通知给Redis的应用方,整个过程完全是自动的,实现了真正的高可用。

Redis Sentinel比Redis主从复制模式只是多了若干个Sentinel节点,Redis Sentinel并没有针对Redis节点做特殊处理。

2.Redis如何保存更多的数据

(1)纵向扩展

升级单个Redis实例的配置,简单直接,如果不要求持久化,这是不错的选择,会受硬件成本限制。但如果需要持久化,则面临内存实例过大时,fork子进程阻塞的问题。

(2)横向扩展

使用Redis集群进行数据切分,可扩展性好。

切片集群的方案有:

基于客户端的分区:ShardedJedis

基于代理的Codis、Twemproxy

基于服务端的Redis Cluster

3.一个普通Redis服务器的初始化过程

步骤一:初始化服务器状态结构

步骤二:载入服务器配置

步骤三:初始化服务器数据结构

步骤四:还原数据库状态

步骤五:执行事件循环

4.一个Sentinel服务器的初始化过程

步骤一:初始化服务器状态结构。Redis Sentinel本质上还是一个运行在特殊模式下的Redis服务器。

步骤二:使用Sentinel专用代码。比如普通Redis使用6379端口,Sentinel服务器使用26379端口。

步骤三:初始化Sentinel状态。SentinelState代表着一个Sentinel服务器。

步骤四:初始化Sentinel状态的masters属性。masters属性是一个字典,字典的键是被监视主服务器的名字,字典的值是被监视主服务器对应的SentinelRedisInstance结构。masters字典的初始化是根据被载入的Sentinel配置文件来进行的。

步骤五:创建连向主服务器的网络连接。网络连接包括命令连接和订阅连接,命令连接专门用于向主服务器发送命令和接收命令回复,此时Sentinel服务器成为主服务器的客户端。订阅连接专门用于订阅主服务器的__sentinel__:hello频道。每个SentinelRedisInstance结构代表一个被Sentinel监控的Redis服务器实例,可以是主服务器、从服务器或者另一个Sentinel服务器。

//SentinelState(Sentinel服务器)
dict *masters; //保存了所有被这个Sentinel服务器监视的主服务器,masters字典的值指向一个SentinelRedisInstance

//SentinelRedisInstance
char *name, *runid;
int quorum; //判断自己下线需要的票数
int flags; //实例类型(主、从、Sentinel)
dict *sentinels; //主的Sentinel名单

5.Sentinel如何向主从服务器获取信息和发送信息

(1)Sentinel获取主服务器信息

Sentinel默认会以每10秒一次的频率,通过命令连接向被监视的主服务器发送info命令。通过分析info命令的回复,来获取主服务器的当前信息(服务器ID、角色、所有从服务器信息)。这样,Sentinel就无须用户提供从服务器的地址信息,也可以自动发现从服务器。

主服务器返回的从服务器信息,会被用于更新对应的主服务器SentinelRedisInstance的slaves字典。这个字典记录了主服务器下所有从服务器的名单,字典的值是从服务器对应的SentinelRedisInstance。

主服务器实例结构的flags属性的值为SRI_MASTER,从服务器实例结构的flags属性的值为SRI_SLAVE。主服务器实例结构的name值是用户使用Sentinel配置文件设置的,而从的name值则是自动设置的ip:port。

(2)Sentinel获取从服务器信息

当Sentinel发现主服务器有新的从服务器出现时,Sentinel会:

第一.创建新的从服务器相应的实例结构

第二.创建连接到新的从服务器的命令连接和订阅连接,然后订阅从服务器的__sentinel__:hello频道

Sentinel默认会以每10秒一次的频率通过命令连接向从服务器发送info命令,通过分析info命令的回复来对从服务器的实例结构进行更新。

(3)Sentinel向主服务器和从服务器发送频道信息

Sentinel默认会以每2秒一次的频率,通过命令连接向所有被监视的主从服务器发送广播命令,即向这些主从服务器的__sentinel__:hello频道发送Sentinel本身的信息和主服务器的信息。

(4)Sentinel接收来自主和从服务器的频道信息

当Sentinel与一个主服务器或者从服务器建立起订阅连接后,Sentinel就会通过订阅连接向服务器发送订阅命令。这样每个Sentinel都会订阅每一个服务器__sentinel__:hello频道,Sentinel对每个服务器的__sentinel__:hello频道的订阅会一直持续到Sentinel与该服务器的连接断开为止。

对于每个与Sentinel连接的服务器,Sentinel既通过命令连接向服务器的__sentinel__:hello频道发送信息,又通过订阅连接从服务器的__sentinel__:hello频道接收信息。

对于监视同一个服务器的多个Sentinel来说,一个Sentinel向__sentinel__:hello频道发送的消息,会被其他Sentinel接收到,其他Sentinel接收到这些信息可以更新对发送信息的Sentinel的认知,也可以更新对被监视服务器的认知。

(5)Sentinel通过订阅频道更新的认知

这些认知包括:更新sentinels字典和创建连向新Sentinel的命令连接。

在Sentinel为主服务器创建的实例结构SentinelRedisInstance中的sentinels字典保存了监视该主服务器的所有Sentinel。当Sentinel通过频道信息发现一个新的Sentinel时,它不仅会为新Sentinel在sentinels字典中创建相应的实例结构,还会创建一个连向新Sentinel的命令连接,而新Sentinel也同样会创建连向这个Sentinel的命令连接。使用命令连接相连的各个Sentinel可以通过向其他Sentinel发送命令请求来实现主观下线检测和客观下线检测。

因为一个Sentinel可以通过分析接收到的某服务器的频道信息来获知其他Sentinel的存在,并通过向某服务器发送频道信息来让其他Sentinel知道自己的存在,所以用户在使用Sentinel的时候并不需要提供各个Sentinel的地址信息,监视同一个主服务器的多个Sentinel可以自动发现对方。

6.Sentinel如何检测主客观下线并实现故障转移

(1)检测主观下线状态

Sentinel默认会以每秒一次的频率向所有与它创建了命令连接的实例(主服务器、从服务器、其他Sentinel服务器)发送ping命令,通过实例返回的ping命令回复来判断实例是否在线(将服务器实例结构的flag设为SRI_S_DOWN)。

(2)检查客观下线状态

当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他Sentinel进行询问。

当Sentinel从其他Sentinel那里接收到足够数量的已下线判断后,Sentinel就会将这个主服务器判断为客观下线(将主服务器实例结构的flag设为SRI_O_DOWN),并对主服务器执行故障转移。

客观下线的判断条件:认为主服务器已进入下线状态的Sentinel数量,超过Sentinel配置中设置的quorum参数的值。

(3)选举领头Sentinel

当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作。

(4)领头Sentinel执行故障转移

步骤一:在已下线主服务器下的所有从服务器里挑选出一个从服务器,并将其转换为新的主服务器。从服务器被选中的规则是:先看优先级配置最高的,再看复制偏移量最大的,最后看服务器运行ID最小的。

步骤二:让已下线主服务器下的所有从服务器改为复制新的主服务器。

步骤三:将旧的主服务器设为从服务器。

简单来说就是:首先选新主,然后所有从复制新主,最后监视旧主设旧主为新主的从。

(5)Redis Sentinel架构具有的功能

功能一.监控功能,Sentinel节点会定期检测Redis数据节点、其余Sentinel节点是否可达。

功能二.通知功能,Sentinel会将故障转移的结果通知给应用方。

功能三.故障转移功能&#x


网站公告

今日签到

点亮在社区的每一天
去签到