文档章节

redis主从复制常见的一些坑

吴正宇
 吴正宇
发布于 2018/04/03 18:08
字数 1607
阅读 6.6K
收藏 25

「深度学习福利」大神带你进阶工程师,立即查看>>>

读写分离的问题

1.数据复制的延迟

读写分离时,master会异步的将数据复制到slave,如果这是slave发生阻塞,则会延迟master数据的写命令,造成数据不一致的情况

解决方法:可以对slave的偏移量值进行监控,如果发现某台slave的偏移量有问题,则将数据读取操作切换到master,但本身这个监控开销比较高,所以关于这个问题,大部分的情况是可以直接使用而不去考虑的。

2.读到过期的数据

我们知道redis在删除过期key的时候,是有两种策略,第一种是懒惰型策略,即只有当redis操作这个key的时候,发现这个key过期,就会把这个key删除。第二种是定期采样一些key进行删除。

针对上面说的两种过期策略,会有个问题,即如果我们过期key的数量非常多,而采样速度根本比不上过期key的生成速度时会造成很多过期数据没有删除,但在redis里master和slave达成一种协议,slave是不能处理数据的(即不能删除数据)而我们的客户端没有及时读到到过期数据同步给master将key删除,就会导致slave读到过期的数据(这个问题已经在redis3.2版本中解决)

主从配置不一致

这个问题一般很少见,但如果有,就会发生很多诡异的问题

例如:

1. maxmemory配置不一致:这个会导致数据的丢失

原因:例如master配置4G,slave配置2G,这个时候主从复制可以成功,但,如果在进行某一次全量复制的时候,slave拿到master的RDB加载数据时发现自身的2G内存不够用,这时就会触发slave的maxmemory策略,将数据进行淘汰。更可怕的是,在高可用的集群环境下,如果我们将这台slave升级成master的时候,就会发现数据已经丢失了。

2. 数据结构优化参数不一致(例如hash-max-ziplist-entries):这个就会导致内存不一致

原因:例如在master上对这个参数进行了优化,而在slave没有配置,就会造成主从节点内存不一致的诡异问题。

规避全量复制

首先,我们知道,redis复制有全量复制和部分复制两种(这个我前面博客有写到)而全量复制的开销是很大的。那么我们来看看,如何尽量去规避全量复制。

1.第一次全量复制

当我们某一台slave第一次去挂到master上时,是不可避免要进行一次全量复制的,那么,我们如何去想办法降低开销呢?

方案1:小主节点,例如我们把redis分成2G一个节点,这样一来,会加速RDB的生成和同步,同时还可以降低我们fork子进程的开销(master会fork一个子进程来生成同步需要的RDB文件,而fork是要拷贝内存快的,如果主节点内存太大,fork的开销就大)。

方案2:既然第一次不可以避免,那我们可以选在集群低峰的时间(凌晨)进行slave的挂载。

2.节点RunID不匹配

例如我们主节点重启(RunID发生变化),对于slave来说,它会保存之前master节点的RunID,如果它发现了此时master的RunID发生变化,那它会认为这是master过来的数据可能是不安全的,就会采取一次全量复制

解决办法:对于这类问题,我们只有是做一些故障转移的手段,例如master发生故障宕掉,我们选举一台slave晋升为master(哨兵或集群)

3.复制积压缓冲区不足

我在全量复制与部分复制那篇文章提到过,master生成RDB同步到slave,slave加载RDB这段时间里,master的所有写命令都会保存到一个复制缓冲队列里(如果主从直接网络抖动,进行部分复制也是走这个逻辑),待slave加载完RDB后,拿offset的值到这个队列里判断,如果在这个队列中,则把这个队列从offset到末尾全部同步过来,这个队列的默认值为1M。而如果发现offset不在这个队列,就会产生全量复制。

解决办法:增大复制缓冲区的配置 rel_backlog_size 默认1M,我们可以设置大一些,从而来加大我们offset的命中率。这个值,我们可以假设,一般我们网络故障时间一般是分钟级别,那我们可以根据我们当前的QPS来算一下每分钟可以写入多少字节,再乘以我们可能发生故障的分钟就可以得到我们这个理想的值。

规避复制风暴

什么是复制风暴?举例:我们master重启,其master下的所有slave检测到RunID发生变化,导致所有从节点向主节点做全量复制。尽管redis对这个问题做了优化,即只生成一份RDB文件,但需要多次传输,仍然开销很大。

1.单主节点复制风暴:主节点重启,多从节点全量复制

解决:更换复制拓扑如下图:

1.我们将原来master与slave中间加一个或多个slave,再在slave上加若干个slave,这样可以分担所有slave对master复制的压力。(这种架构还是有问题:读写分离的时候,slave1也发生了故障,怎么去处理?)

2.如果只是实现高可用,而不做读写分离,那当master宕机,直接晋升一台slave即可。

2.单机器复制风暴:机器宕机后的大量全量复制,如下图:

当machine-A这个机器宕机重启,会导致该机器所有master下的所有slave同时产生复制。(灾难)

解决:

1.主节点分散多机器(将master分散到不同机器上部署)

2.还有我们可以采用高可用手段(slave晋升master)就不会有类似问题了。

吴正宇
粉丝 4
博文 14
码字总数 10883
作品 0
程序员
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.3K
3
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
7
WebUI自动化测试框架--Dagger

Dagger是网易杭州研究院QA团队开发的一个轻量级、运行稳定的WebUI自动化测试框架,主要基于Selenium及TestNg可以认为是对Selenium进行二次封装的一个框架(俗称 造轮子 )。之所以把这个轮子...

ChenKan
2013/03/05
2.8W
6
PHP框架--XiunoPHP

XiunoPHP 是一款面向高负载应用的 PHP 开发框架,PHPer 通过它可以快速的简单的开发出高负载项目。 XiunoPHP 前身名为 Xiuno Framework,更名后版本号从 v1.0 开始计算。已经经过了多年的实际...

匿名
2013/03/20
2.5K
0
Redis 分片实现--Redis Shard

redis-shard 是 Redis 分区的 Python API ,基于对 key 和 key tag 进行 CRC32 checksum 计算,可参考文章 http://antirez.com/post/redis-presharding.html . 该项目由知乎网开发。 使用限制...

匿名
2012/10/24
5.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

Visa首次发行5亿美元绿色债券和任命首席可持续发展官,扩大对可持续发展的承诺

旧金山--(美国商业资讯)--全球领先的支付技术公司Visa (NYSE: V)今天宣布,公司昨日已成功为其首次发行的总计5亿美元的绿色债券定价,将支付0.75%的半年息票率,2027年8月15日到期。该绿色债...

osc_zjm9j6vk
39分钟前
23
0
Perceptive Advisors携手多个战略联盟创立联拓生物(LianBio)并建构营运平台

联拓生物与BridgeBio Pharma、MyoKardia、BridgeBio Pharma子公司Navire Pharma和QED Therapeutics合作,在中国和亚洲主要市场开发尖端疗法并进行商业化,将创新科学业务拓展至全球,并建立了...

osc_923iryp1
40分钟前
0
0
导入Maven项目时jar包依赖配置失败:Failed to read artifact descriptor for xxx

导入Maven项目时有时会遇到无法自动配置Configrations和yml文件的情况,完了去配置里一看,Library是空的。maven导入jar包的时候应该出了问题。如图操作maven提示重新import change即可。...

osc_45mm6g1p
41分钟前
15
0
SpringBoot手动装配,自定义Enable模块

前言 前面我们介绍了简单详细的SpringBoot自动配置原理解析,今天这篇文章主要是介绍下如何是实现手动配置,自定义Enable模块, 基于注解驱动实现 基于注解的驱动实现是最基本的自定义Enabl...

osc_m8arvi7m
42分钟前
0
0
Esp8266 Web Server 应用实例 - Simple Web Console

Esp8266 Web Server 应用实例 - Simple Web Console 本文旨在向读者介绍使用Esp8266 WiFi板搭建Web Server应用的原理。示例向读者展示了如何创建Web Console,以及如何使Web Console与NodeM...

osc_xdc1vjza
43分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部