《Redis设计与实现》读书笔记(二十四) ——Redis主从复制原理

《Redis设计与实现》读书笔记(二十四)

——Redis主从复制原理

(原创内容,转载请注明来源,谢谢)

一、概述

redis中,可以用slaveof命令,或者在配置中设置slaveof选项,让一个服务器去复制另一个服务器。去复制的服务器称为从服务器(slave),被复制的称为主服务器(master)。

主服务器的增删改,在从服务器中都会一并有改动。

redis2.8之前(不含2.8)的版本(下称旧版),和之后(含2.8)的版本(下称新版),对于复制的做法有所不同,将分别分析。

二、旧版复制原理

复制分为同步和命令传播两个部分。同步操作将从服务器的数据库状态更新至主服务器当前所处的数据库状态;命令传播是用于主服务器状态修改,导致主从不一致时,让主从重新一致的做法。

1、同步

同步发送在第一次生成主从服务器,或者从服务器断线后重连的情况。

当客户端发送slaveof命令,就会进行一次同步。同步命令是通过向主服务器发送sync命令来实现的,步骤如下:

1)从服务器向主服务器发送sync命令。

2)主服务器收到sync命令后,会执行bgsave命令,生成rdb文件,并且开启写缓冲区,将bgsave期间的数据暂存。

3)主服务器将rdb文件发送给从服务器,从服务器导入文件。

4)主服务器将缓冲区的写命令发送给从服务器,从服务器进行更新。

2、命令传播

当主从同步完毕后,后续主服务器的状态改变,就不是再用rdb的方式,否则效率太低。

因此,为了保证主从一直,主服务器会把每个影响主服务器状态的命令,都发送给从服务器,从服务器执行命令后就和主服务器一致。

3、存在问题

对于断线重连,还需要主服务器bgsave并且自身导入rdb文件,效率比较低。因为主从服务器数据不一致的地方只有从服务器断线重连的这段时间的命令,而不是全部的命令。

sync操作非常耗费资源:

1)主服务器bgsave命令会耗费主服务器大量I/O、内存、CPU。

2)主服务器发送rdb给从服务器,会占用大量网络资源。

3)从服务器接收rdb到完全载入完毕之前,无法对外提供服务。

三、新版复制原理

1、概述

从2.8版本的redis开始,采用psync命令进行主从复制,替代sync,该命令具有完整重同步和部分重同步两种模式。

1)完整重同步

完整重同步仅用于初次复制,步骤和sync一致。

2)部分重同步

部分重同步用于断线重连的情况,主服务器会在从服务器重连后,将断线期间的命令都发送给从服务器,从服务器只需要接收并执行这些命令即可实现同步。

部分重同步有三部分构成:

1)主服务器的复制偏移量和从服务器的复制偏移量。

2)主服务器的复制积压缓冲区。

3)服务器的运行ID。

2、复制偏移量

主从服务器会分别维护一个复制偏移量,主服务器每次向从服务器传播N字节的数据,偏移量就加N,同样从服务器接收N字节也加N。

通过对比这个偏移量,就可以判断是否一致,如果偏移量一样就是一致,否则不一致。

3、复制积压缓冲区

当主从复制偏移量不一致,则判断出主从不一致,此时则需要用到复制积压缓冲区,来实现主从同步。

1)实现方式

复制积压缓冲区是由主服务器维护的,固定长度的先进先出的队列,默认大小是1MB。固定长度的运作方式和可变长度的区别是,当新push一个元素时,如果长度超过固定长度,则队列的第一个元素会被弹出。

当主服务器进行命令传播时,除了将命令发送给从服务器,还会将命令写入复制积压缓冲区内。

主服务器的复制积压缓冲区内会保存最近一部分的写命令,并且缓冲区会为队列中的每个字节记录相应的复制偏移量。

当从服务器断线重连时,如果偏移量还在这个缓冲区内,则会使用部分重同步;如果偏移量已经不再这个缓冲区,说明从服务器断线太久,则会采用完全重同步。

2)复制积压缓冲区大小设置

如果主服务器要大量写操作,或者主从重连速度慢,则1MB不太适合。如果每次断线重连后都要完全重同步,则该缓冲区就没有意义了。

大小可以用公式进行估算:second*write_size_per_second。

其中,second是从服务器断线后重连上的平均时间,write_size_per_second是主服务器平均每秒的写数据量。

具体大小,可以设置为上述估算值的两倍。修改大小值是通过修改配置文件中的属性进行的,属性名称repl-backlog-size。

4、服务器运行ID

实现部分重同步还需要用到服务器运行ID。每个redis服务器,无论主从,都有自己的运行ID,ID是在服务器启动的时候随机生成,由40个随机的16进制字符组成。

从服务器会保存主服务器的运行ID,当断线重连时,会发送之前的主服务器运行ID。如果这个ID和当前的主服务器一致,则可以部分重同步;如果不一致,说明之前就不是连的这个主服务器,则要完全重同步。

——written by linhxx 2017.09.12

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏电光石火

无人值守,检测程序正常运行,遇故障则重启服务

在某些情况下,如系统负载过大server无法申请到内存而挂掉、server底层发生段错误、server占用内存过大被内核Kill,或者被某些程序误杀。那se...

1655
来自专栏CSDN技术头条

让面试官颤抖的Tomcat系统架构!

Tomcat 非常的模块化,只要找到最核心的模块,问题游刃而解,了解整体架构对深入了解 Tomcat 至关重要!

1224
来自专栏田京昆的专栏

Memcached 与 Redis 实现的对比

memcached 和 redis,作为近些年最常用的缓存服务器,相信大家对它们再熟悉不过了。前两年还在学校时,我曾经读过它们的主要源码,如今写篇笔记从个人角度...

32.3K15
来自专栏Java Edge

操作系统之文件管理一、文件与文件系统二、文件控制块和文件目录三、文件的物理结构四、文件系统的实现五、文件系统实例(UNIX)六、UNIX文件系统一、文件系统实例(FAT)二、文件操作的实现三、文件系统

3356
来自专栏崔庆才的专栏

利用 Flask+Redis 维护 IP 代理池

目前有很多网站提供免费代理,而且种类齐全,比如各个地区、各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定。所以我们...

2K0
来自专栏Eternally运维

Nginx配置文件的理解

4517
来自专栏跟着阿笨一起玩NET

通过内存盘提高MSMQ的消息吞吐能力

转载:http://www.ikende.com/blog/00f2634be4704b79a3e22439edeb1343

602
来自专栏武军超python专栏

2018年8月14日TCP网络编程及具体代码

静态文件?顾名思义,静态文件就是那些不会改变的文件,例如视频音乐,图片等类似的文件 NT平台:指的是windows NT操作系统,是windows在199...

764
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(十五) ——Redis AOF持久化原理与实现

《Redis设计与实现》读书笔记(十五) ——Redis AOF持久化原理与实现 (原创内容,转载请注明来源,谢谢) 一、概述 AOF(Append OnFil...

3295
来自专栏jouypub

Linux系统优化

net.ipv4.ip_local_port_range = 1024 65000

792

扫码关注云+社区