采用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 容器部署由于端口映射会有很多错误导致集群并不是高可用

  1. sentinel部署时候建议使用默认端口 26379
    如果不用默认端口则需要下面两个配置

    sentinel announce-ip 172.20.168.66
    sentinel announce-port 26379
    
  2. 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
    
  3. redis如果不想使用默认端口一定要在映射的配置文件中指定端口号

  4. redis节点的配置文件中一定要有如下配置

    masterauth Mypsd2023_
    slave-announce-port 9736
    

    特别是没有 slave-announce-port 9736 这个,你会发现主节点不可用时,哨兵无法切换其他从节点,就一直选举主节点,主节点不可用一直报错。

  5. 使用redisson王炸问题!
    如果你的集群部署在云上,而你却在本地idea环境中连接
    你会发现 启动报错!无法连接内网ip(即使你用redisson 哨兵模式连上了集群)
    此时你才发现sentinel告知redisson客户端的redis地址是你配置的内网地址,
    因此你的java程序要么全部内网环境,要么全部外网环境。。。。。

  6. 简单一主一从不能只配置2个哨兵起码3个
    详细说明看官方文档,有人说:如果只配置一个哨兵??!---- 那要集群干什么!!

  7. 单机上docker-compose 部署一主2从只能测试学习不可当成生产环境
    单机的 — 要集群干什么!!