docker安装redis7-哨兵模式

说明

系统: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,重启哨兵节点

 结束语

以上是所有部署哨兵模式的流程,如果有问题欢迎大家评论

猜你喜欢

转载自blog.csdn.net/LSW_JAVADP/article/details/132360308