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如何一键部署脚本
Apr 12 Redis
Redis数据结构之链表与字典的使用
May 11 Redis
深入浅析Redis 集群伸缩原理
May 15 Redis
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
你真的了解redis为什么要提供pipeline功能
Jun 22 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
Redis Cluster集群动态扩容的实现
Jul 15 Redis
浅谈redis整数集为什么不能降级
Jul 25 Redis
redis 存储对象的方法对比分析
Aug 02 Redis
redis数据结构之压缩列表
Mar 21 Redis
Redis分布式锁的7种实现
Apr 01 Redis
Redis特殊数据类型HyperLogLog基数统计算法讲解
Jun 01 Redis
redis复制有可能碰到的问题汇总
Apr 03 #Redis
 Redis 串行生成顺序编码的方法实现
浅谈Redis 中的过期删除策略和内存淘汰机制
一文搞懂Redis中String数据类型
Apr 03 #Redis
使用Redis做预定库存缓存功能
sentinel支持的redis高可用集群配置详解
redis sentinel监控高可用集群实现的配置步骤
You might like
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
jQuery滚动加载图片实现原理
2015/12/14 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
对python中的iter()函数与next()函数详解
2018/10/18 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
python中pivot()函数基础知识点
2021/01/03 Python
数字漫画:comiXology
2020/06/13 全球购物
毕业生求职推荐信
2013/11/04 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
企业挂职心得体会
2014/09/10 职场文书
班主任高考寄语
2015/02/26 职场文书
公司人事管理制度
2015/08/05 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
python实现网络五子棋
2021/04/11 Python
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers