环境 : 3台虚拟机----192.168.137.129,192.168.137.130,192.168.137.131
将192.168.137.129作为master,剩余两台机器作为slave节点。
思路: 先搭建主从模式,再拓展为sentinel模式
准备: 开放3台机器的6379、26379端口。其中6379是redis端口,26379是sentinel之间的通讯端口。
例:开放6379端口
vim /etc/sysconfig/iptables
# 加入如下代码
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
- 保存退出后重启防火墙
service iptables restart
一、在master节点192.168.137.129上安装redis容器并启动
1.拉取镜像
docker pull redis
2.创建 redis 目录文件
mkdir -p /opt/redis/data
mkdir -p /opt/redis/conf
3.编写redis.yml
cd /opt/redis
vi redis.yml
version: '3'
services:
redis:
image: redis
container_name: redis_rh
restart: always
ports:
- "6379:6379"
volumes:
- /opt/redis/data:/data
- /opt/redis/conf/redis.conf:/etc/redis/redis.conf
command:
redis-server /etc/redis/redis.conf --appendonly yes
4.编辑redis配置文件
daemonize no
databases 16
protected-mode no
daemonize 不能设置为yes,否则docker不能启动
#protected-mode 默认yes,开启保护模式,限制为本地访问
5.创建redis容器并启动
docker-compose -f /opt/redis/redis.yml up
docker-compose -f /opt/redis/redis.yml start
二、在两个slave节点上创建redis容器并启动
两个slave节点192.168.137.130、192.168.137.131.
1.拉取镜像
docker pull redis
2.创建 redis 目录文件
mkdir -p /opt/redis/data
mkdir -p /opt/redis/conf
3.编写redis.yml
cd /opt/redis
vi redis.yml
version: '3'
services:
sentinel2:
image: redis
container_name: redis_rh
restart: always
ports:
- 6379:6379
command: redis-server /etc/redis/redis.conf --slaveof 192.168.137.129 6379
volumes:
- /opt/redis/data:/data
- /opt/redis/conf/redis.conf:/etc/redis/redis.conf
4.编辑redis配置文件
daemonize no
databases 16
protected-mode no
5.创建redis容器并启动
docker-compose -f /opt/redis/redis.yml up
docker-compose -f /opt/redis/redis.yml start
6.检查主从模式是否搭建成功
在master节点192.168.137.129进入容器,查看主从信息。
docker exec -it de2 bash
redis-cli -p 6379
info replication
role:master,角色为master
slave0、slavel两个从节点信息。
当看到以上信息时,说明主从模式搭建成功。
三、搭建sentinel模式
1.在master节点192.168.137.129安装redis-sentinel
- 编写sentinel.conf文件
cd /opt/redis/conf
vi sentinel.conf
port 26379
dir /tmp
#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2个
sentinel monitor mymaster 192.168.137.129 6379 2
#30秒ping不通主节点的信息,主观认为master宕机
sentinel down-after-milliseconds mymaster 30000
#故障转移后重新主从复制,1表示串行,>1并行
sentinel parallel-syncs mymaster 1
#故障转移开始,三分钟内没有完成,则认为转移失败
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
sentinel auth-pass mymaster 123456
- 编排redis-sentinel.yml文件
mkdir -p /opt/redis/sentinel/
cd /opt/redis/sentinel
vim redis-sentinel.yml
version: '3'
services:
sentinel:
image: redis
container_name: redis-sentinel-1
restart: always
ports:
- 26379:26379
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- /opt/redis/conf/sentinel.conf:/etc/redis/sentinel.conf
- 创建redis-sentinel容器并启动
docker-compose -f /opt/redis/sentinel/redis-sentinel.yml up
docker-compose -f /opt/redis/sentinel/redis-sentinel.yml start
2.在slave节点上安装redis-sentinel
在slave节点192.168.137.130、192.168.137.131上创建容器并启动,步骤与第1步相同
四、启动集群
1.首先启动redis的master-slave集群
2.然后启动sentinel集群
五、查看集群启动情况
在master节点192.168.137.129 上
docker ps
[root@localhost sentinel]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9918c7d03aa redis "docker-entrypoint.s…" 17 hours ago Up 31 seconds 6379/tcp, 0.0.0.0:26379->26379/tcp, :::26379->26379/tcp redis-sentinel-1
de2fc6fd29d9 redis "docker-entrypoint.s…" 2 days ago Up About an hour 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis_rh
六、进入sentinel容器查看
docker exec -it a99 bash
redis-cli -p 26379
sentinel master mymaster
[root@localhost ~]# docker exec -it a99 bash
root@a9918c7d03aa:/data# redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.137.129"
5) "port"
6) "6379"
7) "runid"
8) "4961f438c977833fb98ae9d3668abea182e921b1"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "809"
19) "last-ping-reply"
20) "809"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "4262"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "687156"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "3"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379>
可看到name、ip、port、num-slaves、"num-other-sentinels"等信息,说明sentinel搭建成功。
七、关闭master节点,看故障转移情况
(做过多次测试后,我的master节点变成了130) master节点为192.168.137.130,关闭该服务器上的redis镜像。查看sentinel的打印日志
1:X 25 Feb 2022 06:03:02.296 # +sdown master mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:03.174 # Could not rename tmp config file (Device or resource busy)
1:X 25 Feb 2022 06:03:03.174 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 25 Feb 2022 06:03:03.174 # +new-epoch 2
1:X 25 Feb 2022 06:03:03.174 # +config-update-from sentinel beb64b07dd3bd09d7d48f6ca85a18e9438e44a3b 172.19.0.2 26379 @ mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:03.174 # +switch-master mymaster 192.168.137.130 6379 192.168.137.131 6379
1:X 25 Feb 2022 06:03:03.174 * +slave slave 192.168.137.129:6379 192.168.137.129 6379 @ mymaster 192.168.137.131 6379
1:X 25 Feb 2022 06:03:03.174 * +slave slave 192.168.137.130:6379 192.168.137.130 6379 @ mymaster 192.168.137.131 6379
1:X 25 Feb 2022 06:03:03.179 # Could not rename tmp config file (Device or resource busy)
1:X 25 Feb 2022 06:03:03.179 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 25 Feb 2022 06:03:33.194 # +sdown slave 192.168.137.130:6379 192.168.137.130 6379 @ mymaster 192.168.137.131 6379
从节点129上sentinel打印日志如下,
1:X 26 Feb 2022 05:57:19.933 # Could not rename tmp config file (Device or resource busy)
1:X 26 Feb 2022 05:57:19.933 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 26 Feb 2022 05:57:19.933 # +new-epoch 2
1:X 26 Feb 2022 05:57:19.933 # +config-update-from sentinel beb64b07dd3bd09d7d48f6ca85a18e9438e44a3b 172.19.0.2 26379 @ mymaster 192.168.137.130 6379
1:X 26 Feb 2022 05:57:19.933 # +switch-master mymaster 192.168.137.130 6379 192.168.137.131 6379
1:X 26 Feb 2022 05:57:19.933 * +slave slave 192.168.137.129:6379 192.168.137.129 6379 @ mymaster 192.168.137.131 6379
1:X 26 Feb 2022 05:57:19.934 * +slave slave 192.168.137.130:6379 192.168.137.130 6379 @ mymaster 192.168.137.131 6379
1:X 26 Feb 2022 05:57:19.936 # Could not rename tmp config file (Device or resource busy)
1:X 26 Feb 2022 05:57:19.936 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 26 Feb 2022 05:57:49.990 # +sdown slave 192.168.137.130:6379 192.168.137.130 6379 @ mymaster 192.168.137.131 6379
从节点131上sentinel打印日志如下,显示主节点已经转移到131上。
1:X 25 Feb 2022 06:03:06.905 # +sdown master mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:06.969 # +odown master mymaster 192.168.137.130 6379 #quorum 3/2
1:X 25 Feb 2022 06:03:06.969 # +new-epoch 2
1:X 25 Feb 2022 06:03:06.969 # +try-failover master mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:06.973 # Could not rename tmp config file (Device or resource busy)
1:X 25 Feb 2022 06:03:06.973 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 25 Feb 2022 06:03:06.973 # +vote-for-leader beb64b07dd3bd09d7d48f6ca85a18e9438e44a3b 2
1:X 25 Feb 2022 06:03:06.974 # beb64b07dd3bd09d7d48f6ca85a18e9438e44a3b voted for beb64b07dd3bd09d7d48f6ca85a18e9438e44a3b 2
1:X 25 Feb 2022 06:03:06.974 # dcd0a1fe3a54214a84df0e8af7784bdc2d588101 voted for beb64b07dd3bd09d7d48f6ca85a18e9438e44a3b 2
1:X 25 Feb 2022 06:03:07.057 # +elected-leader master mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:07.057 # +failover-state-select-slave master mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:07.144 # +selected-slave slave 192.168.137.131:6379 192.168.137.131 6379 @ mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:07.144 * +failover-state-send-slaveof-noone slave 192.168.137.131:6379 192.168.137.131 6379 @ mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:07.204 * +failover-state-wait-promotion slave 192.168.137.131:6379 192.168.137.131 6379 @ mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:07.632 # Could not rename tmp config file (Device or resource busy)
1:X 25 Feb 2022 06:03:07.633 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 25 Feb 2022 06:03:07.633 # +promoted-slave slave 192.168.137.131:6379 192.168.137.131 6379 @ mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:07.633 # +failover-state-reconf-slaves master mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:07.722 * +slave-reconf-sent slave 192.168.137.129:6379 192.168.137.129 6379 @ mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:08.390 * +slave-reconf-inprog slave 192.168.137.129:6379 192.168.137.129 6379 @ mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:08.391 * +slave-reconf-done slave 192.168.137.129:6379 192.168.137.129 6379 @ mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:08.473 # +failover-end master mymaster 192.168.137.130 6379
1:X 25 Feb 2022 06:03:08.473 # +switch-master mymaster 192.168.137.130 6379 192.168.137.131 6379
1:X 25 Feb 2022 06:03:08.475 * +slave slave 192.168.137.129:6379 192.168.137.129 6379 @ mymaster 192.168.137.131 6379
1:X 25 Feb 2022 06:03:08.475 * +slave slave 192.168.137.130:6379 192.168.137.130 6379 @ mymaster 192.168.137.131 6379
1:X 25 Feb 2022 06:03:08.478 # Could not rename tmp config file (Device or resource busy)
1:X 25 Feb 2022 06:03:08.478 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
1:X 25 Feb 2022 06:03:38.479 # +sdown slave 192.168.137.130:6379 192.168.137.130 6379 @ mymaster 192.168.137.131 6379
八、验证master节点是否真的转移成功
在131上进入redis容器,set key;在129和130节点上进入redis容器get key,说明master节点转移成功,因为只有主节点可以写key,从节点只能读取key。