基于Sentinel的Redis高可用方案(Docker)

1. 基本架构

Redis 的高可用,意味着当主节点发生故障时,能够自动完成故障转移。即将一个从节点晋升为主节点,同时修改应用方的主节点地址。而Redis Sential很好的解决了这个问题,其基本架构(一主二从三哨兵)如图所示:

主要包括:

  • Redis 数据节点,负责数据的读写。
  • Redis Sential 节点。

Sentinel节点会对数据节点和其余Sentinel节点进行监控,若发现主节点主节点不可达,会与其他Sentinel节点进行协商,选举出一个Sentinel节点完成故障转移的工作。

2. 安装和部署

本文的安装环境为 Windows 版本 Docker。

2.1 部署 Redis 数据节点

2.1.1 基本结构

角色 容器名称 port 别名
master redis-master 6379 master
slave redis-slave1 6380
slave redis-slave2 6381

2.1.2 配置文件

  • redis-6379.conf

    redis-master的配置文件

    port 6379  
    daemonize yes
    logfile "6379.log"
    dbfilename "dump-6379.rdb"
    dir "/data"
    复制代码
    • port 端口号。
    • daemonize 设置为yes,Redis将会在后台一直运行。
    • logfile 日志文件名称。
    • dbfilename rdb持久化文件名称
    • dir 工作目录的的路径,则日志文件的路径为/data/6379.log
  • redis-6380.conf

    redis-slave1的配置文件

    port 6380
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/data"
    slaveof redis-master 6379
    复制代码
  • redis-6381.conf

    redis-slave2的配置文件

    port 6381  
    daemonize yes
    logfile "6381.log"
    dbfilename "dump-6381.rdb"
    dir "/data"
    slaveof redis-master 6379
    复制代码

2.1.3 Docker启动 命令

  1. 启动master节点

    $ docker run -it --name redis-master  -v /d/010Code/015Redis/redis_HA/redis/redis-6379.conf:/redis/redis-6379.conf redis /bin/bash 
    $ cd ../redis
    $ redis-server redis-6379.conf
    复制代码
  2. 启动slave1节点

    $ docker run -it --name redis-slave1  -v /d/010Code/015Redis/redis_HA/redis/redis-6380.conf:/redis/redis-6380.conf --link redis-master:master redis /bin/bash
    $ cd ../redis
    $ redis-server redis-6380.conf
    复制代码
  3. 启动slave2节点

    $ docker run -it --name redis-slave2  -v /d/010Code/015Redis/redis_HA/redis/redis-6381.conf:/redis/redis-6381.conf --link redis-master:master redis /bin/bash
    $ cd ../redis
    $ redis-server redis-6381,conf
    复制代码
  4. 校验

    在 redis-master 容器中,运行 redis-cli,然后输入 info 查看当前节点的状况,若能看到有两个 slave 节点,则表示 Redis 数据节点 一主二从结构部署成功。

  5. 参数说明

  • --name 容器的名称
  • -v /d/010Code/015Redis/redis_HA/redis/redis-6379.conf:/redis/redis-6379.conf 将本机的配置文件挂载到容器中
  • --link redis-master:master 建立与master 节点之间的容器间的通信。redis-master 为master 节点的容器名称,master 为 redis-master 的别名。

2.2 部署 Redis Sentinel 节点

2.2.1 基本结构

角色 容器名称 port 别名
redis-master-sentinel redis-master-sentinel1 26379 master
redis-master-sentinel2 redis-master-sentinel2 26380
redis-master-sentinel3 redis-master-sentinel3 26381

2.2.2 配置文件

  • redis-26379.conf

    port 26379
    daemonize yes
    logfile "26379.log"
    dir "/data"
    sentinel monitor mymaster master-sentinel1 6379 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    复制代码
    • port 端口号

    • daemonize 设置为yes,Redis Sentinel 将会在后台一直运行。

    • logfile 日志文件名称。

    • dir 工作目录的的路径,则日志文件的路径为/data/26379.log

    • sentinel monitor mymaster master-sentinel 6379 2 命令格式为:

      sentinel monitor

      • master-name 要监控的节点的别名
      • ip port 主节点的ip和端口号
      • quorum 选举过程中用到的变量,用于判定master节点最终不可达的票数
    • sentinel down-after-milliseconds mymaster 30000 判定节点不可达的参数

    • sentinel parallel-syncs mymaster 1 限制从节点向主节点发起复制连接数

    • sentinel failover-timeout mymaster 180000 故障转移的超时时间

  • redis-26380.comf

    port 26380
    daemonize yes
    logfile "26380.log"
    dir "/data"
    sentinel monitor mymaster master-sentinel2 6379 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    复制代码
  • redis-26381.conf

    port 26381
    daemonize yes
    logfile "26381.log"
    dir "/data"
    sentinel monitor mymaster master-sentinel2 6379 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    复制代码

2.2.3 Docker 启动命令

  1. 启动sentinel1节点

    $  docker run -it --name redis-master-sentinel1  -v /d/010Code/015Redis/redis_HA/redis/redis-26379.conf:/redis/redis-26379.conf --link redis-master:master-sentinel1 redis /bin/bash
    $ cd ../redis
    $ redis-sentinel redis-26379.conf
    复制代码
  2. 启动sentinel2节点

    $  docker run -it --name redis-master-sentinel2  -v /d/010Code/015Redis/redis_HA/redis/redis-26380.conf:/redis/redis-26380.conf --link redis-master:master-sentinel1 redis /bin/bash
    $ cd ../redis
    $ redis-sentinel redis-26380.conf
    复制代码
  3. 启动sentinel节点

    $  docker run -it --name redis-master-sentinel3  -v /d/010Code/015Redis/redis_HA/redis/redis-26381.conf:/redis/redis-26381.conf --link redis-master:master-sentinel1 redis /bin/bash
    $ cd ../redis
    $ redis-sentinel redis-26381.conf
    复制代码

4. 模拟故障演练

转载于:https://juejin.im/post/5bc183e7f265da0aec228132

你可能感兴趣的:(基于Sentinel的Redis高可用方案(Docker))