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 27 Redis
Redis高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
Redis基于Bitmap实现用户签到功能
Jun 20 Redis
压缩Redis里的字符串大对象操作
Jun 23 Redis
Redis主从配置和底层实现原理解析(实战记录)
Jun 30 Redis
Redis 持久化 RDB 与 AOF的执行过程
Nov 07 Redis
redis缓存存储Session原理机制
Nov 20 Redis
Redis命令处理过程源码解析
Feb 12 Redis
浅谈Redis跟MySQL的双写问题解决方案
Feb 24 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
解决 redis 无法远程连接
May 15 Redis
redis复制有可能碰到的问题汇总
Apr 03 #Redis
 Redis 串行生成顺序编码的方法实现
浅谈Redis 中的过期删除策略和内存淘汰机制
一文搞懂Redis中String数据类型
Apr 03 #Redis
使用Redis做预定库存缓存功能
sentinel支持的redis高可用集群配置详解
redis sentinel监控高可用集群实现的配置步骤
You might like
php 带逗号千位符数字的处理方法
2012/01/10 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
微信小程序实现展示评分结果功能
2019/02/15 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
教你安装python Django(图文)
2013/11/04 Python
python实现文件快照加密保护的方法
2015/06/30 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
Python urllib2运行过程原理解析
2020/06/04 Python
python实现自动清理重复文件
2020/08/24 Python
python飞机大战游戏实例讲解
2020/12/04 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
行政执法作风整顿剖析材料
2014/10/11 职场文书
2014年团支书工作总结
2014/11/14 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
小平您好观后感
2015/06/09 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
Java 异步任务计算FutureTask
2022/04/28 Java/Android