zoukankan      html  css  js  c++  java
  • docker安装redis主从以及哨兵

    docker安装redis主从以及哨兵

    本文使用docker在四台机器上部署一主二从三哨兵的Redis主从结构。

    服务器配置

    • 192.168.102.128 主节点 centos7.5
    • 192.168.102.130 从节点 centos7.5
    • 192.168.102.131 从节点 centos7.5
    • 192.168.102.132 哨兵节点(3个容器) centos7.5

    Redis版本

    Redis版本 6.0.1

    Docker安装

    在Centos 7.5上安装docker环境

    主从部署

    创建配置文件存放目录

    $ mkdir -p /usr/redis/data
    

    下载redis.conf文件

    $ cd /usr/redis
    $ wget http://download.redis.io/redis-stable/redis.conf
    

    主节点redis.conf配置

    修改redis.conf文件中以下几个配置项:

    • bind 0.0.0.0 或者直接注释掉bind配置
    • protected-mode no(为yes时docker容器无法正常启动)
    • requirepass 123456 (redis不需要密码时该项可以不设置)
    • logfile "redis.log" (redis的日志文件)
    • masterauth 123456 (主节点的密码,必须和主节点保持一致,最好所有的redis节点密码一致,否则故障切换时会由于密码错误导致主从不同步)

    slave节点redis.conf配置

    在master中的redis.conf基础上,添加一下配置:

    • replicaof 192.168.102.128 6379

    说明:ip地址为主节点的ip地址,端口号为主节点的redis的端口号

    获取redis镜像

    docker pull redis

    创建容器

    主节点和从节点都使用下面的命令创建容器:

    $ docker run -d --privileged=true -p 6379:6379 
    -v /usr/redis/redis.conf:/etc/redis/redis.conf 
    -v /usr/redis/data:/data 
    --name redis redis 
    redis-server /etc/redis/redis.conf 
    --appendonly yes
    

    查看redis状态

    容器创建完成后,使用下面的命令查看redis的状态:

    $ docker exec -it redis
    $ redis-cli
    $ auth 123456(redis密码)
    $ info Replication(查询redis的状态)
    

    主节点的状态为:

    role:master
    connected_slaves:2
    slave0:ip=192.168.102.131,port=6379,state=online,offset=467463,lag=0
    slave1:ip=192.168.102.130,port=6379,state=online,offset=467323,lag=1
    

    从节点的状态为:

    role:slave
    master_host:192.168.102.128
    master_port:6379
    master_link_status:up
    

    说明:

    如果master_link_status的值为down,查看一下主节点的redis.conf中是否设置了需要redis密码(requirepass),以及从节点的redis.conf中的masterauth的值是否与主节点的密码一致,不一致需要改为一致后再重新启动容器,直到master_link_status的值为up为止。

    验证主从是否同步

    主节点进入redis后,使用set命令赋值:

    $ set temp 123

    子节点进入redis后,使用set命令,会出现以下提示:

    (error) READONLY You can't write against a read only replica.

    使用get命令获取temp的值:

    $ get temp

    能够正确获取到temp的值表示主从搭建成功。

    哨兵Sentinel部署

    哨兵节点建议为奇数个,防止出现脑裂情况,本文在同一台服务器上创建三个不同端口号的容器作为三个哨兵节点,端口分别为26379、36379、46379.

    创建配置文件存放目录

    $ mkdir -p /usr/sentinel1/data
    $ mkdir -p /usr/sentinel2/data
    $ mkdir -p /usr/sentinel3/data
    

    下载sentinel.conf

    $ cd /usr/sentinel1/
    $ wget http://download.redis.io/redis-stable/sentinel.conf
    

    修改sentinel.conf配置

    • logfile "sentinel.log" 日志文件名称
    • sentinel monitor mymaster 192.168.102.128 6379 2 对应主节点的ip地址和端口号
    • sentinel auth-pass mymaster 123456 主节点的redis密码

    说明:

    sentinel monitor mymaster 192.168.102.128 6379 2 中mymaster为自由命名的,可以进行修改,但是在修改时,需要将配置文件中所有名字为mymaster的都改为新的名字。

    最后的2表示,有2个sentinel节点认为主节点失效时,开始进行选举新的主节点。

    使用相同的方式在另外两个目录下(sentinel2和sentinel3)分别下载sentinel.conf文件并且进行修改。

    创建哨兵容器

    端口号为26379的哨兵:

    $ docker run -it --restart=unless-stopped  --privileged=true 
    --name sentinel-1 -p 26379:26379 
    -v /usr/sentinel1/data:/data 
    -v /usr/sentinel1/sentinel.conf:/usr/local/etc/redis/sentinel.conf 
    -d redis 
    redis-sentinel /usr/local/etc/redis/sentinel.conf 
    

    端口号为36379的哨兵:

    $ docker run -it --restart=unless-stopped  --privileged=true 
    --name sentinel-2 -p 36379:26379 
    -v /usr/sentinel2/data:/data 
    -v /usr/sentinel2/sentinel.conf:/usr/local/etc/redis/sentinel.conf 
    -d redis 
    redis-sentinel /usr/local/etc/redis/sentinel.conf 
    

    端口号为46376的哨兵:

    $ docker run -it --restart=unless-stopped  --privileged=true 
    --name sentinel-3 -p 46379:26379 
    -v /usr/sentinel3/data:/data 
    -v /usr/sentinel3/sentinel.conf:/usr/local/etc/redis/sentinel.conf 
    -d redis 
    redis-sentinel /usr/local/etc/redis/sentinel.conf 
    

    查看哨兵监控情况

    选择一个哨兵容器进入,查看状态:

    $ docker exec -it sentinel-1 bash
    $ redis-cli -p 26379
    $ sentinel master mymaster
    

    使用上述命令,可以查看哨兵的监控情况:

    1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.102.128"
    5) "port"
    6) "6379"
    ...
    31) "num-slaves"
    32) "2"
    33) "num-other-sentinels"
    34) "2"
    35) "quorum"
    36) "2"
    37) "failover-timeout"
    38) "180000"
    

    说明:

    • name:mymaster 与配置文件中保持一致,表示监控名称
    • ip:192.168.102.128 主节点的ip地址
    • port:6379 主节点的redis端口号
    • num-slaves: 2 表示当前主从结构中有2个从节点
    • num-other-sentinels: 2 表示还存在其他2个哨兵节点
    • quorum: 2 表示当2个哨兵认为主节点失效时,开始选举新的主节点
    • failover-timeout: 180000 表示故障切换超时时间,单位是秒。

    在容器中,还可以通过查看哨兵日志的方式查看主从节点情况:

    $ cat /tmp/sentinel.log
    

    当哨兵节点启动以后,可以在日志中查看到如下所示的日志内容:

    May 2020 17:25:54.404 # +monitor master mymaster 192.168.102.128 6379 quorum 2
    
    May 2020 17:25:54.408 * +slave slave 192.168.102.130:6379 192.168.102.130 6379 @ mymaster 192.168.102.128 6379
    
    May 2020 17:25:54.410 * +slave slave 192.168.102.131:6379 192.168.102.131 6379 @ mymaster 192.168.102.128 6379
    

    如果未在日志文件中看到上述内容,表示哨兵启动失败,需要查找原因重新启动。

    当主节点异常需要切换主节点时,可以在日志文件中看到如下内容:

    May 2020 17:29:17.886 # +sdown master mymaster 192.168.102.128 6379
    May 2020 17:29:18.184 # +new-epoch 1
    May 2020 17:29:18.186 # +vote-for-leader 69207f833243fb96b3e09d5c0d05d0dbce46d31a 1
    May 2020 17:29:18.941 # +odown master mymaster 192.168.102.128 6379 #quorum 3/2
    May 2020 17:29:18.941 # Next failover delay: I will not start a failover before Tue May 12 17:35:18 2020
    May 2020 17:29:19.331 # +config-update-from sentinel 69207f833243fb96b3e09d5c0d05d0dbce46d31a 172.17.0.4 26379 @ mymaster 192.168.102.128 6379
    May 2020 17:29:19.331 # +switch-master mymaster 192.168.102.128 6379 192.168.102.130 6379
    May 2020 17:29:19.333 * +slave slave 192.168.102.131:6379 192.168.102.131 6379 @ mymaster 192.168.102.130 6379
    May 2020 17:29:19.333 * +slave slave 192.168.102.128:6379 192.168.102.128 6379 @ mymaster 192.168.102.130 6379
    

    上述日志表示128主节点失效,重新选举130节点为主节点,128和131节点作为130的从节点,此时,使用redis的info命令就可以看到130变成了主节点,128和131变成了从节点。

    说明:

    在配置主节点的redis.conf时,一定要配置上masterauth属性,否则在将主节点切换成从节点之后,由于无法验证密码会导致主从不同步的情况。

    springboot集成sentinel

    pom文件引入redis-stater

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-redis</artifactId>
    </dependency>
    

    修改application.yml配置文件

    redis:
        timeout: PT60S
        database: 0
        password: 123456
        sentinel:
          master: mymaster
          nodes: 192.168.102.132:26379,192.168.102.132:36379,192.168.102.132:46379
    

    使用

    java类中注入RedisTemplate即可正常使用

  • 相关阅读:
    postgres配置主从流复制
    laravel5如何创建service provider和facade
    postgres中几个复杂的sql语句
    Laravel5设计json api时候的一些道道
    技术晨读_2015_4_13
    PHP 中的Closure
    l5如何通过路由走api版本回退查找设置
    postgres中的中文分词zhparser
    postgres中的视图和物化视图
    问题:Virtual Box如何复制镜像
  • 原文地址:https://www.cnblogs.com/ybyn/p/13690826.html
Copyright © 2011-2022 走看看