docker搭建Redis6.2哨兵集群
Posted 快乐崇拜234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker搭建Redis6.2哨兵集群相关的知识,希望对你有一定的参考价值。
环境准备
搭建docker环境
下载Redis最新镜像
$ docker pull redis
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 02c7f2054405 2 weeks ago 105MB
搭建Redis主从集群
上面是我的目录结构。其中server/data是自动默认生成的。
redis-master.conf内容:
# 监听端口
port 6379
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
rename-command KEYS ""
# 设定连接主节点所使用的密码
# 注意这里要加密码,很多博客没加,如果不加的话,宕机的maser重启后无法加入集群
masterauth "123456"
redis-slave1内容:
# 监听端口
port 6380
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
rename-command KEYS ""
# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof 127.0.0.1 6379
# 设定连接主节点所使用的密码
masterauth "123456"
redis-slave2 内容:
# 监听端口
port 6381
# 设定密码认证
requirepass 123456
# 禁用KEYS命令
rename-command KEYS ""
# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof 127.0.0.1 6379
# 设定连接主节点所使用的密码
masterauth "123456"
docker-compose.yml:
---
version: '3'
services:
# 主节点的容器
redis-server-master:
image: redis
container_name: redis-server-master
restart: always
# 为了规避Docker中端口映射可能带来的问题
# 这里选择使用host网络
network_mode: host
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
volumes:
# 映射配置文件和数据目录
- ./redis-master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-master:/data
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# 从节点1的容器
redis-server-slave-1:
image: redis
container_name: redis-server-slave-1
restart: always
network_mode: host
depends_on:
- redis-server-master
environment:
TZ: "Asia/Shanghai"
volumes:
- ./redis-slave1.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-slave-1:/data
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
# 从节点2的容器
redis-server-slave-2:
image: redis
container_name: redis-server-slave-2
restart: always
network_mode: host
depends_on:
- redis-server-master
environment:
TZ: "Asia/Shanghai"
volumes:
- ./redis-slave2.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-slave-2:/data
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
启动Redis集群
在docker-compose.yml所在目录下执行docker-compose up -d
,即可启动Redis主从。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e3c9dcf42d1 redis "docker-entrypoint.s…" 4 hours ago Up 29 minutes redis-server-slave-2
a14894df0fb4 redis "docker-entrypoint.s…" 4 hours ago Up 29 minutes redis-server-slave-1
495975b40339 redis "docker-entrypoint.s…" 4 hours ago Up 26 minutes redis-server-master
$ docker exec -it redis-servashmaster /bin/ba
root@docker-desktop:/data# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=68163,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=68300,lag=0
master_failover_state:no-failover
master_replid:722133a64e5fbf444161633b30d8045fb766ee3e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:68300
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:68300
127.0.0.1:6379> set a 9
OK
另一个从的info信息如下:
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:80851
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:722133a64e5fbf444161633b30d8045fb766ee3e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:80851
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:80851
注意这里连接命令redis-cli -p 6379
后面的-p指定端口不是必须的,如果不加默认是连接master集群。如果访问从节点则需要添加指定端口。
登录其他两个redis可以看到数据已经同步过去了:
127.0.0.1:6380> get a
"9"
如果在从机器上修改数据会报错:
$ set a 90
(error) READONLY You can't write against a read only replica.
搭建哨兵集群
redis-sentinel-1.conf:
# bind 127.0.0.1
# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26379
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000
sentinel deny-scripts-reconfig yes
redis-sentinel-2:
# bind 127.0.0.1
# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26380
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000
sentinel deny-scripts-reconfig yes
redis-sentinel-3:
# bind 127.0.0.1
# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26381
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000
sentinel deny-scripts-reconfig yes
docker-compose.yml:
---
version: '3'
services:
redis-sentinel-1:
image: redis
container_name: redis-sentinel-1
restart: always
# 为了规避Docker中端口映射可能带来的问题
# 这里选择使用host网络
network_mode: host
volumes:
- ./redis-sentinel-1.conf:/usr/local/etc/redis/redis-sentinel.conf
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
redis-sentinel-2:
image: redis
container_name: redis-sentinel-2
restart: always
network_mode: host
volumes:
- ./redis-sentinel-2.conf:/usr/local/etc/redis/redis-sentinel.conf
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
redis-sentinel-3:
image: redis
container_name: redis-sentinel-3
restart: always
network_mode: host
volumes:
- ./redis-sentinel-3.conf:/usr/local/etc/redis/redis-sentinel.conf
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
在docker-compose.yml所在目录下执行docker-compose up -d,即可启动哨兵。
启动后:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3455266bcbb0 redis "docker-entrypoint.s…" 4 hours ago Up 29 minutes redis-sentinel-2
6b38d849b958 redis "docker-entrypoint.s…" 4 hours ago Up 29 minutes redis-sentinel-3
c234febfeb2b redis "docker-entrypoint.s…" 4 hours ago Up 29 minutes redis-sentinel-1
1e3c9dcf42d1 redis "docker-entrypoint.s…" 4 hours ago Up 29 minutes redis-server-slave-2
a14894df0fb4 redis "docker-entrypoint.s…" 4 hours ago Up 29 minutes redis-server-slave-1
495975b40339 redis "docker-entrypoint.s…" 4 hours ago Up 26 minutes redis-server-master
查看日志,可以看到主是6379,两个从是6380,6381。
并且对另外两台机器成功添加sentinel。
故障切换测试
关掉Redis主
$ docker stop redis-server-master
redis-server-master
可以看到三个哨兵先投票选举出新的master,然后将主切换到新的master。这里新master是6381
然后再次启动6379服务,此时启动后会将其作为从加入集群。
以上是关于docker搭建Redis6.2哨兵集群的主要内容,如果未能解决你的问题,请参考以下文章