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

  • 相关阅读:
    0129 System类 Math类 Arrays类 大数据运算
    0127 基本类型包装类
    'telnet' 不是内部或外部命令,也不是可运行的程序 解决方案
    删除时报org.springframework.dao.DataIntegrityViolationException
    mapper自动识别驼峰配置 spring MVC
    spring Security如何debug源码
    公司tomcat项目启动
    java.util.ConcurrentModificationException: null 异常解决
    @Transactional 学习
    mangoDB初探
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4984501.html
Copyright © 2011-2022 走看看