一文带你探究 Sentinel 的独特初始化
摘要:本系列通过作者对 Redis Sentinel 源码的理解,详细说明 Sentinel 的代码实现方式。
Redis Sentinel 是 Redis 提供的高可用模型解决方案。Sentinel 可以自动监测一个或多个 Redis 主备实例,并在主实例宕机的情况下自动实行主备倒换。本系列通过作者对 Redis Sentinel 源码的理解,详细说明 Sentinel 的代码实现方式。
Sentinel 使用 Redis 内核相同的事件驱动代码框架, 但 Sentinel 有自己独特的初始化步骤。在这篇文章里,作者会介绍 Sentinel 与 Redis 服务器不同的初始化部分。
我们可以通过 redis-sentinel <path-to-configfile> 或者 redis-server <path-to-configfile> --sentinel 这两种方式启动并运行 Sentinel 实例,这两种方式是等价的。在 Redis server.c 的 main 函数中,我们会看到 Redis 如何判断用户指定以 Sentinel 方式运行的逻辑:
其中 checkForSentinelMode 函数会监测以下两种条件:
1. 程序使用 redis-sentinel 可执行文件执行。
2. 程序参数列表中有--sentinel 标志。
以上任何一种条件成立则 Redis 会使用 Sentinel 的方式运行。
在 Redis 判断是否以 Sentinel 的方式运行以后,我们会看到如下代码段:
在 initSentinelConfig 函数中,会使用 Sentinel 特定的端口(默认为 26379)来替代 Redis 的默认端口(6379)。另外,在 Sentinel 模式下,需要禁用服务器运行保护模式。
与此同时,initSentinel 函数会做如下操作:
2.初始化 Sentinel 主状态结构,Sentinel 主状态的定义及注释如下。
其中 masters 字典指针中的每个值都对应着一个 Sentinel 检测的主实例。
在读取配置信息后,Redis 服务器主函数会调用 sentinelIsRunning 函数, 做以下几个工作:
1. 检查配置文件是否被设置,并且检查程序对配置文件是否有写权限,因为如果 Sentinel 状态改变的话,会不断将自己当前状态记录在配置文件中。
2. 如果在配置文件中指定运行 ID,Sentinel 会使用这个 ID 作为运行 ID,相反地,如果没有指定运行 ID,Sentinel 会生成一个 ID 用来作为 Sentinel 的运行 ID。
3. 对所有的 Sentinel 监测实例产生初始监测事件。
参考资料:
https://github.com/antirez/redis
https://redis.io/topics/sentinel
Redis 设计与实现第二版 黄健宏著
本文分享自华为云社区《Redis Sentinel 源码分析(1)Sentinel 的初始化》,原文作者:中间件小哥 。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/9f4aa02c3336591b51b7ffd98】。文章转载请联系作者。
评论 (3 条评论)