Redis集群之哨兵模式

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。

一、哨兵模式概述

哨兵模式是一种主从切换技术,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式
哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

在这里插入图片描述

这里的哨兵有两个作用

通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。

当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。

二、配置文件redis-sentinel.conf
# 默认情况下,无法从外部环境访问Sentinel,如果想要从外部环境访问Sentinel,可以使用下面2种方式
# 方式1,利用bind 指定可以访问的ip
# 方式2,利用protected-mode 关闭Sentinel保护模式
#
# For example you may use one of the following:
# 
# 只有127.0.0.1和192.168.1.1 可以访问本机Sentinel
# bind 127.0.0.1 192.168.1.1
#
# 是否开启保护模式:no关闭,yes开启
# protected-mode no

#哨兵sentinel实例运行的端口
port 26379

# sentinel announce-ip <ip>
# sentinel announce-port <port>
#
# 上述两个配置指令在环境中非常有用,因为NAT可以通过非本地地址从外部访问Sentinel。
#
# 当提供announce-ip时,Sentinel将在通信中声明指定的IP地址,而不是像通常那样自动检测本地地址。
#
# 类似地,当提供announce-port 有效且非零时,Sentinel将宣布指定的TCP端口。
#
# 这两个选项不需要一起使用,如果只提供announce-ip,Sentinel将宣告指定的IP和“port”选项指定的服务器端口。
# 如果仅提供announce-port,Sentinel将通告自动检测到的本地IP和指定端口。
#
# Example:
#
# sentinel announce-ip 1.2.3.4


# 哨兵sentinel的工作目录
dir /tmp

# 哨兵sentinel监控的redis主节点的 ip port 
# master-name  可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
# quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
sentinel monitor mymaster 127.0.0.1 6379 2

# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>


# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000

# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
#这个数字越小,完成failover所需的时间就越长,
#但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
#可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1

# 故障转移的超时时间 failover-timeout 可以用在以下这些方面: 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。  
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000

# 脚本执行
#
# sentinel notification-script和sentinel reconfig-script用于配置调用的脚本,以通知系统管理员或在故障转移后重新配置客户端。
# 脚本使用以下规则执行以进行错误处理:
#
# 如果脚本以“1”退出,则稍后重试执行(最多重试次数为当前设置的10次)。
#
# 如果脚本以“2”(或更高的值)退出,则不会重试执行。
#
# 如果脚本因为收到信号而终止,则行为与退出代码1相同。
#
# 脚本的最长运行时间为60秒。 达到此限制后,脚本将以SIGKILL终止,并重试执行。

# 通知脚本
#
# sentinel notification-script <master-name> <script-path>
#
# 为警告级别生成的任何Sentinel事件调用指定的通知脚本(例如-sdown,-odown等)。
# 此脚本应通过电子邮件,SMS或任何其他消息传递系统通知系统管理员 监控的Redis系统出了问题。
#
# 使用两个参数调用脚本:第一个是事件类型,第二个是事件描述。
#
# 该脚本必须存在且可执行,以便在提供此选项时启动sentinel。
#
# 举例:
#
# sentinel notification-script mymaster /var/redis/notify.sh


# 客户重新配置脚本
#
# sentinel client-reconfig-script <master-name> <script-path>
#
# 当主服务器因故障转移而变更时,可以调用脚本执行特定于应用程序的任务,以通知客户端,配置已更改且主服务器地址已经变更。
#
# 以下参数将传递给脚本:
#
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
#
# <state> 目前始终是故障转移 "failover"
# <role> 是 "leader" 或 "observer"
#
# 参数 from-ip, from-port, to-ip, to-port 用于传递主服务器的旧地址和所选副本的新地址。
#
# 举例:
#
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

# 指定日志文件名。 如果值为空,将强制Sentinel日志标准输出。守护进程下,如果使用标准输出进行日志记录,则日志将发送到/dev/null
logfile /var/log/redis/sentinel.log
三、Redis配置哨兵模式

配置2个哨兵和1主2从的Redis服务器来演示这个过程。

服务类型是否是主服务器IP地址端口
Redis192.168.93.2256379
Redis192.168.93.2276379
Redis192.168.93.2286379
Sentinel-192.168.93.22626379
Sentinel-192.168.93.22426379

首先配置Redis的主从服务器,修改redis.conf文件如下

# 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 禁止保护模式
protected-mode no

上述内容主要是配置Redis服务器

配置2个哨兵,每个哨兵的配置都是一样的。在Redis安装目录下有一个redis-sentinel.conf文件,copy一份进行修改

# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.93.225 6379 2

注意启动的顺序。首先是主机(192.168.93.225)的Redis服务进程,然后启动从机的服务进程,最后启动2个哨兵的服务进程。

哨兵启动过程日志如下(这里只放了192.168.93.226哨兵)

[root@data01 ~]# /usr/bin/redis-sentinel /etc/redis-sentinel.conf
1864:X 01 Sep 23:28:39.796 # systemd supervision requested, but NOTIFY_SOCKET not found
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.12 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 1864
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

1864:X 01 Sep 23:28:39.797 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1864:X 01 Sep 23:28:39.797 # Sentinel ID is 696081ed80604587a57557f59a0dd221f13896b4
1864:X 01 Sep 23:28:39.797 # +monitor master mymaster 192.168.93.225 6379 quorum 2
1864:X 01 Sep 23:29:25.581 # +sdown sentinel 21448aa6e781dcb1f1d3d75153f87e4143183ef4 192.168.93.195 26379 @ mymaster 192.168.93.225 6379
1864:X 01 Sep 23:29:51.577 # -sdown sentinel 21448aa6e781dcb1f1d3d75153f87e4143183ef4 192.168.93.195 26379 @ mymaster 192.168.93.225 6379

关闭主服务器192.168.93.225后,其哨兵过程多出一下内容

# 以下日志都是关闭主服务器192.168.93.225后多出的部分

1864:X 01 Sep 23:35:44.282 # +sdown master mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:44.336 # +odown master mymaster 192.168.93.225 6379 #quorum 2/2
1864:X 01 Sep 23:35:44.336 # +new-epoch 1
1864:X 01 Sep 23:35:44.336 # +try-failover master mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:44.343 # +vote-for-leader 696081ed80604587a57557f59a0dd221f13896b4 1
1864:X 01 Sep 23:35:44.352 # 21448aa6e781dcb1f1d3d75153f87e4143183ef4 voted for 696081ed80604587a57557f59a0dd221f13896b4 1
1864:X 01 Sep 23:35:44.398 # +elected-leader master mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:44.398 # +failover-state-select-slave master mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:44.500 # +selected-slave slave 192.168.93.228:6379 192.168.93.228 6379 @ mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:44.500 * +failover-state-send-slaveof-noone slave 192.168.93.228:6379 192.168.93.228 6379 @ mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:44.568 * +failover-state-wait-promotion slave 192.168.93.228:6379 192.168.93.228 6379 @ mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:45.577 # +promoted-slave slave 192.168.93.228:6379 192.168.93.228 6379 @ mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:45.578 # +failover-state-reconf-slaves master mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:45.641 * +slave-reconf-sent slave 192.168.93.227:6379 192.168.93.227 6379 @ mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:46.508 # -odown master mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:46.601 * +slave-reconf-inprog slave 192.168.93.227:6379 192.168.93.227 6379 @ mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:47.634 * +slave-reconf-done slave 192.168.93.227:6379 192.168.93.227 6379 @ mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:47.691 # +failover-end master mymaster 192.168.93.225 6379
1864:X 01 Sep 23:35:47.691 # +switch-master mymaster 192.168.93.225 6379 192.168.93.228 6379
1864:X 01 Sep 23:35:47.693 * +slave slave 192.168.93.227:6379 192.168.93.227 6379 @ mymaster 192.168.93.228 6379
1864:X 01 Sep 23:35:47.693 * +slave slave 192.168.93.225:6379 192.168.93.225 6379 @ mymaster 192.168.93.228 6379
1864:X 01 Sep 23:36:17.697 # +sdown slave 192.168.93.225:6379 192.168.93.225 6379 @ mymaster 192.168.93.228 6379

可以看出这时候,从服务器192.168.93.228变成了主服务器

就算原来的主服务192.168.93.225,恢复了,他也不是以主服务器身份恢复的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值