说明
系统:CentOS7.9
redis:7.0.5
由于资源问题本次的部署全部在一台宿主机上通过启动不同的docker容器来完成部署。
搭建哨兵模式之前,首先搭建好主从模式,1主2从,可以参考上一篇文章:docker安装redis7-主从模式。搭建好主从模式之后我们开始部署哨兵,这里部署了3台哨兵,端口分别为26379,26380,26381。也可以参考官网的说明:Redis通过哨兵实现高可用性
修改主从的配置
三台节点的密码一定要保持一致
主节点配置(后续主节点可能会成为从节点)
vim /root/data/redis-master/conf/redis.conf
增加以下内容
masterauth <配置的requirepass的值>
从节点配置
复制主节点的配置到从节点的挂载路径下
cp /root/data/redis-master/conf/redis.conf /root/data/redis-slave1/conf/redis.conf
cp /root/data/redis-master/conf/redis.conf /root/data/redis-slave2/conf/redis.conf
修改从节点1配置
vim /root/data/redis-slave1/conf/redis.conf
增加以下配置
replicaof 192.168.66.114 6379
# 对外宣称自己的ip
replica-announce-ip 192.168.66.114
# 对外宣称自己的端口
replica-announce-port 6380
修改从节点2配置
vim /root/data/redis-slave2/conf/redis.conf
增加以下配置
replicaof 192.168.66.114 6379
# 对外宣称自己的ip
replica-announce-ip 192.168.66.114
# 对外宣称自己的端口
replica-announce-port 6381
重启主节点和从节点
docker restart redis-master
docker restart redis-slave1
docker restart redis-slave2
查看主节点信息,确保主从节点没问题
docker exec -it redis-master redis-cli
auth <your password>
info replication
创建挂载目录
三台哨兵节点的挂载路径用端口来区分不同的配置文件和日志文件
创建文件夹
# 哨兵1
mkdir -p /root/data/redis-sentinel/26379/conf
mkdir -p /root/data/redis-sentinel/26379/data
# 哨兵2
mkdir -p /root/data/redis-sentinel/26380/conf
mkdir -p /root/data/redis-sentinel/26380/data
# 哨兵3
mkdir -p /root/data/redis-sentinel/26381/conf
mkdir -p /root/data/redis-sentinel/26381/data
创建好的结构如下
三台哨兵的配置文件、数据文件挂载路径如下
# 哨兵1
/root/data/redis-sentinel/26379/data
/root/data/redis-sentinel/26379/data/sentinel.log
/root/data/redis-sentinel/26379/conf/sentinel.conf# 哨兵2
/root/data/redis-sentinel/26380/data/sentinel
/root/data/redis-sentinel/26380/data/sentinel.log
/root/data/redis-sentinel/26380/conf/sentinel.conf# 哨兵3
/root/data/redis-sentinel/26381/data/sentinel
/root/data/redis-sentinel/26381/data/sentinel.log
/root/data/redis-sentinel/26381/conf/sentinel.conf
哨兵节点配置
通用配置
bind 0.0.0.0
#端口
port 26379
#关闭保护模式
protected-mode no
#使用容器启动时,关闭后台启动,否则容器启动后就会关闭
daemonize no
#日志文件
logfile /data/sentinel.log
#守护进程pid存储文件
pidfile /var/run/redis-sentinel26379.pid
#指定要监控的主机IP地址和端口,redis-master:主节点的名称,名称可以自定义
#最后的值代表最少几个哨兵客观认可主节点下线才同意故障迁移
sentinel monitor redis-master 192.168.66.114 6379 2
#如果redis主节点设了requirepass,需要提供访问密码
sentinel auth-pass redis-master <主节点的密码>
#主机多少秒无响应,则认为挂了,为了测试暂时设置为30秒
sentinel down-after-milliseconds redis-master 30000
#主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1
sentinel parallel-syncs redis-master 1
#故障转移的超时时间,这里设置为三分钟
sentinel failover-timeout redis-master 180000
#sentinel工作目录
dir /data
哨兵1配置
vim /root/data/redis-sentinel/26379/conf/sentinel.conf
通用配置基础上追加以下内容
# 添加通用配置内容以及追加以下内容
#如果使用docker进行了端口映射,需要配置如下内容
# 哨兵节点向其他节点宣布自己的 IP 地址
sentinel announce-ip 192.168.66.114
# 哨兵节点向其他节点宣布自己的端口号
sentinel announce-port 26379
哨兵2配置
vim /root/data/redis-sentinel/26380/conf/sentinel.conf
通用配置基础上追加以下内容
# 添加通用配置内容,并追加以下内容
#如果使用docker进行了端口映射,需要配置如下内容
# 哨兵节点向其他节点宣布自己的 IP 地址
sentinel announce-ip 192.168.66.114
# 哨兵节点向其他节点宣布自己的端口号
sentinel announce-port 26380
哨兵3配置
vim /root/data/redis-sentinel/26381/conf/sentinel.conf
通用配置基础上追加以下内容
# 添加通用配置内容以及追加以下内容
#如果使用docker进行了端口映射,需要配置如下内容
# 哨兵节点向其他节点宣布自己的 IP 地址
sentinel announce-ip 192.168.66.114
# 哨兵节点向其他节点宣布自己的端口号
sentinel announce-port 26381
完整目录结构
启动所有哨兵节点
启动哨兵1
docker run -p 26379:26379 \
--privileged=true \
-v /root/data/redis-sentinel/26379/data:/data \
-v /root/data/redis-sentinel/26379/conf:/usr/local/etc/redis/ \
--name redis-sentinel1 \
--restart=always \
-d redis:7.0.5 \
redis-sentinel /usr/local/etc/redis/sentinel.conf
查看日志
tail -1000f /root/data/redis-sentinel/26379/data/sentinel.log
启动哨兵2
docker run -p 26380:26379 \
--privileged=true \
-v /root/data/redis-sentinel/26380/data:/data \
-v /root/data/redis-sentinel/26380/conf:/usr/local/etc/redis/ \
--name redis-sentinel2 \
--restart=always \
-d redis:7.0.5 \
redis-sentinel /usr/local/etc/redis/sentinel.conf
查看日志
tail -1000f /root/data/redis-sentinel/26380/data/sentinel.log
启动哨兵3
docker run -p 26381:26379 \
--privileged=true \
-v /root/data/redis-sentinel/26381/data:/data \
-v /root/data/redis-sentinel/26381/conf:/usr/local/etc/redis/ \
--name redis-sentinel3 \
--restart=always \
-d redis:7.0.5 \
redis-sentinel /usr/local/etc/redis/sentinel.conf
查看日志
tail -1000f /root/data/redis-sentinel/26381/data/sentinel.log
查看哨兵节点信息
所有节点的容器内部都是26379端口,因此只用修改容器名称即可进入对应容器查看信息
# docker exec -it <container-name> redis-cli -p 26379
docker exec -it redis-sentinel1 redis-cli -p 26379
# docker exec -it redis-sentinel2 redis-cli -p 26379
# docker exec -it redis-sentinel3 redis-cli -p 26379
# 查看容器信息
sentinel master redis-master
容灾验证
关闭主机点
模拟master挂掉场景,执行以下命令后等待30秒
docker stop redis-master
# 以上命令执行后等待30秒
30秒后哨兵监控到主节点挂掉了,开始重新选举,选举6380端口的从节点作为主节点(每次选举都是随机的不一定都是6380端口的节点)
重新启动redis-master节点
docker start redis-master
# 金融容器内部当前节点信息
docker exec -it redis-master redis-cli
auth 123123
info replication
当前节点的角色变为slave
查看redis-slave1节点的信息,角色已经变为master
查看redis-slave2节点信息
数据验证
主节点挂掉重启之后可以验证下数据是否丢失,这里只验证一个节点,其他节点自行验证
最终效果
一台宿主机上启动6个docker容器,分别为1主2从3哨兵
部署遇到的问题
WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
解决方案:
挂载配置文件的时候使用目录挂载映射,不要直接挂载文件
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128
解决方案:
# 在所有从节点的配置文件中增加以下配置
tcp-backlog 511
sentinel-invalid-addr sentinel 8ca6429840821d38651cb8bb64268dd1856541eb 192.168.66.114 6379 @ redis-master 192.168.66.114 6379
解决方案:
1.使用docker启动容器的时候,如果对外暴露了端口,需要在哨兵的配置文件中对外宣称自己的ip和端口,增加一下配置:
# 哨兵节点向其他节点宣布自己的 IP 地址
sentinel announce-ip 192.168.66.114
# 哨兵节点向其他节点宣布自己的端口号
sentinel announce-port 26381
2.每台哨兵启动后都会在自己的配置文件中写入下面的内容。有可能是某个节点的myid重复了,停掉对应的哨兵节点,删除myid,重启哨兵节点
结束语
以上是所有部署哨兵模式的流程,如果有问题欢迎大家评论