阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis-sentinel哨兵模式集群方案配置

126次阅读
没有评论

共计 4251 个字符,预计需要花费 11 分钟才能阅读完成。

最近研究了 Redis 的集群方案,第一个方案是创建 redis cluster,第二种方案就是用哨兵模式来进行主从替换以及故障恢复。

一、sentinel 介绍

Redis Sentinel
Sentinel(哨兵)是用于监控 redis 集群中 Master 状态的工具,其已经被集成在 redis2.4+ 的版本中

Sentinel 作用:
1):Master 状态检测
2):如果 Master 异常,则会进行 Master-Slave 切换,将其中一个 Slave 作为 Master,将之前的 Master 作为 Slave
3):Master-Slave 切换后,master_redis.conf、slave_redis.conf 和 sentinel.conf 的内容都会发生改变,即 master_redis.conf 中会多一行 slaveof 的配置,sentinel.conf 的监控目标会随之调换
Sentinel 工作方式:
1):每个 Sentinel 以每秒钟一次的频率向它所知的 Master,Slave 以及其他 Sentinel 实例发送一个 PING 命令
2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值,则这个实例会被 Sentinel 标记为主观下线。
3):如果一个 Master 被标记为主观下线,则正在监视这个 Master 的所有 Sentinel 要以每秒一次的频率确认 Master 的确进入了主观下线状态。
4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认 Master 的确进入了主观下线状态,则 Master 会被标记为客观下线
5):在一般情况下,每个 Sentinel 会以每 10 秒一次的频率向它已知的所有 Master,Slave 发送 INFO 命令
6):当 Master 被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
7):若没有足够数量的 Sentinel 同意 Master 已经下线,Master 的客观下线状态就会被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回复,Master 的主观下线状态就会被移除。

主观下线和客观下线
主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个 redis 服务器做出的下线判断。
客观下线:Objectively Down,简称 ODOWN,指的是多个 Sentinel 实例在对 Master Server 做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的 Master Server 下线判断,然后开启 failover.

通俗来讲就是:
redis 的 sentinel 系统用来管理多个 redis 服务器,可以实现一个功能上实现 HA 的集群。该系统主要执行三个任务:
①监控(Monitoring):Redis Sentinel 实时监控主服务器和从服务器运行状态。
②提醒(notification):当被监控的某个 Redis 服务器出现问题时,Redis Sentinel 可以向系统管理员发送通知,也可以通过 API 向其他程序发送通知
一个简单的主从结构加 sentinel 集群的架构图如下:
Redis-sentinel 哨兵模式集群方案配置
上图是一主一从节点,加上两个部署了 sentinel 的集群,sentinel 集群之间会互相通信,沟通交流 redis 节点的状态,做出相应的判断并进行处理,这里的主观下线状态和客观下线状态是比较重要的状态,它们决定了是否进行故障转移
可以 通过订阅指定的频道信息,当服务器出现故障得时候通知管理员
客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器,你不可以使用 PUBLISH 命令向这个服务器发送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令,通过订阅给定的频道来获取相应的事件提醒。
一个频道能够接收和这个频道的名字相同的事件。比如说,名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。

二、搭建 redis-sentinel 集群环境

1.、在 /usr/local/ 下新建一个目录 redis-sentinel,然后在此目录下新建 7501/ 7502/ 7503/ 7504/ 7505/ 7506/ 六个目录。

2.、将 redis 安装目录下的 reids.conf,拷贝到前 4 个目录下,分别命名为:
Redis-7501.conf redis-7502.conf redis-7503.conf redis-7504.conf
修改配置文件内容(以 redis-7501.conf 为例):

daemonize yes 
Port 7501
Bind 192.168.12.90
logfile "./redis-7501.log"

3、将 redis 安装目录下的 sentinel.conf 拷贝到 7505/ 和 7506/ 目录下分别命名:
Sentinel-7505.conf sentinel-7506.conf
修改配置文件(以 sentinel-7505.conf 为例):

port 7505
sentinel monitor mymaster 192.168.12.90 7501 2

注:我们稍后要启动四个 redis 实例,其中端口为 7501 的 redis 设为 master,其他三个设为 slave。所以 my mymaster 后跟的是 master 的 ip 和端口,最后一个’2’代表我要启动只要有 2 个 sentinel 认为 master 下线,就认为该 master 客观下线,启动 failover 并选举产生新的 master。通常最后一个参数不能多于启动的 sentinel 实例数。

4、启动 redis 和 sentinel
分别启动 4 个 redis 实例:

redis-server redis-7501.conf
...

然后分别登陆 7502 7503 7504 三个实例,动态改变主从关系,成为 7501 的 slave:

redis-cli -h 192.168.12.90 -p 7502
192.168.12.90:7502> SLAVEOF 192.168.12.90 7501

以后台启动模式启动两个 sentinel(哨兵):

redis-sentinel sentinel-7505.conf &

5、sentinel 一些命令介绍
要使用 sentinel 的命令,我们需要用 redis-cli 命令进入到 sentinel:

redis-cli -h 192.168.12.90 -p 7505

① INFO
sentinel 的基本状态信息
②SENTINEL masters
列出所有被监视的主服务器,以及这些主服务器的当前状态
③ SENTINEL slaves
列出给定主服务器的所有从服务器,以及这些从服务器的当前状态
④SENTINEL get-master-addr-by-name
返回给定名字的主服务器的 IP 地址和端口号
⑤SENTINEL reset
重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态,包括正在执行中的故障转移,并移除目前已经发现和关联的,主服务器的所有从服务器和 Sentinel。
⑥SENTINEL failover
当主服务器失效时,在不询问其他 Sentinel 意见的情况下,强制开始一次自动故障迁移,但是它会给其他 sentinel 发送一个最新的配置,其他 sentinel 会根据这个配置进行更新


6、测试:
(1)登陆到 master:

redis-cli -h 192.168.12.90 -p 7501
192.168.12.90:7501> set name "zhangsan"
[root@localhost redis-sentinel]# redis-cli -h 192.168.12.90 -p 7502
192.168.12.90:7502> get name
"zhangsan"
192.168.12.90:7502> set age 24
(error) READONLY You can't write against a read only slave.

可以看到:我们的主从模式中,slave 默认是只读。

(2)目前 7501 是 master, 我们强制 kill 掉 7501 的进程以后,可以看到 sentinel 打出的信息:
Redis-sentinel 哨兵模式集群方案配置

可以看到,sentinel 已经将 7504 这个 redis instance 提升为新的 master,稍后将 7501 这个实例启动,动态作为 7504 的 slave,这样就手动恢复了 redis 集群。

下面关于 Redis 的文章您也可能喜欢,不妨参考下:

Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis 主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm

CentOS 7 下 Redis 的安装与配置 http://www.linuxidc.com/Linux/2017-02/140363.htm

Ubuntu 14.04 安装 Redis 与简单配置 http://www.linuxidc.com/Linux/2017-01/139075.htm

Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Redis 单机 & 集群离线安装部署 http://www.linuxidc.com/Linux/2017-03/141403.htm

CentOS 7.0 安装 Redis 3.2.1 详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm

Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Ubuntu 15.10 下 Redis 集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm

Redis 实战 中文 PDF http://www.linuxidc.com/Linux/2016-04/129932.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-08/146379.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4251字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中