一、部署redis主从服务
1、目录结构
[root@sgpexchangemysql-192-168-8-61 rediscluster]# ls *
master:
data docker-compose.yml docker-compose.yml_bak
slave01:
data
slave02:
data
2、查看redis的docker-compose.yml文件内容
[root@sgpexchangemysql-192-168-8-61 rediscluster]# cat master/docker-compose.yml
version: '3.7'
services:
master:
image: redis
container_name: redis-master
restart: always
command: redis-server --requirepass 123456 --masterauth 123456
ports:
- 8001:6379
volumes:
- /data/deploy/cluster/master/data:/data
slave1:
image: redis
container_name: redis-slave01
restart: always
command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
ports:
- 8002:6379
volumes:
- /data/deploy/cluster/slave01/data:/data
slave2:
image: redis
container_name: redis-slave02
restart: always
command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
ports:
- 8003:6379
volumes:
- /data/deploy/cluster/slave02/data:/data
3、启动redis集群
docker network create redis-sentinel
[root@sgpexchangemysql-192-168-8-61 master]# docker-compose up -d
Creating network "master_default" with the default driver
Creating redis-master ... done
Creating redis-slave02 ... done
Creating redis-slave01 ... done
4、查看集群镜像
[root@sgpexchangemysql-192-168-8-61 master]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f66fb12e0e4 redis "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:8002->6379/tcp, :::8002->6379/tcp redis-slave01
a05dc32c58fc redis "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:8003->6379/tcp, :::8003->6379/tcp redis-slave02
2c35b7de7ec2 redis "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:8001->6379/tcp, :::8001->6379/tcp redis-master
5、查看集群服务
[root@sgpexchangemysql-192-168-8-61 master]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------
redis-master docker-entrypoint.sh redis ... Up 0.0.0.0:8001->6379/tcp,:::8001->6379/tcp
redis-slave01 docker-entrypoint.sh redis ... Up 0.0.0.0:8002->6379/tcp,:::8002->6379/tcp
redis-slave02 docker-entrypoint.sh redis ... Up 0.0.0.0:8003->6379/tcp,:::8003->6379/tcp
二、部署哨兵服务
1、目录结构
[root@sgpexchangemysql-192-168-8-61 rediscluster]# ls *
sentinel01:
docker-compose.yml sentinel.conf
sentinel02:
sentinel.conf
sentinel03:
sentinel.conf
2、查看docker-compose.yml文件内容
[root@sgpexchangemysql-192-168-8-61 sentinel01]# cat docker-compose.yml
version: '2'
services:
sentinel1:
image: redis ## 镜像
container_name: redis-sentinel01
ports:
- "26379:26379"
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- "/data/deploy/redisclouster/sentinel01/sentinel.conf:/usr/local/etc/redis/sentinel.conf"
sentinel2:
image: redis ## 镜像
container_name: redis-sentinel02
ports:
- "26380:26379"
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- "/data/deploy/redisclouster/sentinel02/sentinel.conf:/usr/local/etc/redis/sentinel.conf"
sentinel3:
image: redis ## 镜像
container_name: redis-sentinel03
ports:
- "26381:26379"
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- /data/deploy/redisclouster/sentinel03/sentinel.conf:/usr/local/etc/redis/sentinel.conf
networks:
default:
external:
name: master_default ##通过(docker inspect 主节点容器id)来查看,对应 NetworkMode
查看sentinel.conf文件
port 26379
dir /tmp
sentinel monitor mymaster redis-master 6379 2
#sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
3、启动sentinel集群
[root@sgpexchangemysql-192-168-8-61 sentinel01]# docker-compose up -d
Creating redis-sentinel01 ... done
Creating redis-sentinel02 ... done
Creating redis-sentinel03 ... done
启动后我们重新查看下sentinel.conf配置文件内容
[root@sgpexchangeinetermediate-192-168-8-63 rediscluster]# vim sentinel01/sentinel.conf
port 26379
dir "/tmp"
# 自定义集群名,其中 192.168.8.188 为 redis-master 的 ip,6379 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
sentinel myid c11eab918274b8076ebe9ff0a8e882dd187b49dc
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.8.63 8001 2
sentinel auth-pass mymaster test@dbuser2018
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-replica mymaster 172.25.0.4 6379
sentinel known-replica mymaster 172.25.0.3 6379
sentinel known-sentinel mymaster 172.26.0.2 26379 11d05befc16d866fe6a816c3bff6ae41500d6dea
sentinel known-sentinel mymaster 172.26.0.4 26379 229ab093218943a7ca800a8966bb513e66146fb6
sentinel current-epoch 0
4、查看集群
[root@sgpexchangemysql-192-168-8-61 sentinel01]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------
redis-sentinel01 docker-entrypoint.sh redis ... Up 0.0.0.0:26379->26379/tcp,:::26379->26379/tcp, 6379/tcp
redis-sentinel02 docker-entrypoint.sh redis ... Up 0.0.0.0:26380->26379/tcp,:::26380->26379/tcp, 6379/tcp
redis-sentinel03 docker-entrypoint.sh redis ... Up 0.0.0.0:26381->26379/tcp,:::26381->26379/tcp, 6379/tcp
三、演示故障转移
首先,进去之任意一个哨兵节点执行 info Sentinel 发现主节点IP为:1172.30.0.3:6379
[root@sgpexchangeinetermediate-192-168-8-63 rediscluster]# docker exec -it redis-sentinel01 /bin/bash
root@f79e1d030d51:/data# redis-cli -h redis-sentinel01 -p 26379
redis-sentinel01:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.30.0.3:6379,slaves=2,sentinels=3
使用docker-compose stop redis-master 命令停掉主节点 之后等待一会执行 info Sentinel 发现主节点IP变为 :
[root@sgpexchangeinetermediate-192-168-8-63 rediscluster]# docker stop redis-master
redis-master
使用docker stop redis-master 命令停掉主节点 之后等待一会执行 info Sentinel 发现主节点IP变为 :172.30.0.2:6379
redis-sentinel01:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.30.0.2:6379,slaves=2,sentinels=3
但是同时可以发现,哨兵节点认为新的主节点仍然有2个从节点,这是因为哨兵在将从节点切换成主节点的同时,将之前master节点置为其从节点;虽然之前master节点已经挂掉,但是由于哨兵并不会对从节点进行客观下线,因此认为该从节点一直存在。当之前master节点重新启动后,会自动变成主节点的从节点。下面验证一下。
进 redis-slaves02 容器执行 info 发现 slaves数量变为1个
root@f79e1d030d51:/data# redis-cli -h redis-slave02
redis-slave02:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.30.0.4,port=6379,state=online,offset=84227,lag=1
master_replid:ca6e7e3683772d86c96f375dbd6a058bc9f3007d
master_replid2:0f186241b2524a14fb5013cb3add1dc26790000c
master_repl_offset:84497
second_repl_offset:44505
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84497
重启master 可以看到从节点变为两个
[root@sgpexchangeinetermediate-192-168-8-63 rediscluster]# docker start redis-master
redis-master
redis-slave02:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.30.0.4,port=6379,state=online,offset=95660,lag=1
slave1:ip=172.30.0.3,port=6379,state=online,offset=95930,lag=1
master_replid:ca6e7e3683772d86c96f375dbd6a058bc9f3007d
master_replid2:0f186241b2524a14fb5013cb3add1dc26790000c
master_repl_offset:95930
second_repl_offset:44505
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:95930
哨兵还是认为一主两从
redis-sentinel01:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.30.0.2:6379,slaves=2,sentinels=3
注: redis 还有主从复制和Cluster模式