@


在开始之前,我们先来看看Redis的主从复制

主从复制原理:

  1. 从服务器向主服务器发送SYNC命令。
  2. 主服务器接到SYNC命令后,会调用BGSAVE命令,创建一个RDB文件,并使用缓冲区记录接下来执行的所有写命令。
  3. 当主服务器执行完BGSAVE命令后,会向从服务器发送RDB文件,而从服务器则会接收并执行这个文件。
  4. 主服务器将缓冲区存储的所有写命令发送给从服务器执行。

---------

Redis主从复制使用的是RDB备份方式来同步主从服务器的数据的。

同步开始之后,通过主库命令传播的方式,主动复制方式实现。

2.8以后实现PSYNC饿机制,实现断线重连。

Redis主从复制的背景问题



Reids主从复制可将主节点数据同步给从节点,从节点此时有两个作用:

  1. 一旦主节点宕机,从节点作为主节点的备份可以随时顶上来.
  2. 扩展主节点的读能力,分担主节点的读压力.

.

一旦主节点宕机,从节点上位,那么就需要人为修改所有应用方的主节点地址(指定新的master地址),还需要命令所有从节点复制新的主节点.

这个问题很麻烦,而redis-sentinel就可以很好的解决这个问题.


Redis-Sentinel



    Redis-Sentinel是redis官方推荐的高可用性能解决方案,当用redis做master-slave的高可用时,如果master本机宕机,redis本身或者客户端都没有实现主从切换的功能,而redis-sentinel是一个独立运行的进程,用于监控多个maser-slave集群,其自动发现master宕机,进行自动切换:slave > master


Sentinel主要功能

  • 不时的监控redis是否良好运行,如果节点不可达就会对节点做下线标示.
  • 如果被标示的是主节点,则sentinel就会和其它的sentinel节点“协商”,如果其它节点也认为主节点不可达,就会选举一个sentinel节点来完成自动故障转移.
  • 在master-slave进行切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换.

Sentinel工作原理



每一个Sentinel以每秒钟一次的频率向它所知的所有Master、Slave以及其它Sentinel实例发送一个PING命令.



如果一个实例(Instance)距离最后一次有效回复PING命令的时间超过down-after-milliseconds选项所指定的值,则这个实例会被Sentinel标记为主观下线.



如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel都会以每秒一次的频率确认这个Master的确进入了主观下线状态.



当有足够数量的Sentinel(大于等于配置文件中指定的值)在指定的时间范围内确认这个Master的确进入了主观下线状态,那么这个Master会被标记为客观下线.



在一般情况下,每个Sentinel会以每10秒一次的频率向它已知的所有Master、Slave发送INFO命令.



当有Master被Sentinel标记为客观下线时,Sentinel向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次.



若没有足够数量的Sentinel同意Master已经下线,则此Master的客观下线状态就会被移除.


主观下线和客观下线



主观下线

Subjectively Down,简称SDOWN,指的是当前Sentinel实例对某个redis服务器做出的下线判断



客观下线

Objectively Down,简称ODOWN,指的是多个Sentinel实例在对Master Server做出SDOWN判断,并且通过SENTINEL is-master-down-by-addr命令互相交流之后,得出的Master Server下线判断,然后开启failover.



SDOWN

适合于Master和Slave,只要一个Sentinel发现Master进入了ODOWN,这个Sentinel就可能会被其它Sentinel推选出,并对下线的主服务器执行自动故障迁移操作.



ODOWN

只适用于Master,对于Slave的Redis实例,Sentinel在将它们判断为下线前不需要进行协商,所以Slave的Sentinel永远不会到达ODOWN.

主从复制架构图



Redis Sentinel架构图



Sentinel是redis一个进程,不存储数据,只负责监控redis.



关于Redis的发布订阅,详见此文献【Redis发布订阅】






开始配置主从复制

搭建环境:

一台Redis服务器(版本redis-5.0.2)

三个Redis实例(一个主节点Master,两个从节点Slave)

配置文件


主节点 7001.conf

port 7001
daemonize yes
logfile /usr/local/redis-5.0.2/logs/7001.log
dbfilename dump-7001.rdb
dir /usr/local/redis-5.0.2/db/7001/

从节点 7002.conf

port 7002
daemonize yes
logfile /usr/local/redis-5.0.2/logs/7002.log
dbfilename dump-7002.rdb
dir /usr/local/redis-5.0.2/db/7002/ # 指定主节点
slaveof 127.0.0.1 7001

从节点 7003.conf

port 7003
daemonize yes
logfile /usr/local/redis-5.0.2/logs/7003.log
dbfilename dump-7003.rdb
dir /usr/local/redis-5.0.2/db/7003/ # 指定主节点
slaveof 127.0.0.1 7001

验证主从关系


在主节点上查看主从通信关系





在从节点上查看主从通信关系

此时,一主双从已经搭建完毕了,可在Master上写入些数据,然后在Slave查看.


开始配置Redis Sentinel

搭建环境:

包含上面搭建主从的所有环境

还增加了三个redis-sentinel实例(27001.conf、27002.conf、27003.conf)

配置文件


27001.conf

port 27001
daemonize yes
dir "/usr/local/redis-5.0.2/db/"
logfile "/usr/local/redis-5.0.2/logs/27001.conf" sentinel monitor mymaster 127.0.0.1 7001 2
# mymaster:主节点的别名
# 当前Sentinel节点监控 127.0.0.1 7001 这个主节点
# 2:表示主节点失败至少需要2个Sentinel节点同意 sentinel down-after-milliseconds mymaster 30000
# 每个Sentinel节点都要定期发PING命令来判断Redis数据节点和其余Sentinel节点是否可达
# 这里配置为30000毫秒,即超过30秒未收到某个节点的PING命令且未收到回复,则判定不可达 sentinel parallel-syncs mymaster 1
# 当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点
# 原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1 sentinel failover-timeout mymaster 180000
# 设定故障转移的超时时间为180000毫秒

27002.conf、27003.conf的配置与上面的配置(27001.conf)差异仅在于端口.

启动哨兵:redis-sentinel 配置文件

启动后,哨兵的配置文件会被重写入sentinel myid等信息.

验证哨兵集群


[root@fedora conf]# redis-cli -p 27001 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:7003,slaves=2,sentinels=3
# 看到最后一条信息即正确配置了哨兵集群
# name=mymaster -> 哨兵别名
# status=ok -> 状态OK
# address=127.0.0.1:7003 -> 监控的地址
# slaves=2 -> 当前有2个从节点
# sentinels=3 -> 当前共有3个哨兵

到这里,哨兵集群已经搭建完毕了.

不用说,此时你肯定是想去干掉主节点了吧,先别慌,我们来看看下面的监控扩扑图.

监控扩扑图

验证故障转移的大致思路

  • 干掉主节点的Redis进程7001端口,等待down-after-milliseconds配置的时间后,观察从节点是否会进行新的master选举,进行切换.
  • 重新恢复旧的“master”节点,查看此时的redis身份.

【Redis哨兵集群】的更多相关文章

  1. Linux - redis哨兵集群实例

    目录 Linux - redis哨兵集群实例 命令整理 配置流程 Linux - redis哨兵集群实例 命令整理 官网地址:http://redisdoc.com/ redis-cli info # ...

  2. helm部署Redis哨兵集群

    介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客户端通知. 如下图: Redis Sentinel 故障转移过程: 从这 ...

  3. 11.Redis 哨兵集群实现高可用

    作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis mast ...

  4. python连接redis哨兵集群

    一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度 二.python 连接 redis 哨兵集群 1. 安装redis包 pip install redis 2 ...

  5. redis哨兵集群搭建

    下载redis jar包redis-4.0.11.tar.gz放在/data/redis目录下 解压 命令:tar -zxvf redis-4.0.11.tar.gz 解压后如图所示 在/usr/lo ...

  6. Redis进阶实践之十 Redis哨兵集群模式

    一.引言             上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  7. redis哨兵集群+spring boot 2.×

    Ubuntu集群构建篇 redis-cli:不跟参数,默认访问localhost:6379端口,无密码登陆 redis-cli -h ${host} -p ${port} -a ${password} ...

  8. redis哨兵集群环境搭建

    一.哨兵的介绍 哨兵(sentinal)是redis集群架构中非常重要的一个组件,主要功能如下: 集群监控,负责监控redis master和slave进程是否正常工作 消息通知,如果某个redis实 ...

  9. redis哨兵集群、docker入门

    redis-sentinel主从复制高可用 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果m ...

随机推荐

  1. XCL-Chart柱形图的期望线/分界线

    周日在柱形图上加了两个小功能,当中之中的一个是加上了期望线/分界线,功能非常小,但我个人非常喜欢这个功能(好像之前也没看到别的图表库原生支持这个. ) 主要是加上这些小小的横线后,能非常明显的区分出数 ...

  2. Google代码规范工具Cpplint的使用

    Cpplint是一个python脚本,Google使用它作为自己的C++代码规范检查工具. 假设你所在的公司也使用Google C++代码规范,那么你有必要了解下Cpplint. 以下说一下Cppli ...

  3. 具体解释C++引用——带你走进引用的世界

     一.介绍引用 首先说引用是什么,大家能够记住,引用就是一个别名,比方小王有个绰号叫小狗.他的妈妈喊小狗回家吃饭.那就是在喊小王回家吃饭. 接下来我们用两行代码来声明一个引用(就拿小王和小狗来说吧 ...

  4. <a>标签是什么意思 怎么使用?

    转自:https://www.imooc.com/qadetail/190881 (1) a标签的作用:超链接,用于跳转到别的网页. (2) a标签的用法:<a href="网址&qu ...

  5. jzoj3454 表白(love)解题报告(01分数规划+DP)

    题目链接:https://jzoj.net/senior/#contest/show/2414/2 题目描述: 鸡腿是CZYZ的著名DS,但是不想追妹子的DS不是好GFS,所以鸡腿想通过表白来达到他追 ...

  6. 1.CMD命令

    CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本)1. appwiz.cpl:程序和功能 2. calc:启动计算器 3. certmgr. ...

  7. 【DNN控件】

    <dnn:DNNDataGrid ID="show" runat="server" DataSourceID="ObjectDataSource ...

  8. VS自定义开发向导中的vsdir文件的简单说明

    作者:朱金灿 来源:http://blog.csdn.net/clever101 VS自定义开发向导中有一个vsdir文件.这个文件指定了在VS中项目的标题.默认工程名等内容.下面对vsdir文件做一 ...

  9. 加载等待loading

    自己写的一个小插件,还有很多需要完善... (function ($) {    $.fn.StartLoading = function (option) {        var defaultV ...

  10. vue中makeMap方法的使用 (定义注册一些值 后期方便使用)

    function makeMap ( str, expectsLowerCase ) { var map = Object.create(null); var list = str.split(',' ...