说到Redis不得不提哨兵模式,那么究竟哨兵是什么意思?为什么要使用哨兵呢?

接下来一一为您讲解:

1.为什么要用到哨兵

哨兵(Sentinel)主要是为了解决在主从(master-slave)复制架构中出现宕机的情况,主要分为两种:

1.1 从Redis宕机(slave

在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据。

在Redis2.8版本后,主从断线后恢复的情况下实现增量复制。

1.2 主Redis宕机(master)

需要以下2步才能完成:
i.第一步,在从数据库中执行 SLAVEOF NO ONE 命令,断开主从关系并且提升为主库继续服务;
ii.第二步,将主库重新启动后,执行 SLAVEOF 命令,将其设置为其他库的从库,这时数据就能更新回来。

由于这个手动完成恢复的过程其实是比较麻烦的并且容易出错,所以Redis提供的哨兵(sentinel)的功能来解决.

2.什么是哨兵

Redis-Sentinel是用于管理Redis集群,该系统执行以下三个任务:

2.1 监控(Monitoring):
Sentinel会不断地检查你的主服务器和从服务器是否运作正常;

2.2 提醒(Notification):
当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知;

2.3 自动故障迁移(Automatic failover):

当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

3.Sentinel集群搭建

3.1 Sentinel集群拓扑图

而哨兵也分为单哨兵和多哨兵两种模式:

  • 单哨兵模式

  • 多哨兵模式

通过两个图示很容易发现:多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控。

3.2 在保证Redis主从架构集群可用的前提下,复制三份配置文件

# 进入redis所在目录
cd /usr/local/src/redis-3.2.1 # 创建6379、6380、6381目录,分别将安装目录下的sentinel.conf拷贝到这三个目录下
mkdir -p /usr/local/redis/6379 && cp sentinel.conf /usr/local/redis/6379/26379.conf
mkdir -p /usr/local/redis/6380 && cp sentinel.conf /usr/local/redis/6380/26380.conf
mkdir -p /usr/local/redis/6381 && cp sentinel.conf /usr/local/redis/6381/26381.conf

3.3 分别配置三个哨兵

# 修改sentinel配置文件
vim /usr/local/redis/6379/26379.conf 修改内容:
# 添加守护进程模式
daemonize yes # 添加指明日志文件名
logfile "/usr/local/redis/6379/sentinel26379.log" # 修改工作目录
dir "/usr/local/redis/6379" # 修改启动端口
port 26379 # 添加关闭保护模式
protected-mode no # 修改sentinel monitor
sentinel monitor macrog-master 192.168.24.131 6379 2 # 将配置文件中mymaster全部替换macrog-master
# 在末行模式下 输入 :%s/mymaster/macrog-master/g 依次修改26380,26381配置
说明:
macrog-master:监控主数据的名称,自定义即可,可以使用大小写字母和“.-_”符号
192.168.24.131:监控的主数据库的IP
6379:监控的主数据库的端口
2:最低通过票数

3.4 启动哨兵进程

redis-sentinel /usr/local/redis/6379/26379.conf //或者 redis-server /usr/local/redis/6379/26379.conf --sentinel
redis-sentinel /usr/local/redis/6380/26380.conf //或者 redis-server /usr/local/redis/6380/26380.conf --sentinel
redis-sentinel /usr/local/redis/6381/26381.conf //或者 redis-server /usr/local/redis/6381/26381.conf --sentinel

3.5. 测试

测试前分别打开三个哨兵的日志(上面配置有logfile的名字):

1、 从库宕机(6380)

手动使从库6380宕机,即杀掉该进程:

kill -9 17233

30s后,26379/26380/26381日志均打印:

27552:X 10 Sep 18:12:12.757 # +sdown slave 192.168.24.131:6380 192.168.24.131 6380 @ macrog-master 192.168.24.131 6379

这表示:检测到从库宕机(+sdown: Subjective down主观宕机,第4节介绍),并告知master库6379。

现在我们重新启动6380实例。

redis-server 6380/6380.conf

26379/26380/26381日志均打印:

27570:X 10 Sep 18:15:40.384 * +reboot slave 192.168.24.131:6380 192.168.24.131 6380 @ macrog-master 192.168.24.131 6379
27570:X 10 Sep 18:15:40.451 # -sdown slave 192.168.24.131:6380 192.168.24.131 6380 @ macrog-master 192.168.24.131 6379

可以看出:slave重新加入到了主从复制中。-sdown:说明是恢复服务。

2、 主库宕机(6379)

同样的我们手动将master库宕机:

kill -9 17221

30s后, 26381日志打印:

最上面两条log表示master宕机(+sdown,+odown分别表示主观宕机和客观宕机,第4节介绍)

第二个红方框表示:哨兵将哨兵中某一个选举成为leader,选择6381为新的master;

最后三行表示:设置6379和6380为6381的slave;

也可以通过info replication查看主从关系 发现master已经切换为6381。

接下来,我们恢复6379(原master),查看状态:

redis-server 6379/6379.conf

日志均打印:

27675:X 10 Sep 18:28:10.392 # -sdown slave 192.168.24.131:6379 192.168.24.131 6379 @ macrog-master 192.168.24.131 6381

表示:已经将6379设置为6381的slave。

4.Sentinel原理介绍

在上面遇到的两个名词,主观down和客观down:

SDOWN:subjectively down,直接翻译的为”主观”失效,即:当前sentinel实例认为某个redis服务为”不可用”状态;

ODOWN:objectively down,直接翻译为”客观”失效,即:多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover。

SDOWN与ODOWN转换过程:

1、每个sentinel实例在启动后,都会和已知的slaves/master以及其他sentinels建立TCP连接,并周期性发送PING(默认为1秒),在交互中,如果redis-server无法在”down-after-milliseconds”时间内响应或者响应错误信息,都会被认为此redis-server处于SDOWN状态。

2、SDOWN的server为master,那么此时sentinel实例将会向其他sentinel间歇性(一秒)发送”is-master-down-by-addr ”指令并获取响应信息,如果足够多的sentinel实例检测到master处于SDOWN,那么此时当前sentinel实例标记master为ODOWN…其他sentinel实例做同样的交互操作。配置项”sentinel monitor ”,如果检测到master处于SDOWN状态的slave个数达到,那么此时此sentinel实例将会认为master处于ODOWN。

3、每个sentinel实例将会间歇性(10秒)向master和slaves发送”INFO”指令,如果master失效且没有新master选出时,每1秒发送一次”INFO”;”INFO”的主要目的就是获取并确认当前集群环境中slaves和master的存活情况。

4、经过上述过程后,所有的sentinel对master失效达成一致后,开始failover。

Sentinel与slaves“自动发现”机制:

在sentinel的配置文件中,都指定了port,此port就是sentinel实例侦听其他sentinel实例建立链接的端口。

在集群稳定后,最终会每个sentinel实例之间都会建立一个tcp链接,此链接中发送”PING”以及类似于”is-master-down-by-addr”指令集,可用来检测其他sentinel实例的有效性以及”ODOWN”和”failover”过程中信息的交互。

在sentinel之间建立连接之前,sentinel将会尽力和配置文件中指定的master建立连接。sentinel与master的连接中的通信主要是基于pub/sub来发布和接收信息,发布的信息内容包括当前sentinel实例的侦听端口。

Over....

Redis之哨兵机制(sentinel)——配置详解及原理介绍的更多相关文章

  1. redis cluster 集群 安装 配置 详解

    redis cluster 集群 安装 配置 详解 张映 发表于 2015-05-01 分类目录: nosql 标签:cluster, redis, 安装, 配置, 集群 Redis 集群是一个提供在 ...

  2. CentOS下Redis 2.2.14安装配置详解(转载)

    一. 下载redis最新版本2.2.14 cd /usr/local/src wget –c http://redis.googlecode.com/files/redis-2.2.14.tar.gz ...

  3. Redis之(六)配置详解

    进入Redis的安装包,里面的"redis.conf"就是默认的配置文件,启动Redis Server的时候,可以指定加载某个路径下的配置文件"redis-server ...

  4. nginx配置详解和原理

    1.nginx的配置文件 nginx 配置文件的整体结构 user nobody nobody; # 指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行,nobody 是系 ...

  5. kafka原理和实践(五)spring-kafka配置详解

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  6. redis哨兵机制--配置文件sentinel.conf详解

    转载自 https://blog.csdn.net/u012441222/article/details/80751390 Redis的哨兵机制是官方推荐的一种高可用(HA)方案,我们在使用Redis ...

  7. Redis高可用方案哨兵机制------ 配置文件sentinel.conf详解

    Redis的哨兵机制是官方推荐的一种高可用(HA)方案,我们在使用Redis的主从结构时,如果主节点挂掉,这时是不能自动进行主备切换和通知客户端主节点下线的. Redis-Sentinel机制主要用三 ...

  8. redis配置详解

    ##redis配置详解 # Redis configuration file example. # # Note that in order to read the configuration fil ...

  9. springdata+redis配置详解

    springdata设计初衷是位简化数据类型和数据的持久化存储,它并不局限是关系型数据库还是nosql数据库,都提供了简化的数据库连接,让数据获取变得更加的简单.所有这些的实现有统一的api提供. 本 ...

随机推荐

  1. 2V升3.3V芯片,输出500MA,低功耗10uA解决方案

    2V的输入电压其实非常少,一般都是镍氢电池1.2V,干电池1.5V,来给玩具,MCU单片机,模块啊,等等供电.不过2V的供电电源或者设备确实是不常见的. 一般2V升3.3V,需要升压芯片PW5100即 ...

  2. 网络可视化工具netron详细安装流程

    1.netron 简介 在实际的项目中,经过会遇到各种网络模型,需要我们快速去了解网络结构.如果单纯的去看模型文件,脑海中很难直观的浮现网络的架构. 这时,就可以使用netron可视化工具,可以清晰的 ...

  3. poj 1038 Bugs Integrated, Inc. 题解

    提供一种代码难度比较简单的做法(可能) 状态表示: 设置状态$ f[i][j] $,表示第 \(i\) 行状态为 \(j\) 的最大放置数,因为这是个阴间题,因为题目内存设置很小,所以要用滚动数组,存 ...

  4. Mybatis plus通用字段自动填充的最佳实践总结

    在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time.update_time.update_by.create_by等用来维护数据记录的创建时间.修改 ...

  5. C语言中二维数组声明时,探究省略第一维的原因

    我们在使用二维数组作为参数时,我们既可以指明这个数组各个维度的维数,同时我们也可以省略一维,但是二维却不能省略.why呢?由于编译器原理的限制,在一个数组Elemtype test[m][n]中,访问 ...

  6. cisco交换机路由器静态路由配置

    一.切换模式 router>en                           //用户模式enable router#conf t                      //特权模式 ...

  7. Centos 7.x系统下忘记用户登录密码,重置root密码的方法

    转载的,作为一个参考保存.谢谢:https://blog.csdn.net/userpass_word/article/details/81807316 1.开机后进入以下界面,然后按Esc或者E键编 ...

  8. jQuery 选项卡切换过渡效果

    <!DOCTYPE html> <head> <meta charset="utf-8"> <title></title> ...

  9. 【Source Insight】查找功能 Lookup References 详解

    1.Options Case Sensitive //区分大小写 Whole Words Only //全字匹配查找 Skip Inactive Code //跳过无效代码查找 Skip Commen ...

  10. WPF排版布局经验总结(干货)简短不疲倦

    本文不过多讲述wpf的基础布局控件,本文只记录WPF排版的技巧,这是个人的总结,不能符合所有情况,如果有何不对的地方,请评论指正,谢谢. 1.区域划分 在接手一个界面的时候,先纵观全局,将眼见的区域划 ...