zoukankan      html  css  js  c++  java
  • 部署Redis主-从

    Redis主-从部署实践

    0. 前言

      这篇文章简要介绍Redis的主从部署,实现了一主二从,使用两个哨兵监控,以实现简单的HA,其中从库作为备机。

    1. 部署

      这里有三台服务器,其中239主机上的Redis作为主库,其余两个作为从库。这里涉及到了认证,所以当这里在主库和从库都使用了requirepass和masterauth,因为当主库宕机后,哨兵将其中一个从库提升为主库的时候会要求认证,这里简单起见,配置文件使用了同一配置和密码。

      239主库涉及的配置:

    requirepass messagequeue
    masterauth messagequeue

      从库涉及相关配置:

    slaveof 172.16.17.239 6379
    
    masterauth messagequeue
    requirepass messagequeue

      两个哨兵的配置:

    sentinel monitor  gateway 172.16.17.239 6379 2
    sentinel auth-pass gateway messagequeue

      下图为最终的部署图。

      

      最后部署完后可以通过redis-cli连接哨兵查看。

      如下图所示:可以看到主库的ip和端口,从机数量以及哨兵的数量

      

    2. 哨兵的详细配置说明:

    复制代码
    #端口号
    port 26379
    
    
    # dir <working-directory>
    dir /tmp
    
    # 监控主数据库
    sentinel monitor gateway 172.16.17.239 6379 2
    
    #认证密码
    sentinel auth-pass gateway messagequeue
    
    #发送PING间隔,大于1秒则按1秒间隔,小于1秒则按配置的时间间隔
    sentinel down-after-milliseconds gateway 30000
    
    # 当进行灾备时同时进行重新配置从机的个数
    # 当从机用于查询时,用来保证灾备时一定量的从机可以继续服务。
    sentinel parallel-syncs gateway 1
    
    #   1.自上次尝试灾备后,再次进行灾备的时间
    #   2.从机根据哨兵,从一个错误的主机强制去复制一个正确主机的所需时间,即灾备超时时间。
    #   3.取消灾备的时间,即SLAVEOF NO ONE发送到从机,而从机没有应答,超时。
    #   4.所有从机配置指向主机的最大时间(灾备总时间)
    # 3分钟
    sentinel failover-timeout gateway 180000
    
    
    
    # 脚本最大运行时间为60秒,当脚本终止码为1时则表示失败重新再次执行(默认最多10次),为2时表成功
    # 通知脚本,用以通知管理员(通过SMS,Email等)
    # 该脚本传入两个参数,第一个是事件类型,第二个是事件描述
    # sentinel notification-script mymaster /var/redis/notify.sh
    
    # 客户端重新配置脚本(脚本应该为可重入)
    # 用于主库变更时执行一些特定任务,如通知客户端主库变更。
    # sentinel client-reconfig-script <master-name> <script-path>
    # 下面参数会传递给脚本
    # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
    #
    # <state> 永远为 "failover"
    # <role> 是"leader" 或者 "observer"
    # from-ip/from-port为旧数据库地址
    # to-ip/to-port 为变更后主库地址
    # sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
    复制代码

    3. 哨兵应用

      哨兵提供了一些方法,以供在灾备切换主库后查询主库的信息。

      1. 如上配置文件,可以使用脚本方式来通知。

      2. 可以通过连接哨兵使用 SENTINEL master <master_name>来查询(其中master_name为上述哨兵配置文件sentinel monitor后面的gateway)。

        如下局部代码(采用hiredis库,连接后要使用AUTH命令认证方可操作):

    复制代码
     1     const char *pCommand = "SENTINEL master %s";
     2     redisReply *pReply = (redisReply*)redisCommand(pRedisContext->pContext, pCommand, pMasterName);
     3 
     4     if (NULL != pReply)
     5     {
     6         if (REDIS_REPLY_ARRAY == pReply->type && pReply->elements >= 5)
     7         {
     8             nMasterIpLen = REDIS_MIN(20, pReply->element[3]->len);
     9             memcpy(pMasterIP, pReply->element[3]->str, nMasterIpLen);
    10             pMasterIP[nMasterIpLen] = '';
    11             *pMasterPort = atoi(pReply->element[5]->str);
    12             nRet = REDIS_SUCCESS;
    13         }
    14         freeReplyObject(pReply);
    15     }
    复制代码

    4. 总结

       如上图所示的部署主要用于公司一个项目,实现在简单的消息队列,这里不采用其他开源消息队列(如activemq,zeromq,rabbitmq等)有一些其他的因素在。

     

     

     

    分类: Redis

  • 相关阅读:
    HTTP断点续传 规格严格
    Java Shutdown 规格严格
    linux 命令源码 规格严格
    JTable调整列宽 规格严格
    linux 多CPU 规格严格
    Hello can not find git path 规格严格
    Kill 规格严格
    拜拜牛人 规格严格
    Swing 规格严格
    Debugging hangs in JVM (on AIX but methodology applicable to other platforms) 规格严格
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4984501.html
Copyright © 2011-2022 走看看