# Redis 入门到精通(十)-- 哨兵

Redis 入门到精通(十)-- 哨兵

一、redis 哨兵:哨兵简介

1、哨兵

哨兵(sentinel) :是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master 并将所有 slave 连接到新的 master。

2、哨兵的作用

1)监控

  • 不断的检查 master 和 slave 是否正常运行。
  • master 存活检测、master 与 slave 运行情况检测。

2)通知(提醒)

当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。

3)自动故障转移

断开 master 与 slave 连接,选取一个 slave 作为 master,将其他 slave 连接到新的 master,并告知客户端新的服务器地址。

74-Sentinel-哨兵.png

3、注意事项:

  • 哨兵也是一台 redis 服务器,只是不提供数据服务。
  • 通常哨兵配置数量为单数。

二、redis 哨兵:哨兵结构搭建

1、配置哨兵

  • 配置一拖二的主从结构。
  • 配置三个哨兵(配置相同,端口不同):参看sentinel.conf。
  • 启动哨兵。
redis-sentinel sentinel- 端口号 .conf

2、sentinel.conf 配置文件,配置哨兵。

配置项 范例 说明
sentinel auth-pass <服务器名称> sentinel auth-pass mymaster itcast 连接服务器口令
sentinel down-after-milliseconds <自定义服务名称><主机地址><端口><主从服务器总量> sentinel monitor mymaster 192.168.194.131 6381 1 设置哨兵监听的主服务器信息,最后的参数决定了最终参与选举的服务器 数量(-1)
sentinel down-after-milliseconds <服务名称><毫秒数(整数)> sentinel down-after-milliseconds mymaster 3000 指定哨兵在监控Redis服务时,判定服务器挂掉的时间周期,默认30秒 (30000),也是主从切换的启动条件之一
sentinel parallel-syncs <服务名称><服务器数(整数)> sentinel parallel-syncs mymaster 1 指定同时进行主从的slave数量,数值越大,要求网络资源越高,要求越小,同步时间越长
sentinel failover-timeout <服务名称><毫秒数(整数)> sentinel failover-timeout mymaster 9000 指定出现故障后,故障切换的最大超时时间,超过该值,认定切换失败,默认3分钟
sentinel notification-script <服务名称><脚本路径> 服务器无法正常联通时,设定的执行脚本,通常调试使用。

3、哨兵结构搭建:操作 redis 编辑 sentinel.conf 文件,配置哨兵。

(打开一个终端,作为主节点 master 窗口)


# 切换到 redis 安装目录 (master窗口)
cd /usr/local/redis/redis-4.0.0/

# 查看 sentinel.conf 文件(取掉注释,取掉空格)
cat sentinel.con | grep -v "#" | grep -v "^$"
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

# 查看 sentinel.conf 文件(取掉注释,取掉空格)并把全部内部复制到当前目录下的conf目录的sentinel-26379.conf 文件中。
cat sentinel.con | grep -v "#" | grep -v "^$" > ./conf/sentinel-26379.conf

# 编辑 sentinel-26379.conf 文件:
sudo vim conf/sentinel-26379.conf

# 修改内容如下:
port 26379
dir /usr/local/redis/redis-4.0.0/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

# 切换到 redis 安装目录下的 conf 目录 (master窗口)
cd /usr/local/redis/redis-4.0.0/conf/

# 复制 2个 sentinel-26379.conf 文件,并改名为:sentinel-26380.conf, sentinel-26379.conf 并把端口号作相应改变。
sed 's/26379/26380/g' sentinel-26379.conf > sentinel-26380.conf 
sed 's/26379/26381/g' sentinel-26379.conf > sentinel-26381.conf 

# 查看 sentinel-26380.conf, sentinel-26379.conf 内容:
cat sentinel-26380.conf
cat sentinel-26381.conf

# 复制 redis-6380.conf 文件内容,到 redis-6381.conf 文件,并把端口号作相应改变。
sed 's/6380/6381/g' redis-6380.conf > redis-6381.conf 

# 查看 redis-6381.conf 内容:
cat redis-6381.conf

# 删除 conf 目录下的其他日志文件,只留配置文件。
rm -rf 6379*

# 切换到 redis 安装目录下的 data 目录(此目录为自己创建的目录) (master窗口)
cd /usr/local/redis/redis-4.0.0/data/

# 清除 data 目录下的所有文件。
rm -rf *

# 切换到 redis 安装目录下(master窗口)
cd /usr/local/redis/redis-4.0.0/

# 指定配置文件,启动 redis 服务(主节点master):
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6379.conf

# 模拟 master窗口6379 主节点宕机
Ctrl + C 停止 redis-server conf/redis-6379.conf 服务。

# 查看日志,观察其他服务变化。

4、打开另一终端,启动 slave-01 从节点服务


# 切换到 redis 安装目录下(slave-01窗口)
cd /usr/local/redis/redis-4.0.0/

# 指定配置文件,启动 redis 服务(slave-01从节点1):
redis-server conf/redis-6380.conf

# 模拟 master窗口6379 主节点宕机
Ctrl + C 停止 redis-server conf/redis-6379.conf 服务。

# 查看日志,观察其他服务变化。

5、打开另一终端,启动 slave-02 从节点2服务


# 切换到 redis 安装目录下(slave-02窗口)
cd /usr/local/redis/redis-4.0.0/

# 指定配置文件,启动 redis 服务(slave-02从节点2):
redis-server conf/redis-6381.conf


# 模拟 master窗口6379 主节点宕机
Ctrl + C 停止 redis-server conf/redis-6379.conf 服务。

# 查看日志,观察其他服务变化。

6、打开另一终端(Sentinel-01窗口),启动哨兵1服务端


# 切换到 redis 安装目录下(Sentinel-01窗口)
cd /usr/local/redis/redis-4.0.0/

# 指定配置文件,启动哨兵1服务(Sentinel-01窗口):
redis-sentinel conf/sentinel-26379.conf

7、打开另一终端客户端(Sentinel-cli-01窗口),连接哨兵1服务端


# 切换到 redis 安装目录下(Sentinel-cli-01窗口)
cd /usr/local/redis/redis-4.0.0/

# 连接哨兵1服务端(Sentinel-cli-01窗口):
redis-cli -p 26379
127.0.0.1:26379> 

8、打开另一终端(Sentinel-02窗口),启动哨兵2服务端


# 切换到 redis 安装目录下(Sentinel-02窗口)
cd /usr/local/redis/redis-4.0.0/

# 查看一下哨兵1服务端启动后的配置文件 conf/ 
cat conf/sentinel-26379.conf 

# 内容变为:
port 26379
dir /usr/local/redis/redis-4.0.0/data
sentinel myid 0249e5c2fdde04cbe1059aa1a137b9b352f0f7f0
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6381
sentinel current-epoch 0


# 指定配置文件,启动哨兵2服务(Sentinel-02窗口):
redis-sentinel conf/sentinel-26380.conf

9、打开另一终端客户端(Sentinel-cli-02窗口),连接哨兵2服务端


# 切换到 redis 安装目录下(Sentinel-cli-02窗口)
cd /usr/local/redis/redis-4.0.0/

# 连接哨兵1服务端(Sentinel-cli-02窗口):
redis-cli -p 26380
127.0.0.1:26380> 

10、打开另一终端(Sentinel-03窗口),启动哨兵3服务端


# 切换到 redis 安装目录下(Sentinel-03窗口)
cd /usr/local/redis/redis-4.0.0/

# 查看一下哨兵1 哨兵2 服务端 2 个启动后的配置文件 conf/ 
cat conf/sentinel-26379.conf 

# 内容又会有变化:
port 26379
dir /usr/local/redis/redis-4.0.0/data
sentinel myid 0249e5c2fdde04cbe1059aa1a137b9b352f0f7f0
sentinel myid 0249e5c2fdde36cbe1059aa79137b9b352f0f733
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6381
sentinel current-epoch 0


# 指定配置文件,启动哨兵2服务(Sentinel-03窗口):
redis-sentinel conf/sentinel-26381.conf

11、打开另一终端客户端(Sentinel-cli-03窗口),连接哨兵3服务端


# 切换到 redis 安装目录下(Sentinel-cli-03窗口)
cd /usr/local/redis/redis-4.0.0/

# 连接哨兵1服务端(Sentinel-cli-03窗口):
redis-cli -p 26381
127.0.0.1:26381> 

12、打开另一终端客户端(master-cli窗口),连接 master 主节点服务端


# 启动另一客户端(master-cli窗口):

# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 指定端口号,启动 redis 客户端:
redis-cli -p 6379

# 查看所有 key 
127.0.0.1:6380> keys *
1) "name"

# 清空所有 redis 数据库
127.0.0.1:6380> flushall
OK

# 查看所有 key 
127.0.0.1:6380> keys *
(empty list or set)

# 创建数据 
127.0.0.1:6380> set name redis-6379
OK

# 模拟 master 窗口 6379 主节点宕机后,测试连接
127.0.0.1:6380> set name aaa
could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> 

13、打开另一终端客户端(slave-cli窗口),连接 slave 从节点服务端


# 启动另一客户端(slave-cli窗口):

# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 指定端口号,启动 redis 客户端:
redis-cli -p 6380

# 查看所有 key 
127.0.0.1:6380> keys *
1) "name"

# 清空所有 redis 数据库
127.0.0.1:6380> flushall
OK

# 查看所有 key 
127.0.0.1:6380> keys *
(empty list or set)

# 从节点获取数据
127.0.0.1:6380>  get name 
"redis-6379"

三、redis 哨兵:工作原理(1)

1、redis 哨兵在进行主从切换过程中经历三个阶段

  • 监控。
  • 通知。
  • 故障转移。

2、redis 哨兵:工作原理:

阶段一:监控阶段: 用于同步各个节点的状态信息。

1)获取各个 sentinel 的状态(是否在线)。

2)获取 master 的状态。

  • master 属性。
    • runid
    • role:master
  • 各个slave的详细信息。

3)获取所有 slave 的状态(根据 master 中的 slave 信息)。

  • slave属性
    • runid
    • role:slave
    • master_host、master_port
    • offset

3、redis哨兵工作原理-阶段一监控阶段示例图:

75-redis哨兵工作原理-阶段一监控阶段-1.png

75-redis哨兵工作原理-阶段一监控阶段-2.png

四、redis 哨兵:工作原理(2)

redis哨兵工作原理-阶段二通知阶段示例图:

76-redis哨兵工作原理-阶段二通知阶段.png

五、redis 哨兵:工作原理(3)

1、redis 哨兵工作原理:阶段三–故障转移阶段

1)服务器列表中挑选备选 master。

  • 在线的。
  • 响应慢的。
  • 与原master断开时间久的。
  • 优先原则。
    • 优先级
    • offset
    • runid

2)发送指令( sentinel )

  • 向新的 master 发送 slaveof no one。
  • 向其他 slave 发送 slaveof 新 masterIP 端口。

2、redis 哨兵工作原理:阶段三–故障转移阶段 示例图:

77-redis哨兵工作原理阶段三故障转移阶段-1.png

77-redis哨兵工作原理阶段三故障转移阶段-2.png

3、redis 哨兵工作原理

1)第一阶段–监控: 同步信息。

2)第二阶段–通知: 保持联通。

3)第三阶段–故障转移

  • 发现问题。
  • 竞选负责人。
  • 优选新 master。
  • 新 master 上任,其他 slave 切换 master,原 master 作为 slave 故障回复后连接。

4、redis 消兵模式 总结:

  • 什么是哨兵
  • 哨兵模式搭建
  • 哨兵工作原理
    • 监控
    • 通知
    • 故障转移

上一节关联链接请点击:
# Redis 入门到精通(九)-- 主从复制(3)

相关推荐

  1. Redis入门精通

    2024-07-23 06:12:03       33 阅读
  2. Python从入门精通秘籍

    2024-07-23 06:12:03       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 06:12:03       101 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 06:12:03       109 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 06:12:03       87 阅读
  4. Python语言-面向对象

    2024-07-23 06:12:03       96 阅读

热门阅读

  1. 深入剖析Tomcat整体架构

    2024-07-23 06:12:03       23 阅读
  2. CCF GESP Python编程 二级认证真题 2024年6月

    2024-07-23 06:12:03       28 阅读
  3. Android5.1 NAT功能的iptables规则

    2024-07-23 06:12:03       24 阅读
  4. C语言-预处理详解

    2024-07-23 06:12:03       24 阅读
  5. ios CCUIHilightedLabel.m

    2024-07-23 06:12:03       24 阅读
  6. 动态内存管理

    2024-07-23 06:12:03       17 阅读
  7. linux协议栈之FDB表

    2024-07-23 06:12:03       21 阅读
  8. 记录贴-VUE相关

    2024-07-23 06:12:03       23 阅读
  9. ios CCUIImage.m

    2024-07-23 06:12:03       23 阅读
  10. unity和安卓的so文件联合使用

    2024-07-23 06:12:03       22 阅读
  11. 智能马桶的工作原理

    2024-07-23 06:12:03       27 阅读
  12. gitlab查询分支API显示不全,只有20个问题

    2024-07-23 06:12:03       19 阅读