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存储数据类型及存取值方法
May 08 Redis
详解Redis主从复制实践
May 19 Redis
详解Redis瘦身指南
May 26 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
在项目中使用redis做缓存的一些思路
Sep 14 Redis
解决Redis启动警告问题
Feb 24 Redis
redis数据结构之压缩列表
Mar 21 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
详解Redis的三种常用的缓存读写策略步骤
May 06 Redis
Redis全局ID生成器的实现
Jun 05 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
redis复制有可能碰到的问题汇总
Apr 03 #Redis
 Redis 串行生成顺序编码的方法实现
浅谈Redis 中的过期删除策略和内存淘汰机制
一文搞懂Redis中String数据类型
Apr 03 #Redis
使用Redis做预定库存缓存功能
sentinel支持的redis高可用集群配置详解
redis sentinel监控高可用集群实现的配置步骤
You might like
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
php中define用法实例
2015/07/30 PHP
Redis构建分布式锁
2017/03/28 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
js创建对象的方式总结
2015/01/10 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
跟老齐学Python之list和str比较
2014/09/20 Python
python中urllib模块用法实例详解
2014/11/19 Python
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
Python每天必学之bytes字节
2016/01/28 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
Linux下python3.7.0安装教程
2018/07/30 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
python第三方库学习笔记
2020/02/07 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
Python使用xpath实现图片爬取
2020/09/16 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
家居饰品店创业计划书
2014/01/31 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书