写在前面
本文基于 redis:6.2 版本 做说明,在单机环境中搭建
1主 2从 3哨兵环境,仅此作为学习过程中的记录,并未投入正式使用;
环境准备
-
服务器环境:CentOS 7,且已成功安装 docker 环境
-
redis 镜像准备
- 拉取指定版本的 redis 镜像:
docker pull redis:6.2
- 拉取指定版本的 redis 镜像:
-
redis 配置文件
docker 拉取的镜像默认不带配置文件,所以需要去单独下载 redis 配置文件
下载地址:
下载成功后,解压,找到
redis.conf和sentinel.conf备用- GitHub:github.com/redis/redis…
- Redis 官网:download.redis.io/releases/re…
-
宿主机目录结构
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
启动从机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
查看容器启动情况
验证主从
-
进入主机容器
docker exec -it redis_6400 /bin/bash -
运行 redis-cli 命令
我们的主机容器 不是映射的默认端口 6379,而是在配置文件中指定的 6400,所以我们需要指定自己的端口 6400
redis-cli -p 6400 -
查看主从信息
info replication -
分别进入主机、从机1、从机2 查看主从信息,如下
主机
从机1
从机2
当我们看到以上信息时,表示主从环境搭建成功
验证数据同步
-
主机写数据,从机读数据
主机
从机1
从机2
由此可见,主机写入数据,两个从机均可以同步数据成功
-
从机写数据,主机读数据
从机1
从机2
由此可见,从机没法写入数据,报错如上图,通常情况下,从机会默认只读,这是为了保证主从数据的一致性。
某些特定情况下,如果需要从机也可以写数据,可以在配置文件 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 -
查看哨兵信息
主机
从机1
从机2
-
手动停止 redis 主机容器
docker stop redis_6400 -
再次查看哨兵信息
从机1
从机2
再次重启之前的主机后,查看信息
-
重新启动 redis_6400 容器,并查看 容器信息
可以看到以下信息,之前 reids_6400 是主机,此时 redis_6400 变成了 从机
至此,哨兵模式验证成功
问题说明
1. 配置文件启动时报错权限问题
通过 docker 日志查看,发现是容器目录权限问题
docker logs -f 容器名称
- 将配置中的文件或目录进行挂载
- 挂载前需要将宿主机上对应的挂载目录和文件进行权限赋予
2. 容器创建成功,但是不能启动
- 查看配置文件中的
daemonize配置,将其值 修改为no