`

Redis Sentinel(哨兵):集群解决方案

 
阅读更多
Redis 哨兵的服务框架
哨兵也是 Redis 服务器,只是它与我们平时提到的 Redis 服务器职能不同,哨兵负责监视普通的 Redis 服务器,提高一个服务器集群的健壮和可靠性。哨兵和普通的 Redis 服务器所用的是同一套服务器框架,这包括:网络框架,底层数据结构,订阅发布机制等。

从主函数开始,来看看哨兵服务器是怎么诞生,它在什么时候和普通的 Redis 服务器分道扬镳:

int main(int argc, char **argv) {
    // 随机种子,一般rand() 产生随机数的函数会用到
    srand(time(NULL)^getpid());
    gettimeofday(&tv,NULL);
    dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());
    // 通过命令行参数确认是否启动哨兵模式
    server.sentinel_mode = checkForSentinelMode(argc,argv);
    // 初始化服务器配置,主要是填充redisServer 结构体中的各种参数
    initServerConfig();
    // 将服务器配置为哨兵模式,与普通的redis 服务器不同
    /* We need to init sentinel right now as parsing the configuration file
    * in sentinel mode will have the effect of populating the sentinel
    * data structures with master nodes to monitor. */
    if (server.sentinel_mode) {
        // initSentinelConfig() 只指定哨兵服务器的端口
        initSentinelConfig();
        initSentinel();
    }
    ......
    // 普通redis 服务器模式
    if (!server.sentinel_mode) {
    ......
    // 哨兵服务器模式
    } else {
    // 检测哨兵模式是否正常配置
    sentinelIsRunning();
    }
    ......
    // 进入事件循环
    aeMain(server.el);
    // 去除事件循环系统
    aeDeleteEventLoop(server.el);
    return 0;
}


在上面,通过判断命令行参数来判断 Redis 服务器是否启用哨兵模式,会设置服务器参数结构体中的redisServer.sentinel_mode 的值。在上面的主函数调用了一个很关键的函数:initSentinel(),它完成了哨兵服务器特有的初始化程序,包括填充哨兵服务器特有的命令表,struct sentinel 结构体。

// 哨兵服务器特有的初始化程序
/* Perform the Sentinel mode initialization. */
void initSentinel(void) {
    int j;
    // 如果 redis 服务器是哨兵模式,则清空命令列表。哨兵会有一套专门的命令列表,
    // 这与普通的 redis 服务器不同
    /* Remove usual Redis commands from the command table, then just add
    * the SENTINEL command. */
    dictEmpty(server.commands,NULL);
    // 将sentinelcmds 命令列表中的命令填充到server.commands
    for (j = 0; j < sizeof(sentinelcmds)/sizeof(sentinelcmds[0]); j++) {
        int retval;
        struct redisCommand *cmd = sentinelcmds+j;
        retval = dictAdd(server.commands, sdsnew(cmd->name), cmd);
        redisAssert(retval == DICT_OK);
    }
    /* Initialize various data structures. */
    // sentinel.current_epoch 用以指定版本
    sentinel.current_epoch = 0;
    // 哨兵监视的 redis 服务器哈希表
    sentinel.masters = dictCreate(&instancesDictType,NULL);
    // sentinel.tilt 用以处理系统时间出错的情况
    sentinel.tilt = 0;
    // TILT 模式开始的时间
    sentinel.tilt_start_time = 0;
    // sentinel.previous_time 是哨兵服务器上一次执行定时程序的时间
    sentinel.previous_time = mstime();
    // 哨兵服务器当前正在执行的脚本数量
    sentinel.running_scripts = 0;
    // 脚本队列
    sentinel.scripts_queue = listCreate();
}


我们查看 struct redisCommand sentinelcmds 这个全局变量就会发现,它里面只有七个命令,难道哨兵仅仅提供了这种服务?为了能让哨兵自动管理普通的 Redis 服务器,哨兵还添加了一个定时程序,我们从 serverCron() 定时程序中就会发现,哨兵的定时程序被调用执行了,这里包含了哨兵的主要工作:

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
    ......
    run_with_period(100) {
         if (server.sentinel_mode) sentinelTimer();
    }
}


定时程序
定时程序是哨兵服务器的重要角色,所做的工作主要包括:监视普通的 Redis 服务器(包括主机和从机),执行故障修复,执行脚本命令。

// 哨兵定时程序
void sentinelTimer(void) {
    // 检测是否需要启动sentinel TILT 模式
    sentinelCheckTiltCondition();
    // 对哈希表中的每个服务器实例执行调度任务,这个函数很重要
    sentinelHandleDictOfRedisInstances(sentinel.masters);
    // 执行脚本命令,如果正在执行脚本的数量没有超出限定
    sentinelRunPendingScripts();
    // 清理已经执行完脚本的进程,如果执行成功从脚本队列中删除脚本
    sentinelCollectTerminatedScripts();
    // 停止执行时间超时的脚本进程
    sentinelKillTimedoutScripts();
    // 为了防止多个哨兵同时选举,故意错开定时程序执行的时间。通过调整周期可以
    // 调整哨兵定时程序执行的时间,即默认值REDIS_DEFAULT_HZ 加上一个任意值
    server.hz = REDIS_DEFAULT_HZ + rand() % REDIS_DEFAULT_HZ;
}


哨兵与 Redis 服务器的互联
每个哨兵都有一个 struct sentinel 结构体,里面维护了多个主机的连接,与每个主机连接的相关信息都存储在 struct sentinelRedisInstance。透过这两个结构体,很快就可以描绘出,一个哨兵服务器所维护的机器的信息:

typedef struct sentinelRedisInstance {
    ......
    /* Master specific. */
    // 其他正在监视此主机的哨兵
    dict *sentinels; /* Other sentinels monitoring the same master. */
    // 次主机的从机列表
    dict *slaves; /* Slaves for this master instance. */
    ......
    // 如果是从机,master 则指向它的主机
    struct sentinelRedisInstance *master; /* Master instance if it's slave. */
    ......
} sentinelRedisInstance;


哨兵服务器所能描述的 Redis 信息:




参考:http://p.primeton.com/articles/559e431d608f8f5438000059

      http://wiki.jikexueyuan.com/project/redis/guard-mechanism.html
  
分享到:
评论

相关推荐

    第四十六章:Redis sentinel哨兵集群1

    【Redis Sentinel哨兵集群详解】 Redis Sentinel是一种高可用性解决方案,它是Redis官方提供的一种分布式系统,专门用于监控Redis集群中的Master主服务器状态。在Master出现故障时,Sentinel能够自动进行故障转移,...

    redis集群:redis-sentinel(哨兵机制)集群

    Redis Sentinel(哨兵)是Redis集群中的一个重要组件,它提供了高可用性解决方案,确保当主节点发生故障时,能够自动将从节点提升为主节点,从而维持服务的连续性。哨兵系统通过监控、通知和自动故障转移来实现这一...

    redis-sentinel哨兵集群搭建并整合springboot

    Redis Sentinel 是 Redis 集群的一种高可用性解决方案,它负责监控、故障检测以及主从节点的自动故障转移。在本文中,我们将讨论如何搭建一个 Redis Sentinel 集群,并将其与 SpringBoot 应用程序进行整合。首先,...

    redis 哨兵模式集群文档

    Redis哨兵(Sentinel)是一种用于实现高可用性的解决方案。它通过一组哨兵进程来监控主服务器和从服务器是否工作正常,在主服务器出现问题时自动进行故障转移,并在故障转移后通知客户端继续使用。此外,哨兵还可以...

    docker-compose redis主从哨兵 redis多节点高可用 redis集群高可用

    这里我们将详细探讨如何利用Docker Compose部署Redis的主从哨兵配置和集群高可用性解决方案。 首先,Docker Compose是一个强大的工具,可以让我们通过YAML文件定义和运行多容器的Docker应用。在这个场景下,我们...

    windows redis 主从集群实例加哨兵集群

    Redis Sentinel是一个高可用性解决方案,用于监控、警告以及自动故障转移。哨兵系统会持续检查主从集群的状态,当检测到主节点失效时,会自动将从节点提升为主节点,并通知其他客户端更新连接信息。这样可以极大地...

    redis的哨兵加集群安装文档

    哨兵模式是Redis提供的高可用解决方案之一,主要负责监控Redis实例的状态、在主节点发生故障时进行故障转移操作(自动将宕机主服务器的数据转移到新的主服务器上)、协助客户端重新配置连接信息等任务。通过哨兵模式...

    Redis Sentinel(哨兵)部署.pdf

    Redis Sentinel是Redis的高可用性解决方案,当主节点发生故障时,可以自动进行故障转移。部署Redis Sentinel主要涉及以下几个关键点: 1. Redis Sentinel的作用与优点 Redis Sentinel的主要功能是监控Redis主从...

    Redis哨兵模式配置文件

    Redis Sentinel,或者称为哨兵模式,是Redis集群架构中的一个重要组成部分,主要用于实现高可用性(HA)。在单机模式下,Redis服务器一旦宕机,将会导致服务不可用,哨兵模式就是为了克服这个问题而设计的。它监控...

    Centos7.6部署redis6.2.8哨兵集群资源包

    接下来,我们按照以下步骤在CentOS7.6上部署Redis 6.2.8哨兵集群: 1. **环境准备**:确保系统已安装最新版本的GCC编译器和cmake,因为Redis源码编译需要这些工具。同时,还需要安装jemalloc内存分配器,以优化...

    redis哨兵模式搭建.rar

    Redis Sentinel是Redis的一个高可用性解决方案,用于监控、故障检测以及自动故障恢复主从集群。在Redis中, Sentinel系统可以确保即使在主服务器宕机的情况下,数据仍然能够被正确访问,通过将流量重新路由到备用...

    spring+springmvc+mybatis+redisSentinel

    本项目"spring+springmvc+mybatis+redisSentinel"结合了Spring、SpringMVC、MyBatis以及Redis Sentinel,构建了一个高可用的Web应用程序,同时利用了Redis作为缓存系统提升性能。以下将详细讲解这些技术及其整合过程...

    redis主从配置+sentinel哨兵模式

    Sentinel 是 Redis 的高可用解决方案之一,它可以自动监控主节点的状态,在主节点出现故障时自动完成从节点到主节点的角色转换,从而保障应用的持续可用性。 ##### 配置 Sentinel 实例 1. **配置 `sentinel.conf` ...

    基于phpredis封装的redis-sentinel客户端redis-sentinel.zip

    redis-sentinel 就像他的名字一样,他是一个哨兵,监控 master 状态,如果超过规定时间没有响应,则自动进行主从切换,期间会有一段时间(决定于具体的配置参数)redis集群无法提供服务 。原理类似 mysql 的 MHA。...

    Redis哨兵模式(Redis-Sentinel)实例配置.rar

    Redis Sentinel,也称为Redis哨兵模式,是Redis官方提供的一个高可用性解决方案,用于监控、故障检测以及在主从架构中自动完成故障转移。在这个实例配置中,我们将深入理解哨兵系统的工作原理,并学习如何设置和操作...

    redis-sentinel-集群.7z

    Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。 提醒(Notification): 当被监控的某个...

    spring集成redis单节点、集群、哨兵配置

    本文将深入探讨如何在Spring项目中集成Redis的单节点、集群和哨兵模式。 首先,让我们来看**单节点配置**。在Spring中集成Redis单节点,我们需要在Spring的配置文件中定义RedisConnectionFactory。这通常通过...

    redis哨兵跟集群搭建.zip

    Redis Sentinel和集群是提高Redis数据库高可用性和容错性的两种重要解决方案。让我们分别来深入了解这两个概念及其搭建过程。 首先,Redis Sentinel(哨兵)系统是一个监控和故障转移的工具,它可以监控一个或多个...

    redis哨兵集群安装文件,配置文件

    Redis Sentinel集群是Redis高可用性解决方案的关键组成部分,它提供了监控、故障检测以及主从节点自动故障转移的功能。在这个压缩包中,包含的可能是Redis的安装文件和Sentinel的配置文件,这些都是搭建和管理Redis ...

Global site tag (gtag.js) - Google Analytics