哨兵模式

简介

Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。

功能

Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。 Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:

  • 监控
    Sentinel会不断的检查主服务器和从服务器是否正常运行。
  • 通知
    当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
  • 自动故障转移
    当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
  • 配置提供者
    在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。

工作流程

Sentinel负责监控集群中的所有主、从Redis,当发现主故障时,Sentinel会在所有的从中选一个成为新的主。并且会把其余的从变为新主的从。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。

相关概念

  • 主观失效
    SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
  • 客观失效
    ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover

镜像连接

Docker配置主从复制和哨兵模式

主机版本角色
master6.0.7
slave16.0.7
slave26.0.7
sentinel-16.0.7哨兵
sentinel-26.0.7哨兵

主从配置文件

master

bind 0.0.0.0 # 默认开放访问,服务器配置公网ip
protected-mode yes # 保护模式,需配置bind ip或者设置访问密码
port 6379 # 端口
daemonize no # 是否守护进程启动
pidfile /var/run/redis_6379.pid
logfile "/log/redis.log" # 日志文件位置
requirepass 12345678 # 密码

slave1和slave2

bind 0.0.0.0 # 默认开放访问,服务器配置公网ip
protected-mode yes # 保护模式,需配置bind ip或者设置访问密码
port 6379 # 端口
daemonize no # 是否守护进程启动
pidfile /var/run/redis_6379.pid
logfile "/log/redis.log" # 日志文件位置
slaveof master 6379 # 主的ip地址和端口
masterauth 12345678 # 主的密码

哨兵配置文件

# 端口
port 26379
# 是否后台启动
daemonize no
# pid
pidfile "/var/run/redis-sentinel.pid"
# 日志
logfile "/var/log/sentinel.log"
# 工作目录
dir "/tmp"

# 定义主的别名 ip 端口 这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
#sentinel monitor mymaster 172.28.0.2 6379 2

# 如果mymaster 30秒内没有响应,则认为其主观失效
#sentinel down-after-milliseconds mymaster 30000

# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
#sentinel parallel-syncs mymaster 1

# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
# sentinel failover-timeout mymaster 180000

# 主Redis密码
#sentinel auth-pass mymaster 12345678

# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
# sentinel deny-scripts-reconfig yes

#每当一个Sentinel启动后,它就会修改并通知其它Sentinel同时修改自身的`sentinel.conf`文件,生成sentinel myid
#sentinel myid f30170cf94adb7678425b66558e50096f535f1d4
# sentinel config-epoch mymaster 0

# 文件最后会加上
# Generated by CONFIG REWRITE
#user default on nopass ~* +@all
#sentinel leader-epoch mymaster 0
#sentinel known-replica mymaster 172.28.0.4 6379
#sentinel known-replica mymaster 172.28.0.3 6379
#sentinel known-sentinel mymaster 172.28.0.5 26379 175177a51483a78d6381ee6e1ed74d541f1dff54
#sentinel current-epoch 0

docker-compose.yml

version: "3"
services:
  redis_master:
    image: redis:6.0.7
    container_name: "redis_master"
    ports:
      - "6380:6379"
    volumes:
      - ./master/data/:/data/:rw
      - ./master/conf/:/etc/redis/:rw
      - ./master/log/:/log/:rw
    command: redis-server /etc/redis/redis.conf
    restart: always
    environment:  # 配置环境变量
      - TZ=Asia/Shanghai  # 设置时区
  redis_slave1:
    image: redis:6.0.7
    container_name: "redis_slave1"
    ports:
      - "6381:6379"
    volumes:
      - ./slave1/data/:/data/:rw
      - ./slave1/conf/:/etc/redis/:rw
      - ./slave1/log/:/log/:rw
    command: redis-server /etc/redis/redis.conf
    restart: always
    links:
      - redis_master
    environment:  # 配置环境变量
      - TZ=Asia/Shanghai  # 设置时区
  redis_slave2:
    image: redis:6.0.7
    container_name: "redis_slave2"
    ports:
      - "6382:6379"
    volumes:
      - ./slave2/data/:/data/:rw
      - ./slave2/conf/:/etc/redis/:rw
      - ./slave2/log/:/log/:rw
    command: redis-server /etc/redis/redis.conf
    restart: always
    links:
      - redis_master
    environment:  # 配置环境变量
      - TZ=Asia/Shanghai  # 设置时区
  redis_sentinel1:
    image: redis:6.0.7
    container_name: "redis-sentinel-1"
    ports:
      - "6383:26379"
    volumes:
      - ./sentinel/sentinel-1.conf:/etc/redis/sentinel.conf:rw
      - ./sentinel/log/sentinel-1/:/var/log/:rw
    command: redis-sentinel /etc/redis/sentinel.conf
    restart: always
    links:
      - redis_master
      - redis_slave1
    environment:  # 配置环境变量
      - TZ=Asia/Shanghai  # 设置时区
  redis_sentinel2:
    image: redis:6.0.7
    container_name: "redis-sentinel-2"
    ports:
      - "6384:26379"
    volumes:
      - ./sentinel/sentinel-2.conf:/etc/redis/sentinel.conf:rw
      - ./sentinel/log/sentinel-2/:/var/log/:rw
    command: redis-sentinel /etc/redis/sentinel.conf
    restart: always
    links:
      - redis_master
      - redis_slave2
    environment:  # 配置环境变量
      - TZ=Asia/Shanghai  # 设置时区

验证

主从

进入master后,链接redis,输入命令info relication,可以查看当前master链接的slave信息

master.png

s1.png

s2.png

哨兵

查看master

docker exec -it redis-sentinel-1 /bin/bash
root@1809622ea5d5:/data# redis-cli -p 26379
127.0.0.1:26379> sentinel master
(error) ERR Wrong number of arguments for 'sentinel master'
127.0.0.1:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "172.28.0.2"
 5) "port"
 6) "6379"
 7) "runid"
 8) "c6a6189b1694fccf85eeaa84a584b462f5736719"
 9) "flags"
10) "master"
11) "link-pending-commands"
.....

查看salve

127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "172.28.0.6:6379"
    3) "ip"
    4) "172.28.0.6"
    5) "port"
    6) "6379"
    7) "runid"
    8) "68a2106524d70e8eedfe5daa87d6df45390eef42"
    9) "flags"
   10) "slave"
...
2)  1) "name"
    2) "172.28.0.5:6379"
    3) "ip"
    4) "172.28.0.5"
    5) "port"
    6) "6379"
    7) "runid"
    8) "25dbfe9089627a1e27d9170472b0aaf3db1e4d40"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
...

查看其它哨兵

127.0.0.1:26379> sentinel sentinels mymaster
1)  1) "name"
    2) "37b34c3f8f13f916407061ec3e4f90d164d22ad3"
    3) "ip"
    4) "172.28.0.3"
    5) "port"
    6) "26379"
    7) "runid"
    8) "37b34c3f8f13f916407061ec3e4f90d164d22ad3"
    9) "flags"
   10) "sentinel"
   11) "link-pending-commands"
   12) "0"
...
最后修改:2020 年 10 月 18 日 03 : 13 PM
如果觉得我的文章对你有用,请随意赞赏