zoukankan      html  css  js  c++  java
  • Docker部署Redis哨兵模式

    Redis哨兵模式

    Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
                                         ——《Redis设计与实现》

    准备环境和工具

    系统环境

    使用cat /etc/redhat-release查看
    
    CentOS Linux release 7.8.2003 (Core)
    

    安装docker

    这个就不介绍了,网上教程太多

    安装pip3

    yum -y install python3-pip
    

    安装docker-compose

    pip3 install docker-compose
    

    我的目录结构

    目录结构

    Sentinel配置

    Sentinel配置文件路径:

    /usr/local/etc/redis/sentinel/sentinel
    

    redis-sentinel-1.conf

    # bind 127.0.0.1
    
    # 哨兵的端口号
    # 因为各个哨兵节点会运行在单独的Docker容器中
    # 所以无需担心端口重复使用
    # 如果需要在单机
    port 26379
    
    # 设定密码认证
    requirepass 123456
    
    # 配置哨兵的监控参数
    # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
    # master-name是为这个被监控的master起的名字
    # ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
    # redis-port是被监控节点所监听的端口号
    # quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
    sentinel monitor local-master 127.0.0.1 6379 2
    
    # 连接主节点的密码
    # 格式:sentinel auth-pass <master-name> <password>
    sentinel auth-pass local-master 123456
    
    # master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
    # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
    sentinel down-after-milliseconds local-master 30000
    
    

    redis-sentinel-2.conf

    # bind 127.0.0.1
    
    # 哨兵的端口号
    # 因为各个哨兵节点会运行在单独的Docker容器中
    # 所以无需担心端口重复使用
    # 如果需要在单机
    port 26380
    
    # 设定密码认证
    requirepass 123456
    
    # 配置哨兵的监控参数
    # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
    # master-name是为这个被监控的master起的名字
    # ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
    # redis-port是被监控节点所监听的端口号
    # quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
    sentinel monitor local-master 127.0.0.1 6379 2
    
    # 连接主节点的密码
    # 格式:sentinel auth-pass <master-name> <password>
    sentinel auth-pass local-master 123456
    
    # master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
    # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
    sentinel down-after-milliseconds local-master 30000
    
    

    redis-sentinel-3.conf

    # bind 127.0.0.1
    
    # 哨兵的端口号
    # 因为各个哨兵节点会运行在单独的Docker容器中
    # 所以无需担心端口重复使用
    # 如果需要在单机
    port 26381
    
    # 设定密码认证
    requirepass 123456
    
    # 配置哨兵的监控参数
    # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
    # master-name是为这个被监控的master起的名字
    # ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
    # redis-port是被监控节点所监听的端口号
    # quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
    sentinel monitor local-master 127.0.0.1 6379 2
    
    # 连接主节点的密码
    # 格式:sentinel auth-pass <master-name> <password>
    sentinel auth-pass local-master 123456
    
    # master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
    # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
    sentinel down-after-milliseconds local-master 30000
    
    

    Redis配置

    Redis配置文件路径:

    /usr/local/etc/redis/sentinel/server
    

    redis-master.conf

    # bind 127.0.0.1
    
    # 启用保护模式
    # 即在没有使用bind指令绑定具体地址时
    # 或在没有设定密码时
    # Redis将拒绝来自外部的连接
    # protected-mode yes
    
    # 监听端口
    port 6379
    
    # 启动时不打印logo
    # 这个不重要,想看logo就打开它
    always-show-logo no
    
    # 设定密码认证
    requirepass 123456
    
    # 禁用KEYS命令
    # 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
    # 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
    # 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
    rename-command KEYS ""
    
    # 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
    # 这两个命令会清空数据,并且不会失败
    

    redis-slave1.conf

    # bind 127.0.0.1
    
    # 启用保护模式
    # 即在没有使用bind指令绑定具体地址时
    # 或在没有设定密码时
    # Redis将拒绝来自外部的连接
    # protected-mode yes
    
    # 监听端口
    port 6380
    
    # 启动时不打印logo
    # 这个不重要,想看logo就打开它
    always-show-logo no
    
    # 设定密码认证
    requirepass 123456
    
    # 禁用KEYS命令
    # 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
    # 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
    # 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
    rename-command KEYS ""
    
    # 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
    # 这两个命令会清空数据,并且不会失败
    
    # 配置master节点信息
    # 格式:
    #slaveof <masterip> <masterport>
    # 此处masterip所指定的redis-server-master是运行master节点的容器名
    # Docker容器间可以使用容器名代替实际的IP地址来通信
    slaveof 127.0.0.1 6379
    
    # 设定连接主节点所使用的密码
    masterauth "123456"
    

    redis-slave2.conf

    # bind 127.0.0.1
    
    # 启用保护模式
    # 即在没有使用bind指令绑定具体地址时
    # 或在没有设定密码时
    # Redis将拒绝来自外部的连接
    # protected-mode yes
    
    # 监听端口
    port 6381
    
    # 启动时不打印logo
    # 这个不重要,想看logo就打开它
    always-show-logo no
    
    # 设定密码认证
    requirepass 123456
    
    # 禁用KEYS命令
    # 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
    # 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
    # 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
    rename-command KEYS ""
    
    # 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
    # 这两个命令会清空数据,并且不会失败
    
    # 配置master节点信息
    # 格式:
    #slaveof <masterip> <masterport>
    # 此处masterip所指定的redis-server-master是运行master节点的容器名
    # Docker容器间可以使用容器名代替实际的IP地址来通信
    slaveof 127.0.0.1 6379
    
    # 设定连接主节点所使用的密码
    masterauth "123456"
    

    docker-compose配置

    sentinel和redis-server分别用两个docker-compose文件来管理
    docker-compose目录结构

    sentinel的docker-compose.yml文件

    ---
    
    version: '3'
    
    services:
      redis-sentinel-1:
        image: redis
        container_name: redis-sentinel-1
        restart: always
        # 为了规避Docker中端口映射可能带来的问题
        # 这里选择使用host网络
        network_mode: host
        volumes:
          - ./redis-sentinel-1.conf:/usr/local/etc/redis/redis-sentinel.conf
        # 指定时区,保证容器内时间正确
        environment:
          TZ: "Asia/Shanghai"
        sysctls:
          net.core.somaxconn: '511'
        command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
      redis-sentinel-2:
        image: redis
        container_name: redis-sentinel-2
        restart: always
        network_mode: host
        volumes:
          - ./redis-sentinel-2.conf:/usr/local/etc/redis/redis-sentinel.conf
        environment:
          TZ: "Asia/Shanghai"
        sysctls:
          net.core.somaxconn: '511'
        command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
      redis-sentinel-3:
        image: redis
        container_name: redis-sentinel-3
        restart: always
        network_mode: host
        volumes:
          - ./redis-sentinel-3.conf:/usr/local/etc/redis/redis-sentinel.conf
        environment:
          TZ: "Asia/Shanghai"
        sysctls:
          net.core.somaxconn: '511'
        command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
    

    redis的docker-compose文件

    ---
    
    version: '3'
    
    services:
      # 主节点的容器
      redis-server-master:
        image: redis
        container_name: redis-server-master
        restart: always
        # 为了规避Docker中端口映射可能带来的问题
        # 这里选择使用host网络
        network_mode: host
        # 指定时区,保证容器内时间正确
        environment:
          TZ: "Asia/Shanghai"
        volumes:
          # 映射配置文件和数据目录
          - ./redis-master.conf:/usr/local/etc/redis/redis.conf
          - ./data/redis-master:/data
        sysctls:
          # 必要的内核参数
          net.core.somaxconn: '511'
        command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
      # 从节点1的容器
      redis-server-slave-1:
        image: redis
        container_name: redis-server-slave-1
        restart: always
        network_mode: host
        depends_on:
          - redis-server-master
        environment:
          TZ: "Asia/Shanghai"
        volumes:
          - ./redis-slave1.conf:/usr/local/etc/redis/redis.conf
          - ./data/redis-slave-1:/data
        sysctls:
          net.core.somaxconn: '511'
        command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
      # 从节点2的容器
      redis-server-slave-2:
        image: redis
        container_name: redis-server-slave-2
        restart: always
        network_mode: host
        depends_on:
          - redis-server-master
        environment:
          TZ: "Asia/Shanghai"
        volumes:
          - ./redis-slave2.conf:/usr/local/etc/redis/redis.conf
          - ./data/redis-slave-2:/data
        sysctls:
          net.core.somaxconn: '511'
        command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    

    哨兵模式验证

    启动redis

    在/usr/local/etc/redis/sentinel/server路径下执行:

    docker-compose up
    

    docker ps

    启动sentinel

    在/usr/local/etc/redis/sentinel/sentinel路径下执行:

    docker-compose up
    

    观察sentinel的日志
    sentinel日志
    可以看到三个sentinel节点都监视了master节点,这个时候我们可以把maste节点停下来试一下

    sentinel日志
    可以看到日志输出,有两个sentinel节点认为master节点主观下线之后,有一个节点认为master节点客观下线

    sentinel日志
    然后开始开始投票选举领头sentinel

    sentinel日志
    由于这段内容涉及的ip地址太多,所以很多地方给模糊处理了一下,请谅解~
    从上面截图中可以看出,领头sentinel重新选出了一个master节点,127.0.0.1:6380,然后发送命令给其他的从服务节点,让他们成为新主服务节点的从服务节点,这就是哨兵模式高可用的原因之一,当redis-master挂掉以后,sentinel会选出一个领头sentinel,这个领头sentinel又会继续从从服务器列表中选出一个master节点,再通知其余的从节点成为这个主节点的从节点,这就完成了主节点切换的工作。

    参考文章

    Sentinel
    The Secret Lives of Data
    使用 Docker 配置 Redis 哨兵
    Markdown小技巧之空格输入

  • 相关阅读:
    glog的编译和使用
    FFMPEG+SDL实现视频播放器
    SDL2学习(二):常用枚举值和函数
    SDL2学习(一): 显示一张图片
    2. chromium开发工具--gclient
    C# 获取时间大全
    用jquery-table2excel,进行导出excel
    SQL Server FOR XML PATH 和 STUFF函数的用法
    关于My Sql update语句不能用子查询的解决办法
    echarts呈现数据表图形
  • 原文地址:https://www.cnblogs.com/alinainai/p/14086960.html
Copyright © 2011-2022 走看看