Docker Redis主从哨兵配置笔记

358 阅读5分钟

写在前面

本文基于 redis:6.2 版本 做说明,在单机环境中搭建 1主 2从 3哨兵 环境,仅此作为学习过程中的记录,并未投入正式使用;

环境准备

  • 服务器环境:CentOS 7,且已成功安装 docker 环境

  • redis 镜像准备

    • 拉取指定版本的 redis 镜像:docker pull redis:6.2
  • redis 配置文件

    docker 拉取的镜像默认不带配置文件,所以需要去单独下载 redis 配置文件

    下载地址:

    下载成功后,解压,找到 redis.confsentinel.conf 备用

  • 宿主机目录结构

    目录文件结构.png

Redis 主从配置

本例主从使用端口说明:

主机:6400

从机1:6401

从机2:6402

配置文件准备

  • 下载 redis 的 tar 包,获取 redis 配置文件

    wget https://download.redis.io/releases/redis-6.2.0.tar.gz
    
  • 解压,得到 redis.conf 配置文件

    tar -zxvf redis-6.2.0.tar.gz
    
  • 为容器复制 redis 启动配置文件

    cp redis-6.2.0/redis.conf /docker_projects/redis_docker/config/redis/redis_6400.conf
    cp redis-6.2.0/redis.conf /docker_projects/redis_docker/config/redis/redis_6401.conf
    cp redis-6.2.0/redis.conf /docker_projects/redis_docker/config/redis/redis_6402.conf
    

启动主机

  • 修改主机配置

    port 6400
    bind 0.0.0.0
    daemonize no
    pidfile /var/run/redis_6400.pid
    logfile "/var/log/redis/redis.log"
    dbfilename dump_6400.rdb
    dir /data
    
  • 启动主机容器,挂载指定目录和文件,并指定配置文件启动

    docker run -itd --name=redis_6400 -p 6400:6400 \
    -v /docker_projects/redis_docker/config/redis/redis_6400.conf:/etc/redis/redis.conf \
    -v /docker_projects/redis_docker/redis/data:/data \
    -v /docker_projects/redis_docker/logs/redis/redis_6400.log:/var/log/redis/redis.log redis:6.2 \
    redis-server /etc/redis/redis.conf
    
  • 待主机容器成功启动后,查看其 IP 信息,备用

    docker inspect redis_6400
    

经查看,得到 redis 主机 IP 为:172.17.0.2

查看主机IP.png

启动从机1

  • 修改从机1配置文件

    port 6401
    bind 0.0.0.0
    daemonize no
    pidfile /var/run/redis_6401.pid
    logfile "/var/log/redis/redis.log"
    dbfilename dump_6401.rdb
    dir /data
    #新增,此处IP为 主机IP 端口为 主机端口
    replicaof 172.17.0.2 6400
    
  • 启动主机容器,挂载指定目录和文件,并指定配置文件启动

    docker run -itd --name=redis_6401 -p 6401:6401 \
    -v /docker_projects/redis_docker/config/redis/redis_6401.conf:/etc/redis/redis.conf \
    -v /docker_projects/redis_docker/redis/data:/data \
    -v /docker_projects/redis_docker/logs/redis/redis_6401.log:/var/log/redis/redis.log redis:6.2 \
    redis-server /etc/redis/redis.conf
    

启动从机2

  • 修改从机2配置文件

    port 6402
    bind 0.0.0.0
    daemonize no
    pidfile /var/run/redis_6402.pid
    logfile "/var/log/redis/redis.log"
    dbfilename dump_6402.rdb
    dir /data
    #新增,此处IP为 主机IP 端口为 主机端口
    replicaof 172.17.0.2 6400
    
  • 启动主机容器,挂载指定目录和文件,并指定配置文件启动

    docker run -itd --name=redis_6402 -p 6402:6402 \
    -v /docker_projects/redis_docker/config/redis/redis_6402.conf:/etc/redis/redis.conf \
    -v /docker_projects/redis_docker/redis/data:/data \
    -v /docker_projects/redis_docker/logs/redis/redis_6402.log:/var/log/redis/redis.log redis:6.2 \
    redis-server /etc/redis/redis.conf
    

查看容器启动情况

查看容器启动情况.png

验证主从

  • 进入主机容器

    docker exec -it redis_6400 /bin/bash
    
  • 运行 redis-cli 命令

    我们的主机容器 不是映射的默认端口 6379,而是在配置文件中指定的 6400,所以我们需要指定自己的端口 6400

    redis-cli -p 6400
    
  • 查看主从信息

    info replication
    
  • 分别进入主机、从机1、从机2 查看主从信息,如下

    主机

    主从信息-从主机查看.png

    从机1

    主从信息-从从机1查看.png

    从机2

    主从信息-从从机2查看.png

当我们看到以上信息时,表示主从环境搭建成功

验证数据同步

  • 主机写数据,从机读数据

    主机

    数据同步-主写.png

    从机1

    数据同步-从1读.png

    从机2

    数据同步-从2读.png

由此可见,主机写入数据,两个从机均可以同步数据成功

  • 从机写数据,主机读数据

    从机1

    数据同步-从1写.png

    从机2

    数据同步-从2写.png

由此可见,从机没法写入数据,报错如上图,通常情况下,从机会默认只读,这是为了保证主从数据的一致性。

某些特定情况下,如果需要从机也可以写数据,可以在配置文件 redis.conf 中修改 replica-read-only no 来实现从机写数据的目的。

另外:如果一开始没有修改配置文件设置主从,也可以在容器创建之后进行设置

  • 主机

    • 选定其中一个服务作为主机,找到其 IP 信息
  • 从机

    • 进入 从机

      docker exec -it 从机容器名称/ID /bin/bash
      
    • 使用 redis-cli 登录,并设置主从

      redis-cli -p 从机端口
      replicaof 主机IP 主机端口
      
      示例:
      redis-cli -p 6400
      replicaof 172.17.0.2 6400
      

哨兵模式配置

此处流程和主从配置差不多,就不再过多细说,各位看官且看后续

哨兵模式配置

  • 为容器复制 哨兵 配置文件

    cp redis-6.2.2/sentinel.conf /dockertest/env/config/sentinel/sentinel_26400.conf
    cp redis-6.2.2/sentinel.conf /dockertest/env/config/sentinel/sentinel_26401.conf
    cp redis-6.2.2/sentinel.conf /dockertest/env/config/sentinel/sentinel_26402.conf
    
  • 分别修改 哨兵 配置文件

    查看 redis 主机容器信息获取容器IP, 172.17.0.2

    port 26400 / 26401 / 26402
    dir /data
    logfile "/var/log/sentinel/sentinel.log"
    sentinel monitor mymaster 172.17.0.2 6400 2
    
  • 创建并以配置文件启动 哨兵 容器

    docker run -itd --name=sentinel_26400 -p 26400:26400 \
    -v /docker_projects/redis_docker/config/sentinel/sentinel_26400.conf:/etc/sentinel/sentinel.conf \
    -v /docker_projects/redis_docker/sentinel/data:/data \
    -v /docker_projects/redis_docker/logs/sentinel/sentinel_26400.log:/var/log/sentinel/sentinel.log redis:6.2 \
    redis-sentinel /etc/sentinel/sentinel.conf
    
    docker run -itd --name=sentinel_26401 -p 26401:26401 \
    -v /docker_projects/redis_docker/config/sentinel/sentinel_26401.conf:/etc/sentinel/sentinel.conf \
    -v /docker_projects/redis_docker/sentinel/data:/data \
    -v /docker_projects/redis_docker/logs/sentinel/sentinel_26401.log:/var/log/sentinel/sentinel.log redis:6.2 \
    redis-sentinel /etc/sentinel/sentinel.conf
    
    docker run -itd --name=sentinel_26402 -p 26402:26402 \
    -v /docker_projects/redis_docker/config/sentinel/sentinel_26402.conf:/etc/sentinel/sentinel.conf \
    -v /docker_projects/redis_docker/sentinel/data:/data \
    -v /docker_projects/redis_docker/logs/sentinel/sentinel_26402.log:/var/log/sentinel/sentinel.log redis:6.2 \
    redis-sentinel /etc/sentinel/sentinel.conf
    

哨兵验证

  • 分别启动 3 个 redis 主从容器,3 个 哨兵 容器

  • 进入任意 哨兵 容器

    docker exec -it sentinel_26400 /bin/bash
    docker exec -it sentinel_26401 /bin/bash
    docker exec -it sentinel_26402 /bin/bash
    
  • 查看哨兵信息

    主机

    哨兵-主机.png

    从机1

    哨兵-从机1.png

    从机2

    哨兵-从机2.png

  • 手动停止 redis 主机容器

    docker stop redis_6400
    
  • 再次查看哨兵信息

    从机1

    重选-从机1.png

    从机2

    重选-从机2.png

    再次重启之前的主机后,查看信息

    重选-主机.png

  • 重新启动 redis_6400 容器,并查看 容器信息

    可以看到以下信息,之前 reids_6400 是主机,此时 redis_6400 变成了 从机

    主从信息-重选-主机.png

至此,哨兵模式验证成功

问题说明

1. 配置文件启动时报错权限问题

通过 docker 日志查看,发现是容器目录权限问题

docker logs -f 容器名称

  • 将配置中的文件或目录进行挂载
  • 挂载前需要将宿主机上对应的挂载目录和文件进行权限赋予

2. 容器创建成功,但是不能启动

  • 查看配置文件中的 daemonize 配置,将其值 修改为 no