docker pull redis
docker network create redis-net
docker run -d --name redis-master --network redis-net redis
docker run -d --name redis-slave1 --network redis-net redis redis-server --slaveof redis-master 6379
docker run -d --name redis-slave2 --network redis-net redis redis-server --slaveof redis-master 6379
docker run -d --name redis-slave3 --network redis-net redis redis-server --slaveof redis-master 6379
需要将config文件挂载到主系统上便于更改:
-rwxr-xr-x 1 root root 490 May 26 22:18 sentinel1.conf
-rwxr-xr-x 1 root root 490 May 26 22:17 sentinel2.conf
-rwxr-xr-x 1 root root 490 May 26 22:17 sentinel3.conf
# 哨兵监听的IP和端口
bind 0.0.0.0
port 26379
# 哨兵监控的主节点
sentinel monitor <master-name> <master-ip> <master-port> <quorum>
- <master-name>: 主节点的名称,你可以自定义一个标识符。
- 易错点:
<master-ip>: 主节点的 IP 地址(如果在一个机器里创建多个容器,ip为进入容器使用ifconfig查看的ip,如果在不同机器上,则为机器的ip地址)
进入容器使用ifconfig查看的ip步骤:
docker exec -it redis-master bash
apt-get update
apt-get install -y net-tools
ifconfig
<master-port>: 主节点的端口号。 <quorum>: 哨兵达成一致所需的最少数量,通常设置为主节点数量的一半加一。
<milliseconds>: 故障检测和故障转移的时间设置,以毫秒为单位。 <password>:
如果有设置密码认证,需要提供相应的密码。
# 主节点故障后的故障转移配置
sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel failover-timeout <master-name> <milliseconds>
sentinel parallel-syncs <master-name> <num>
# 哨兵通信的认证密码(如果有)
sentinel auth-pass <master-name> <password>
# 哨兵的日志文件路径
logfile "/var/log/redis/sentinel.log"
# 日志级别
loglevel notice
# 哨兵进程保持存活的最低数量
protected-mode no
# 是否在哨兵模式下运行
sentinel yes
# 哨兵监听的IP和端口
bind 0.0.0.0
port 26379
#哨兵监控的主节点
sentinel monitor redis-master 172.19.0.2 6379 2
#主节点故障后的故障转移配置
sentinel down-after-milliseconds redis-master 3000
sentinel failover-timeout redis-master 18000
sentinel parallel-syncs redis-master 1
docker run -d --name redis-sentinel1 --network redis-net -v /path/to/sentinel.conf:/path/to/sentinel.conf redis redis-sentinel /path/to/sentinel.conf
我的创建实例
docker run -d --name redis-sentinel1 --network redis-net -v /home/wanglei/02_dockerFile/sentinel1.conf:/usr/local/
etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf`
参数解释
docker run: 运行容器的命令。
-d: 后台运行容器。
--name redis-sentinel1: 指定容器的名称为 redis-sentinel1。
--network redis-net: 将容器连接到名为 redis-net 的网络。
-v /home/wanglei/02_dockerFile/sentinel1.conf:/usr/local/etc/redis/sentinel.conf: 将主机上的 sentinel1.conf 文件映射到容器内的 /usr/local/etc/redis/sentinel.conf 路径。这样可以将配置文件传递给容器使用。
redis: 使用的 Redis 镜像。
redis-sentinel: 启动容器时执行的命令。
/usr/local/etc/redis/sentinel.conf: 指定配置文件的路径。
容器将在后台运行,并将 sentinel1.conf 配置文件映射到容器内部的指定路径。此命令中的 /usr/local/etc/redis/sentinel.conf 是容器内 Redis Sentinel 的配置文件路径。
我的三个创建实例
docker run -d --name redis-sentinel1 --network redis-net -v /home/wanglei/02_dockerFile/sentinel1.conf:/usr/local/
etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf
docker run -d --name redis-sentinel2 --network redis-net -v /home/wanglei/02_dockerFile/sentinel2.conf:/usr/local/
etc/redis/sentinel.conf redis redis-sentinel /usr/local/etc/redis/sentinel.conf
dd'd
redis-sen 1 root mem REG 252,1 1328225 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (path dev=0,108)
redis-sen 1 root mem REG 252,1 1328268 /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (path dev=0,108)
redis-sen 1 root mem REG 252,1 1327502 /lib/x86_64-linux-gnu/libdl-2.31.so (path dev=0,108)
redis-sen 1 root mem REG 252,1 1327515 /lib/x86_64-linux-gnu/libm-2.31.so (path dev=0,108)
redis-sen 1 root mem REG 252,1 1327482 /lib/x86_64-linux-gnu/ld-2.31.so (path dev=0,108)
bash 13 root cwd DIR 252,1 4096 1322154 /data
bash 13 root mem REG 252,1 1323303 /bin/bash (path dev=0,108)
bash 13 root mem REG 252,1 1327526 /lib/x86_64-linux-gnu/libnss_files-2.31.so (path dev=0,108)
............
docker ps
docker logs 容器名称 #查看日志发现错误
docker logs redis-sentinel3
正常监视主节点和从节点
+monitor master redis-master 172.19.0.2 6379 quorum 2
+slave slave 172.19.0.3:6379 172.19.0.3 6379 @ redis-master 172.19.0.2 6379
+slave slave 172.19.0.4:6379 172.19.0.4 6379 @ redis-master 172.19.0.2 6379
+slave slave 172.19.0.5:6379 172.19.0.5 6379 @ redis-master 172.19.0.2 6379
停止主节点
docker stop redis-master
成功进行故障自动转移
1:X 26 May 2023 15:21:44.018 # +sdown master redis-master 172.19.0.2 6379
主观下线
1:X 26 May 2023 15:21:44.171 # +new-epoch 1
每当主从切换发生时,哨兵会引入一个新的纪元来标记切换事件。
纪元的目的是在集群中确保唯一的事件序列,以便进行故障切换和领导者选举。
1:X 26 May 2023 15:21:44.173 # +vote-for-leader 799810385543eafc5eee5c813bad53ac6b8f6db9 1
投票
1:X 26 May 2023 15:21:45.139 # +odown master redis-master 172.19.0.2 6379 #quorum 3/2
主观下线
1:X 26 May 2023 15:21:45.139 # Next failover delay: I will not start a failover before Fri May 26 15:22:20 2023
1:X 26 May 2023 15:21:45.294 # +config-update-from sentinel 799810385543eafc5eee5c813bad53ac6b8f6db9 172.19.0.8 26379 @ redis-master 172.19.0.2 6379
配置转移
1:X 26 May 2023 15:21:45.294 # +switch-master redis-master 172.19.0.2 6379 172.19.0.5 6379
转换主节点
1:X 26 May 2023 15:21:45.294 * +slave slave 172.19.0.3:6379 172.19.0.3 6379 @ redis-master 172.19.0.5 6379
1:X 26 May 2023 15:21:45.294 * +slave slave 172.19.0.4:6379 172.19.0.4 6379 @ redis-master 172.19.0.5 6379
1:X 26 May 2023 15:21:45.294 * +slave slave 172.19.0.2:6379 172.19.0.2 6379 @ redis-master 172.19.0.5 6379