基于Docker-Compose搭建Redis哨兵模式
一、部署环境
环境: 一台Linux虚拟机、Docker、Docker-Compose
目标: Redis哨兵模式,一主二从三哨兵
明细: Redis主节点(Redis6379)、Redis从节点1(Redis6380)、Redis从节点2(Redis6381)、Redis哨兵1(Sentinel26379)、Redis哨兵2(Sentinel26380)、Redis哨兵3(Sentinel26381)
二、编写Redis配置文件
Redis6379.conf
# redis 服务器的端口号(默认:6379)
port 6379
# 绑定的 IP 地址,如果设置为 127.0.0.1,则只能本地访问;若设置为 0.0.0.0,则监听所有接口(默认:127.0.0.1)
bind 0.0.0.0
# 设置密码,客户端连接时需要提供密码才能进行操作,如果不设置密码,可以注释掉此行(默认:无)
# requirepass foobared
requirepass bingo
# 是否以守护进程(daemon)模式运行,默认为 "no",设置为 "yes" 后 Redis 会在后台运行
daemonize no
# 设置日志级别(默认:notice)。可以是 debug、verbose、notice、warning
loglevel notice
# 设置日志文件的路径(默认:空字符串),如果不设置,日志会输出到标准输出
logfile "6379.log"
# 设置数据库数量(默认:16),Redis 使用数据库索引从 0 到 15
databases 16
# 是否启用 AOF 持久化,默认为 "no"。如果设置为 "yes",将在每个写操作执行时将其追加到文件中
appendonly no
# 设置 AOF 持久化的文件路径(默认:appendonly.aof)
appendfilename "appendonly6379.aof"
# 设置是否开启 RDB 持久化,默认为 "yes"。如果设置为 "no",禁用 RDB 持久化功能
save 900 1
save 300 10
save 60 10000
# 设置 RDB 持久化文件的名称(默认:dump.rdb)
dbfilename dump6379.rdb
仿照上面的配置复制两份,依次命名为Redis6380.conf、Redis6381.conf,将文件中涉及到的端口6379改成对应的6380和6381即可
三、编写哨兵配置文件
Sentinel26379.conf
# 服务器的端口号
port 26379
# 可访问的 IP 地址
bind 0.0.0.0
# 日志文件
logfile "sentinel26379.log"
# 监控的主机(格式为 sentinel monitor 主机名 主机ip 主机端口 多少个哨兵节点都认为主节点不可达时才会进行故障转移的数量)
sentinel monitor redis6379 192.168.163.130 6379 2
# 监控的主机密码(格式为 sentinel auth-pass 主机名 主机连接密码)
sentinel auth-pass redis6379 bingo
# 指定在多少毫秒内,哨兵节点没有收到主节点的响应时,就会将主节点判定为下线状态(格式为 sentinel down-after-milliseconds 主机名 超时毫秒数)
sentinel down-after-milliseconds redis6379 5000
# 指定进行故障转移的超时时间,即在多少毫秒内完成故障转移操作(格式为 sentinel failover-timeout 主机名 主机连接密码)
sentinel failover-timeout redis6379 60000
# 这个配置项用于指定在进行故障转移时可以同时同步的从节点数量(格式为 sentinel parallel-syncs 主机名 主机连接密码)
sentinel parallel-syncs redis6379 1
复制两份,依次命名为sentinel26380.conf和sentinel26381.conf
四、编写Docker-Compose.yml
compose-redis.yml
version: '3.3'
services:
redis6379: # 服务名
image: redis:latest # 使用的镜像
container_name: redis6379 # docker启动的容器名称
ports:
- '6379:6379' # 启动的端口(本机:容器)
volumes: # 挂载卷的位置(本机:容器),自己创建好目录即可,只需修改本机的目录路径,不需要修改容器的路径
- /mydata/redis/data:/data
- /mydata/redis/conf/redis6379.conf:/usr/local/etc/redis/redis.conf
- /mydata/redis/logs:/logs
#配置文件启动命令
command: redis-server /usr/local/etc/redis/redis.conf
redis6380:
image: redis:latest
container_name: redis6380
ports:
- '6380:6380'
volumes:
- /mydata/redis/data:/data
- /mydata/redis/conf/redis6380.conf:/usr/local/etc/redis/redis.conf
- /mydata/redis/logs:/logs
command: redis-server /usr/local/etc/redis/redis.conf
redis6381:
image: redis:latest
container_name: redis6381
ports:
- '6381:6381'
volumes:
- /mydata/redis/data:/data
- /mydata/redis/conf/redis6381.conf:/usr/local/etc/redis/redis.conf
- /mydata/redis/logs:/logs
command: redis-server /usr/local/etc/redis/redis.conf
sentinel26379:
image: redis:latest
container_name: sentinel26379
ports:
- '26379:26379'
volumes:
- /mydata/redis/data:/data
- /mydata/redis/conf/sentinel26379.conf:/usr/local/etc/redis/sentinel.conf
- /mydata/redis/logs:/logs
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
depends_on: # 设置依赖关系,哨兵等待redis服务启动成功之后再启动
- redis6379
- redis6380
- redis6381
sentinel26380:
image: redis:latest
container_name: sentinel26380
ports:
- '26380:26380'
volumes:
- /mydata/redis/data:/data
- /mydata/redis/conf/sentinel26380.conf:/usr/local/etc/redis/sentinel.conf
- /mydata/redis/logs:/logs
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
depends_on:
- redis6379
- redis6380
- redis6381
sentinel26381:
image: redis:latest
container_name: sentinel26381
ports:
- '26381:26381'
volumes:
- /mydata/redis/data:/data
- /mydata/redis/conf/sentinel26381.conf:/usr/local/etc/redis/sentinel.conf
- /mydata/redis/logs:/logs
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
depends_on:
- redis6379
- redis6380
- redis6381
五、执行yml文件,启动容器
docker-compose -f compose-redis.yml up -d
docker ps 查看容器状态
可以看到所有容器都已经成功启动了
六、查看Redis各个角色状态
info replication 查看Redis节点信息、info sentinel 查看Redis哨兵信息
先连接主节点容器redis6379,然后查看主节点信息
docker exec -it redis6379 redis-cli -a bingo
列出了其两个从节点信息
connected_slaves:2
slave0:ip=192.168.48.1,port=6381,state=online,offset=109274,lag=0
slave1:ip=192.168.48.1,port=6380,state=online,offset=109274,lag=1
查看从节点redis6380信息
docker exec -it redis6380 redis-cli -p 6380 -a bingo
可以看到当前从节点的主节点信息
role:slave
master_host:192.168.163.130
master_port:6379
master_link_status:up
进入容器sentinel26379,查看哨兵sentinel26379的信息
docker exec -it sentinel26379 redis-cli -p 26379
info sentinel
可以看到主节点信息、状态和Redis的配置详情(两个从节点,三个哨兵)
master0:name=redis6379,status=ok,address=192.168.163.130:6379,slaves=2,sentinels=3
七、主从复制验证
先在主节点redis6379上设置k1
然后在从节点redis6380和redis6381上查询
可以看到主节点上设置的k1自动同步到了从节点上
注意,Redis的从节点是不能设置值的,只能读取值
八、主节点故障恢复验证
先关掉主节点redis6379
docker stop redis6379
然后进入哨兵sentinel26379查看Redis的节点信息
可以看到主节点的地址已经改成了6380(注意,matser的name是redis6379是因为我们最开始在sentinel.conf文件中配置的,这个名字可以自定义)
然后我们进入redis6380查看主机信息并尝试设置值
现在redis6380被选举成了主节点,便可设置值了,至此,主节点故障恢复成功
小结
以上就是作者基于Docker-Compose搭建Redis哨兵模式的所有内容,如果文中有错误或者表述不清楚的地方欢迎指正和讨论,谢谢 ~