# 提前安装好docker和docker-compose
# 拉取相应镜像
docker pull redis
docker pull joshula/redis-sentinel
# 创建伪redis的数据目录,持久化redis数据
mkdir -p /opt/redis-sentinel-cluster/data/{master,slave1,slave2,sentinel1,sentinel2,sentinel3}
# 创建三个哨兵的配置文件
# monitor 指的是初始化的监控主切点,ip和端口,后面的数字2代表,必须2个sentinel才能判断主节点是否失败
# down-after-milliseconds 指的是超过5000秒,且没有回复,则判定主节点不可达
# failover-timeout 指的是故障转移时间
# parallel-syncs 指的是故障转移到新的主节点时,从节点的复制节点数量
cat <<EOF > /opt/redis-sentinel-cluster/sentinel1.conf
port 26379
dir "/data"
sentinel monitor mymaster localhost 16379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF > /opt/redis-sentinel-cluster/sentinel2.conf
port 26380
dir "/data"
sentinel monitor mymaster localhost 16379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
EOF
cat <<EOF > /opt/redis-sentinel-cluster/sentinel3.conf
port 26381
dir "/data"
sentinel monitor mymaster localhost 16379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1
EOF
# 创建docker-compose.yml文件
cat <<EOF > /opt/redis-sentinel-cluster/docker-compose.yml
version: '3.7'
services:
master:
image: redis:latest
container_name: redis-master
restart: always
network_mode: "host"
volumes:
- /opt/redis-sentinel-cluster/data/master:/data
command: redis-server --port 16379
slave1:
image: redis:latest
container_name: redis-slave1
restart: always
network_mode: "host"
volumes:
- /opt/redis-sentinel-cluster/data/slave1:/data
command: redis-server --port 16380 --slaveof localhost 16379
slave2:
image: redis:latest
container_name: redis-slave2
restart: always
network_mode: "host"
volumes:
- /opt/redis-sentinel-cluster/data/slave2:/data
command: redis-server --port 16381 --slaveof localhost 16379
sentinel1:
image: joshula/redis-sentinel
container_name: sentinel1
restart: always
network_mode: "host"
volumes:
- /opt/redis-sentinel-cluster/sentinel1.conf:/etc/redis/sentinel.conf
- /opt/redis-sentinel-cluster/data/sentinel1:/data
sentinel2:
image: joshula/redis-sentinel
container_name: sentinel2
restart: always
network_mode: "host"
volumes:
- /opt/redis-sentinel-cluster/sentinel2.conf:/etc/redis/sentinel.conf
- /opt/redis-sentinel-cluster/data/sentinel2:/data
sentinel3:
image: joshula/redis-sentinel
container_name: sentinel3
restart: always
network_mode: "host"
volumes:
- /opt/redis-sentinel-cluster/sentinel3.conf:/etc/redis/sentinel.conf
- /opt/redis-sentinel-cluster/data/sentinel3:/data
EOF
# 启动redis sentienl cluster
cd /opt/
# 安装并后台启动
docker-compose up -d
# 校验结果
# 连接哨兵
docker exec -it sentinel1 redis-cli -h localhost -p 26379
localhost:26379> info
# Server
redis_version:2.8.16
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9b6f16e360929887
redis_mode:sentinel
os:Linux 3.10.0-957.12.2.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.2
process_id:1
run_id:de77486594c6860852d587adea86cd0dc86f97a8
tcp_port:26379
uptime_in_seconds:664
uptime_in_days:0
hz:10
lru_clock:7996744
config_file:/etc/redis/sentinel.conf
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=::1:16379,slaves=2,sentinels=3
# 查看master
localhost:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "::1"
5) "port"
6) "16379"
7) "runid"
8) "502cd09af60f1f49dd570b223028356e15714ac1"
9) "flags"
10) "master"
11) "pending-commands"
12) "0"
13) "last-ping-sent"
14) "0"
15) "last-ok-ping-reply"
16) "1068"
17) "last-ping-reply"
18) "1068"
19) "down-after-milliseconds"
20) "5000"
21) "info-refresh"
22) "3932"
23) "role-reported"
24) "master"
25) "role-reported-time"
26) "14020"
27) "config-epoch"
28) "4"
29) "num-slaves"
30) "2"
31) "num-other-sentinels"
32) "2"
33) "quorum"
34) "2"
35) "failover-timeout"
36) "5000"
37) "parallel-syncs"
38) "1"
# 查看slaves
localhost:26379> sentinel slaves mymaster
1) 1) "name"
2) "[::1]:16380"
3) "ip"
4) "::1"
5) "port"
6) "16380"
7) "runid"
8) "5d2f70bb455426c542af074014c54448bf805704"
9) "flags"
10) "slave"
11) "pending-commands"
12) "0"
13) "last-ping-sent"
14) "0"
15) "last-ok-ping-reply"
16) "942"
17) "last-ping-reply"
18) "942"
19) "down-after-milliseconds"
20) "5000"
21) "info-refresh"
22) "3330"
23) "role-reported"
24) "slave"
25) "role-reported-time"
26) "93778"
27) "master-link-down-time"
28) "0"
29) "master-link-status"
30) "ok"
31) "master-host"
32) "::1"
33) "master-port"
34) "16379"
35) "slave-priority"
36) "100"
37) "slave-repl-offset"
38) "15873"
2) 1) "name"
2) "[::1]:16381"
3) "ip"
4) "::1"
5) "port"
6) "16381"
7) "runid"
8) "f377550544a6a1e59ea2b24c3cc78dff570a74a8"
9) "flags"
10) "slave"
11) "pending-commands"
12) "0"
13) "last-ping-sent"
14) "0"
15) "last-ok-ping-reply"
16) "528"
17) "last-ping-reply"
18) "528"
19) "down-after-milliseconds"
20) "5000"
21) "info-refresh"
22) "3330"
23) "role-reported"
24) "slave"
25) "role-reported-time"
26) "93778"
27) "master-link-down-time"
28) "0"
29) "master-link-status"
30) "ok"
31) "master-host"
32) "::1"
33) "master-port"
34) "16379"
35) "slave-priority"
36) "100"
37) "slave-repl-offset"
38) "15873"
# 主可以写入数据,从不可以
docker exec -it redis-master redis-cli -h localhost -p 16379
localhost:16379> set test_name test
OK
localhost:16379>
docker exec -it redis-slave1 redis-cli -h localhost -p 16380
localhost:16380> get test_name
"test"
localhost:16380> set test_aget 20
(error) READONLY You can't write against a read only replica.
# 关闭master,看是否切换(已由master的16379切换为slave1的16380)
docker stop redis-master
docker exec -it sentinel1 redis-cli -h localhost -p 26379
localhost:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "::1"
5) "port"
6) "16380"
7) "runid"
8) "6c9cb99e35505ce70dedca96fce8f72b0e57269f"
9) "flags"
10) "master"
11) "pending-commands"
12) "0"
13) "last-ping-sent"
14) "0"
15) "last-ok-ping-reply"
16) "263"
17) "last-ping-reply"
18) "263"
19) "down-after-milliseconds"
20) "5000"
21) "info-refresh"
22) "3971"
23) "role-reported"
24) "master"
25) "role-reported-time"
26) "34139"
27) "config-epoch"
28) "1"
29) "num-slaves"
30) "2"
31) "num-other-sentinels"
32) "2"
33) "quorum"
34) "2"
35) "failover-timeout"
36) "5000"
37) "parallel-syncs"
38) "1"
# 卸载
docker-compose down -v
# 启动
docker-compose start
# 停止
docker-compose stop