Redis超详细讲解高可用主从复制基础与哨兵模式方案


Posted in Redis onApril 07, 2022

高可用基础---主从复制

Redis的复制功能是支持将多个数据库之间进行数据同步,主数据库可以进行读写操作。当主数据库数据发生改变时会自动同步到从数据库,从数据库一般是只读的,会接收注数据库同步过来的数据。

一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库,默认情况下,每台服务器都是主节点,可以通过配置来设置Redis节点称为从数据库。

Redis超详细讲解高可用主从复制基础与哨兵模式方案

主从复制的原理

  • 当启动一个从节点时,它会发送一个 PSYNC 命令(分为全量复制和部分复制)给主节点;
  • 如果是从节点初次连接到主节点,那么会触发一次全量复制。此时主节点会启动一个后台线程,开始生成一份 RDB 快照文件;
  • 同时还会将从客户端 client 新收到的所有写命令缓存在内存中。RDB 文件生成完毕后, 主节点会将RDB文件发送给从节点,从节点会先将RDB文件写入本地磁盘,然后再从本地磁盘加载到内存中;
  • 接着主节点会将内存中缓存的写命令发送到从节点,从节点同步这些数据;
  • 如果从节点跟主节点之间网络出现故障,连接断开了,会自动重连,连接之后主节点仅会将部分缺失的数据同步给从节点。

主从复制配置

默认情况下,每个节点都是主节点,只需要配置从节点。可以通过复制Redis.conf配置文件,修改主要信息,例如:端口号、pid名称、log文件名称、dump.rdb名称等,可以修改配置,配置就永久有效,也可以通过命令形式做处理。

命令:info replication:查看当前库信息

Redis超详细讲解高可用主从复制基础与哨兵模式方案

命令:slaveof ip port :在从服务器上执行名,给定主服务器的端口和IP

命令:Slave no one :可以让从节点恢复为主机

示例

启动三个Redis服务,给定端口6380、6381、6382。给定6380为主节点

1、创建Redis实例

nohup redis-server --port 6380 >> /usr/local/redis/data/log/6380.log 2>&1 &
nohup redis-server --port 6381 >> /usr/local/redis/data/log/6381.log 2>&1 &
nohup redis-server --port 6382 >> /usr/local/redis/data/log/6382.log 2>&1 &
 
[root@redis ~]# ps -ef |grep redis
root      16421  16314  0 03:01 pts/1    00:00:00 redis-server *:6380
root      16427  16314  0 03:01 pts/1    00:00:00 redis-server *:6381
root      16431  16314  0 03:01 pts/1    00:00:00 redis-server *:6382

2、连接数据库并设置主从复制

Gong-Dezhe-MBP:log gongdezhe$ redis-cli -p 6380
127.0.0.1:6380> 
​
Gong-Dezhe-MBP:~ gongdezhe$ redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6380
OK
​
Gong-Dezhe-MBP:~ gongdezhe$ redis-cli -p 6382
127.0.0.1:6382> slaveof 127.0.0.1 6380
OK

主从配置完成后,主节点信息:

Redis超详细讲解高可用主从复制基础与哨兵模式方案

从节点信息:

Redis超详细讲解高可用主从复制基础与哨兵模式方案

数据同步测试:

Redis超详细讲解高可用主从复制基础与哨兵模式方案

Redis超详细讲解高可用主从复制基础与哨兵模式方案

高可用方案---哨兵模式sentinel

搭建好的主从复制方案可以达到数据同步目的,但是当主服务器宕机后,需要手动将一个从服务器切换为主服务器,这个过程需要人工干预,同时切换会导致Redis的写入功能不可用。需要一种能够自动完成master故障发现并能够将一个Slave切换为master,这个时候需要哨兵sentinel模式,哨兵模式可以自动切换主从节点。

哨兵模式简介

sentinel是官方提供的高可用方案,其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。同时 sentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程。所以监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器信息。

Redis超详细讲解高可用主从复制基础与哨兵模式方案

sentinel工作过程:

  • 通过向主服务器和从服务器发送ping命令,让服务器返回运行状态。
  • 当哨兵监测到master宕机,会自动将一个slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

关于sentinel的三个定时任务:

  • 每1秒每个sentinel对其他sentinel和redis节点执行ping操作,心跳检测。
  • 每10秒每个sentinel会对master和slave执行info命令,目的是发现slave结点,确定主从关系。
  • 每2秒每个sentinel通过master节点的channel交换信息(pub/sub)。master节点上有一个发布订阅的频道(sentinel:hello)。sentinel节点通过sentinel:hello频道进行信息交换(对节点的"看法"和自身的信息),达成共识。

哨兵工作原理

  • 每个Sentinel以每秒钟一次的频率向它所知道的Master,Slave以及其他 Sentinel实例发送一个 PING命令。
  • 如果一个实例距离最后一次有效回复 PING 命令的时间超过指定值, 则这个实例会被 Sentine 标记为主观下线。
  • 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel要以每秒一次的频率确认Master是否真正进入主观下线状态。
  • 当有足够数量的 Sentinel(大于等于配置文件指定值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。若没有足够数量的 Sentinel同意 Master 已经下线, Master 的客观下线状态就会被解除。若 Master重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
  • 哨兵节点会选举出哨兵 leader,负责故障转移的工作。
  • 哨兵 leader 会推选出某个表现良好的从节点成为新的主节点,然后通知其他从节点更新主节点信息。

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

Redis超详细讲解高可用主从复制基础与哨兵模式方案

哨兵故障修复原理

1.主观下线:

当主服务器发生故障时,此时一个sentinel发现了故障,系统并不会马上进行failover过程(这个现象称为主观下线),它会向网络中的其他Sentinel进行确认。

2.客观下线:

接着其他Sentinel也陆续发现故障,这个时候其中一个Sentinel就会发起投票。一定数量的哨兵(在配置文件中指定)确认Master被标记为主观下线,此时将Master标记为客观下线。

3.sentinel的leader选举:

要想完成故障切换(将故障master剔除,并将一个slave提升为master)就必须先选举一个leader。最先发现故障的sentinel向其他哨兵发起请求成为leader,其他哨兵在没有同意别的哨兵的leader请求时,就会把票投给该sentinel。当半数以上的sentinel投票通过后就认定该sentinel为leader。接下来的故障切换有该leader完成。

4.master选举:

leader选好后将故障master剔除,从slave中挑选一个成为master。遵照的原则如下:

  • slave的优先级
  • slave从master那同步的数据量,那个slave多就优先。

5.新Master再通过发布订阅模式通知所有sentinel更新监控主机信息。

6.故障的主服务器修复后将成为从服务器继续工作。

示例:故障发生时:

Redis超详细讲解高可用主从复制基础与哨兵模式方案

故障切换:

Redis超详细讲解高可用主从复制基础与哨兵模式方案

Master重新上线后:

Redis超详细讲解高可用主从复制基础与哨兵模式方案

sentinel.conf配置讲解

配置哨兵配置文件 sentinel.conf

#Sentinel monitor <name> <ip> <port> <quorum>

  • name :redis主服务名称,可以自行命名,但是在一个sentinel网络中,一个redis主服务只能有一个名称;
  • ip和port :redis主服务的IP地址和端口号.
  • quorum :表示要将这个主服务器判断为失效并下线至少需要2个sentinel同意
  • protected-mode :关闭保护模式(默认情况下,redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和sentinel的protected-mode修改为no,若只修改redis node,从远程连接sentinel后,依然是无法正常使用的,且sentinel的配置文件中没有protected-mode配置项,需要手工添加。依据redis文档的说明,若protected-mode设置为no后,需要增加密码证或是IP限制等保护机制,否则是极度危险的。)

Redis超详细讲解高可用主从复制基础与哨兵模式方案

Redis超详细讲解高可用主从复制基础与哨兵模式方案

Redis超详细讲解高可用主从复制基础与哨兵模式方案

Redis超详细讲解高可用主从复制基础与哨兵模式方案

哨兵模式的优点

  • 哨兵集群、基于主从复制模式,所有的主从复制优点,它会有
  • 主从可以切换,故障可以转移,系统的可用性会更好
  • 哨兵模式就是主从模式的升级,手动转自动,更加健壮

哨兵模式的缺点

  • Redis不好在线扩展,集群容量一旦到达上限,在线扩容十分麻烦
  • 实现哨兵模式的配置很麻烦,里面有很多选择

到此这篇关于Redis超详细讲解高可用主从复制基础与哨兵模式方案的文章就介绍到这了,更多相关Redis 高可用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis通过6379端口无法连接服务器(redis-server.exe闪退)
May 08 Redis
基于Redis实现分布式锁的方法(lua脚本版)
May 12 Redis
解析高可用Redis服务架构分析与搭建方案
Jun 20 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
详解Redis的三种常用的缓存读写策略步骤
May 06 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 Redis
redis复制有可能碰到的问题汇总
Apr 03 #Redis
 Redis 串行生成顺序编码的方法实现
浅谈Redis 中的过期删除策略和内存淘汰机制
一文搞懂Redis中String数据类型
Apr 03 #Redis
使用Redis做预定库存缓存功能
sentinel支持的redis高可用集群配置详解
redis sentinel监控高可用集群实现的配置步骤
You might like
咖啡的传说和历史
2021/03/03 新手入门
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
2020/11/09 jQuery
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
C语言面试题
2013/05/19 面试题
大学生村官典型材料
2014/01/12 职场文书
工会换届选举方案
2014/05/21 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
linux目录管理方法介绍
2022/06/01 Servers