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启动 命令
-
启动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
-
启动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
-
启动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
-
校验
在 redis-master 容器中,运行 redis-cli,然后输入 info 查看当前节点的状况,若能看到有两个 slave 节点,则表示 Redis 数据节点 一主二从结构部署成功。
-
参数说明
- --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 启动命令
-
启动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
-
启动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
-
启动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