• 采用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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    两台从服务器上面创建 /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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    记得修改 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    -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
    #
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    记得修改 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4. 校验 sentinel

    进入容器或者其他电脑上的redis客户端

    docker exec -it redis-sentinel /bin/bash
    
    • 1

    进入后输入命令

    redis-cli  -h 任一Sentinel服务器IP   -p 26379
    
    • 1

    输入: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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、Redisson客户端连接

    redisson-wiki-zh/spilt 哨兵机制配置
    点击这里查看中文文档

    三、踩坑记录

    docker 容器部署由于端口映射会有很多错误导致集群并不是高可用

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

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

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

      masterauth Mypsd2023_
      slave-announce-port 9736
      
      • 1
      • 2

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

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

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

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

  • 相关阅读:
    WebRTC简介及使用
    盘点 11 月火火火火的 GitHub 项目
    什么是 API 接口?给大家举例说明
    风格迁移:一文梳理经典方法发展脉络及原理:Gram矩阵、WCT、WCT2
    python经典百题之猜数字
    外贸多语种视频营销是怎么做的?原理如何理解?
    高等教育学:师生关系
    基于JavaFX图形界面演示的迷宫创建与路径寻找
    【kubernetes】k8s对象☞pod
    一文看懂推荐系统:排序01:多目标模型
  • 原文地址:https://blog.csdn.net/gzt19881123/article/details/132651903