采用docker方式部署redis哨兵模式的集群
简单记录一下容器模式下需要注意的地方
目录
官方文档
redis哨兵机制官方文档
https://redis.io/docs/management/sentinel/#sentinel-quick-start
sentinel(哨兵)模式简单说明:
先完成redis主从搭建,然后运行哨兵监控程序即可,
哨兵作用:从节点根据选举算法共同判定主节点不可用时,自动切换其他从节点为主节点
一、开始部署
1. 准备3台物理主机
IP | 说明 |
---|---|
172.20.168.66 | 主节点 |
172.20.167.254 | 从节点 |
172.20.167.255 | 从节点 |
三台主机安装docker环境 并且拉取redis镜像 6.2
2. 构建主从关系
2.1 三台主机创建如下目录
目录 | 说明 |
---|---|
/app/redis/server/config | 映射redis 服务配置文件 |
/app/redis/server/data | 映射redis data目录 |
/app/redis/sentinel/config | 映射sentinel 服务配置文件 |
/app/redis/sentinel/data | 映射sentinel data目录 |
2.2 创建redis.conf映射文件
主服务器上面创建 /app/redis/server/config/redis.conf
port 9736
appendonly yes
masterauth Mypsd2023_
requirepass Mypsd2023_
# slave向master通告自己的固定端口
slave-announce-port 9736
# slave向master通告自己的固定ip
slave-announce-ip 172.20.168.66
两台从服务器上面创建 /app/redis/server/config/redis.conf
port 9736
appendonly yes
masterauth Mypsd2023_
requirepass Mypsd2023_
# slave向master通告自己的固定端口
slave-announce-port 9736
# slave向master通告自己的固定ip
slave-announce-ip ${从服务器的IP地址}
# 从节点上有此配置
slaveof 172.20.168.66 9736
记得修改 slave-announce-ip 从服务器的IP地址
2.3 启动主从节点
三台主机shell执行如下命令:
docker run -d --name redis-node -u root
-p 9736:9736
-v /app/redis/server/config:/etc/redis/config
-v /app/redis/server/data:/data
-e TZ=Asia/Shanghai
redis:6.2 redis-server /etc/redis/config/redis.conf
-u root 我们这里设置使用超管账号进行redis操作
3. 构建哨兵
3台主机上创建配置文件路径:/app/redis/sentinel/config/sentinel.conf 内容如下:
#
# 绑定所有可用的网络接口,用于接受来自其他 Sentinel 数据通讯请求
bind 0.0.0.0
#
# 设置Sentinel的端口号
port 26379
#
# 访问并监视 Redis 主节点,设置主节点的名称为mymaster
# 2表示至少有两个Sentinel认为主节点不可用时才能进行故障转移重新选择主节点
sentinel monitor mymaster 172.20.168.66 9736 2
#
# 5000毫秒未收到主节点响应则判定主节点不可用
sentinel down-after-milliseconds mymaster 5000
#
# 故障转移超时时间
# 表示在指定的10000毫秒数内,如果Sentinel实例未完成故障转移则会放弃转移
sentinel failover-timeout mymaster 10000
#
# 配置 Sentinel 实例在执行故障转移操作时可以同时同步的从节点数量
sentinel parallel-syncs mymaster 1
#
# 主节点身份验证密码
sentinel auth-pass mymaster Mypsd2023_
#
# ###Sentinel之间依赖于hello消息进行判定高可用性,hello消息中包含ip地址和端口
# ###容器化部署的Sentinel 如果不声明对外的ip端口则会使用容器内网ip和端口
# 用于配置 Sentinel 实例宣布给其他 Sentinel 实例和 Redis 客户端的 IP 地址
sentinel announce-ip ${本服务器的IP地址}
#
# 用于配置 Sentinel 实例宣布给其他 Sentinel 实例和 Redis 客户端的端口号
sentinel announce-port 26379
#
记得修改 sentinel announce-ip 本服务器的IP地址 填写本物理主机IP地址
3台主机上运行docker命令:
docker run -d --name redis-sentinel -u root
-p 26379:26379
-v /app/redis/sentinel/config:/etc/redis/config
-v /app/redis/sentinel/data:/data
-e TZ=Asia/Shanghai
redis:6.2 redis-sentinel /etc/redis/config/sentinel.conf
4. 校验 sentinel
进入容器或者其他电脑上的redis客户端
docker exec -it redis-sentinel /bin/bash
进入后输入命令
redis-cli -h 任一Sentinel服务器IP -p 26379
输入:ping
输出为 PONG,则连接成功。
输入:info sentinel 查看配置情况
#Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.20.168.66:9736,slaves=2,sentinels=3
二、Redisson客户端连接
redisson-wiki-zh/spilt 哨兵机制配置
点击这里查看中文文档
三、踩坑记录
docker 容器部署由于端口映射会有很多错误导致集群并不是高可用
-
sentinel部署时候建议使用默认端口 26379
如果不用默认端口则需要下面两个配置sentinel announce-ip 172.20.168.66 sentinel announce-port 26379
-
sentinel部署时需要指定映射目录而不是文件
否则你会看到如下错误日志:Could not rename tmp config file (Device or resource busy) WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
-
redis如果不想使用默认端口一定要在映射的配置文件中指定端口号
-
redis节点的配置文件中一定要有如下配置
masterauth Mypsd2023_ slave-announce-port 9736
特别是没有 slave-announce-port 9736 这个,你会发现主节点不可用时,哨兵无法切换其他从节点,就一直选举主节点,主节点不可用一直报错。
-
使用redisson王炸问题!
如果你的集群部署在云上,而你却在本地idea环境中连接
你会发现 启动报错!无法连接内网ip(即使你用redisson 哨兵模式连上了集群)
此时你才发现sentinel告知redisson客户端的redis地址是你配置的内网地址,
因此你的java程序要么全部内网环境,要么全部外网环境。。。。。 -
简单一主一从不能只配置2个哨兵起码3个
详细说明看官方文档,有人说:如果只配置一个哨兵??!---- 那要集群干什么!! -
单机上docker-compose 部署一主2从只能测试学习不可当成生产环境
单机的 — 要集群干什么!!