zoukankan      html  css  js  c++  java
  • Docker Compose搭建Redis一主二从三哨兵高可用集群



    相关内容原文地址: 博客园:陈大帅哥Ray:[Docker Compose搭建Redis一主二从三哨兵高可用集群](https://www.cnblogs.com/ruiyeclub/p/12355073.html)

    一、Docker Compose搭建Redis主从服务器

    主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性。

    从性能方面,redis复制功能增加了读的性能,理论上说,每增加一倍的服务器,整个系统的读能力就增加一倍。

    选择好路径,通过命令创建文件夹redis,然后进入文件夹创建docker-compose.yml,或者在本地创建,然后通过Xftp工具上传至服务器。docker-compose.yml写入如下内容。

    version: '2'
    services:
      master:
        image: redis    ## 镜像
        container_name: redis-master    ##容器别名
        command: redis-server --requirepass 123456    ##redis密码
        ports:
        - "6379:6379"    ##暴露端口
        networks:
        - sentinel-master
      slave1:
        image: redis
        container_name: redis-slave-1
        ports:
        - "6380:6379"
        command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456 
        depends_on:
        - master
        networks:
        - sentinel-master
      slave2:
        image: redis
        container_name: redis-slave-2
        ports:
        - "6381:6379"
        command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
        depends_on:
        - master
        networks:
        - sentinel-master
    

    启动redis集群:

    docker-compose up -d
    

    docker ps查看运行的实例,这里我们需要用到主节点的ip地址,注意不是电脑的ip,是节点的ip地址。

    docker inspect 主节点容器id。
    在这里插入图片描述
    哨兵需要绑定这个主节点的ip。

    二、哨兵sentinel模式搭建

    当主服务器宕机后,需要手动把一台服务器切换成主服务器,这里需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。
    哨兵是redis高可用的解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器以及这些主服务器属下的所有从服务器,它能够在被监视的主服务器下线时,自动将该主服务器属下的某个优先的从服务器升级为新的主服务器,由这个主服务器代替已下线的主服务器继续处理命令请求。

    哨兵的功能:

    1. 监控:哨兵会不断地监控检测主节点和从节点是否运作正常。
    2. 自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并 让其他从节点改为复制新的主节点。
    3. 通知:哨兵可以将故障转移的结果发送给客户端。
    4. 配置提供者:客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。

    创建sentinel文件夹,然后同样编写docker-compose.yml文件:

    version: '2'
    services:
      sentinel1:
        image: redis       ## 镜像
        container_name: redis-sentinel-1
        ports:
        - "26379:26379"
        command: redis-sentinel /usr/local/etc/redis/sentinel.conf
        volumes:
        - "./sentinel.conf:/usr/local/etc/redis/sentinel.conf"
      sentinel2:
        image: redis                ## 镜像
        container_name: redis-sentinel-2
        ports:
        - "26380:26379"           
        command: redis-sentinel /usr/local/etc/redis/sentinel.conf
        volumes:
        - "./sentinel2.conf:/usr/local/etc/redis/sentinel.conf"
      sentinel3:
        image: redis                ## 镜像
        container_name: redis-sentinel-3
        ports:
        - "26381:26379"           
        command: redis-sentinel /usr/local/etc/redis/sentinel.conf
        volumes:
        - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
    networks:
      default:
        external:
          name: redis_sentinel-master
    

    继续在此目录编写文件,编写sentinel.conf文件:

    port 26379
    dir /tmp
    #172.18.0.3填写自己的主节点ip
    sentinel monitor mymaster 172.18.0.3 6379 2
    sentinel auth-pass mymaster 123456 
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 10000  
    sentinel deny-scripts-reconfig yes
    

    第三行表示Redis监控一个叫做mymaster的运行在172.18.0.3:6379的master,投票达到2则表示master以及挂掉了。
    第四行设置主节点的密码。
    第五行表示在一段时间范围内sentinel向master发送的心跳PING没有回复则认为master不可用了。
    第六行的parallel-syncs表示设置在故障转移之后,同时可以重新配置使用新master的slave的数量。数字越低,更多的时间将会用故障转移完成,但是如果slaves配置为服务旧数据,你可能不希望所有的slave同时重新同步master。因为主从复制对于slave是非阻塞的,当停止从master加载批量数据时有一个片刻延迟。通过设置选项为1,确信每次只有一个slave是不可到达的。
    第七行表示10秒内mymaster还没活过来,则认为master宕机了。

    创建好文件后,复制好三份。

    cp sentinel.conf sentinel1.conf
    cp sentinel.conf sentinel2.conf
    cp sentinel.conf sentinel3.conf
    

    启动redis哨兵模式:

    docker-compose up -d
    

    三、故障转移测试

    哨兵可以自动转移故障,也就是当主节点宕机的时候,它们能通过选举制度,在从节点中选出一个节点来代替主节点。

    故障测试:
    进入容器,再进入redis客户端,再输入密码,然后使用info查看节点信息。
    在这里插入图片描述
    可以看到这个节点的身份是master也就是主节点,然后有两个连接着的从节点。
    在这里插入图片描述
    停掉这个节点,看看哨兵是否可以实现故障转移。

    docker sotp <containerdId>
    

    然后选择其中一个从节点进入客户端,输入info查看信息。
    在这里插入图片描述
    发现其中一台从节点已经变成主节点了,而且连接的从节点,也变成了一个。

  • 相关阅读:
    Golang哲学思想
    Outlook与Hotmail的设置
    Android 经验: 5555 端口会被 adb 误认为 emulator
    QT程序探测所需DLL,静态连接和打包
    VS编译的QT程序发布时产生的AppCrash问题
    新语言和旧语言
    MMU和TLB
    FMX的综合评价
    Windows核心编程学习九:利用内核对象进行线程同步
    QListWidget特别简单,但有两种添加item的方式
  • 原文地址:https://www.cnblogs.com/aixing/p/13327194.html
Copyright © 2011-2022 走看看