docker搭建redis主从复制+sentinel高可用集群
redis的主从复制配合sentinel模式使用时,当主机宕机后,通过sentinel模式会自动选举出新的master,从而实现高可用。
1,搭建redis主从复制
启动三个redis docker容器分别映射到6380,6381,6382端口。
docker run -it --name redis-master6380 -p 6380:6379 -d redis
docker run -it --name redis-node6381 -p 6381:6379 -d redis
docker run -it --name redis-node6382 -p 6382:6379 -d redis
通过docker inspect redis-master6380命令 查看master6380节点容器内网的ip地址为172.17.0.4
进入node6381的redis-cli
docker exec -it redis-node6381 redis-cli
查看当前节点为master状态
info replication
将当前节点设置为master6380的slave
SLAVEOF 172.17.0.4 6379
对node6382做同样的操作将其设为master6380的slave
再次使用info replication 可以看到node6381和node6382状态都为slave
2,搭建sentinel模式
创建sentinel配置文件redis-master6380.conf、redis-node6381.conf和redis-node6382.conf
redis-master6380.conf
# 哨兵端口号
port 6380
# 设定密码认证
# requirepass 123456
bind 0.0.0.0
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name被监控的master的名字
# ip是被监控的master的IP或主机名。
# quorom个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis-master6380 192.168.59.228 6380 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
#sentinel auth-pass local-master 123456
# 表示对外暴露的IP地址与端口号
slave-announce-ip 192.168.59.228
slave-announce-port 6380
redis-node6381.conf
port 6381
#requirepass 123456
bind 0.0.0.0
# quorom个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis-master6380 192.168.59.228 6380 2
#sentinel auth-pass redis-node6381 123456
# 表示对外暴露的IP地址与端口号
slave-announce-ip 192.168.59.228
slave-announce-port 6381
redis-node6382.conf
port 6382
# 设定密码认证
#requirepass 123456
bind 0.0.0.0
sentinel monitor redis-master6380 192.168.59.228 6380 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
#sentinel auth-pass redis-matser6380 123456
# 表示对外暴露的IP地址与端口号
slave-announce-ip 192.168.59.228
slave-announce-port 6382
将配置三个文件拷贝到对应的容器内
docker exec -it redis-master6380 /bin/bash -c ‘mkdir /etc/redis’
docker cp redis-master6380.conf redis-master6380:/etc/redis/sentinel.conf
docker exec -it redis-node6381 /bin/bash -c ‘mkdir /etc/redis’
docker cp redis-node6381.conf redis-node6381:/etc/redis/sentinel.conf
docker exec -it redis-node6382 /bin/bash -c ‘mkdir /etc/redis’
docker cp redis-node6382.conf redis-node6382:/etc/redis/sentinel.conf
进入容器启动sentienl
docker exec -it redis-master6380 bash
redis-sentinel /etc/redis/sentinel.conf
docker exec -it redis-node6381 bash
redis-sentinel /etc/redis/sentinel.conf
docker exec -it redis-node6382 bash
redis-sentinel /etc/redis/sentinel.conf
当前是在前台运行,方便观察,如果需要后台运行sentinel,需要加上参数daemonize yes
3,测试
在master节点上面写入数据,三台redis上都有同样的数据
停止redis-mater6380容器后观察日志,选举6381节点作为master
重新启动matser6380节点,观察日志,matser6380自动成为6381节点的slave