Redis源码分析--Sentinel(1)Sentinel服务器
2022/2/6 19:12:53
本文主要是介绍Redis源码分析--Sentinel(1)Sentinel服务器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、概述:
调用链: serverCron -> sentinelTimer -> sentinelHandleDictOfRedisInstances -> sentinelHandleRedisInstance
-
重要函数
这里只是给出表格,下面几节会具体分析
名称 功能 sentinelTimer 由serverCron中定时调用,遍历本机(sentinel)监视的所有主服务器; sentinelHandleRedisInstance 处理一个单独实例,实现了主要逻辑; sentinelReconnectInstance Monitor half之一;建立连接(cc、pc); sentinelSendPeriodicCommands Monitor half之一;对实例进行定期操作:INFO(10s), PUBLISH (2s), PING(1s) sentinelCheckSubjectivelyDown 及以下都是Acting half;本机判断一个实例是否主观下线; sentinelCheckObjectivelyDown 本机判断一个主服务器(不是实例)是否客观下线 sentinelStartFailoverIfNeeded 发送SENTINEL is-master-down,但依据状态,会执行不同功能,之后详解; sentinelFailoverStateMachine 故障转移状态机;
二、服务器如何执行Sentinel功能?:
以Sentinel模式启动的redis服务器,会在init*Config等函数中以Sentinel模式专用代码替换普通redis服务器的代码,这里不细说。在serverCron定时函数中,服务器调用sentinelTimer,后者会遍历本机(sentinel)监视的所有主服务器代表的实例(sentinelInstance)。
void sentinelTimer(void) { /* 判断是否处于Tilt模式(一种保护模式,当计算机时间发生剧烈变化时发生) */ sentinelCheckTiltCondition(); /* 处理sentinel中的所有sentinelInstance */ sentinelHandleDictOfRedisInstances(sentinel.masters); // ... }
void sentinelHandleDictOfRedisInstances(dict *instances) { dictIterator *di; dictEntry *de; sentinelRedisInstance *switch_to_promoted = NULL; /* There are a number of things we need to perform against every master. */ /* sentinelInstance,可以是master,slave或sentinel */ di = dictGetIterator(instances); while((de = dictNext(di)) != NULL) { sentinelRedisInstance *ri = dictGetVal(de); /* 处理当前实例 */ sentinelHandleRedisInstance(ri); if (ri->flags & SRI_MASTER) { /* 如果实例是master,递归处理它的slave和sentinels */ sentinelHandleDictOfRedisInstances(ri->slaves); sentinelHandleDictOfRedisInstances(ri->sentinels); if (ri->failover_state == SENTINEL_FAILOVER_STATE_UPDATE_CONFIG) { switch_to_promoted = ri; } } } if (switch_to_promoted) sentinelFailoverSwitchToPromotedSlave(switch_to_promoted); dictReleaseIterator(di); }
- L12:sentinelHandleRedisInstance用来处理所有实例,它分为负责建立连接(cc、pc)和处理周期任务(INFO、PUBLISH、PING)的Monitor half,和负责处理逻辑的Acting half,sentinel部分的第三篇文章将介绍Monitor half,第四篇介绍Acting half。
- L15~16:主服务器的实例对象保存了两个字典,分别保存从服务器和所有监视它的Sentinel。所以本机遍历处理主服务器时,同样会递归处理这些从服务器和Sentinel。
这篇关于Redis源码分析--Sentinel(1)Sentinel服务器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27阿里云Redis学习入门指南
- 2024-12-27阿里云Redis入门详解:轻松搭建与管理
- 2024-12-27阿里云Redis学习:新手入门指南
- 2024-12-24Redis资料:新手入门快速指南
- 2024-12-24Redis资料:新手入门教程与实践指南
- 2024-12-24Redis资料:新手入门教程与实践指南
- 2024-12-07Redis高并发入门详解
- 2024-12-07Redis缓存入门:新手必读指南
- 2024-12-07Redis缓存入门:新手必读教程
- 2024-12-07Redis入门:新手必备的简单教程