当前位置:网站首页>Redis主从复制原理
Redis主从复制原理
2022-07-26 11:58:00 【墨天轮】
主从复制作用
Redis定义为KV,非关系型内存数据库。为什么快,是因为操作都在内存中进行,单线程不会涉及到多线程并发事物处理中的锁等待,所以存取和访问速度都很快。
Redis主从复制和其他数据库如MySQL主从复制原理都类似,都是为了如下原因而产生:
- 数据冗余:从库实现了在线热备,是除了持久化备份的另外一种方式
- 单点故障:主库异常后,可以切换至从库继续提供服务,提供高可用服务
- 负载均衡:可以结合读写分离(主库负责提供写操着,从库负责提供读操作),来分担服务器负载
- 高可用基础:除以上原因,主从复制还是哨兵和集群的实现基础,都依托主从复制来实现高可用
主从复制实现及原理
建立复制
Redis主从复制实现很简单,仅需一条命令即可:
假设现在有两个Redis实例,地址分别为127.0.0.1:6379和127.0.0.1:6380,我想让6380端口的实例成为6379实例的从库,则执行以下命令:127.0.0.1:6380> SLAVEOF 127.0.0.1 6379OK当然从节点建立复制还有另外两种方式:
- 配置文件:在从服务器的配置文件中加入 slaveof
- 启动命令:在redis-server启动命令后面加入 --slaveof
断开复制
通过slaveof no one断开复制关系。需要注意的是,从节点断开复制后数据依然存在,只是不再同步主节点的数据变化。
复制原理
- 执行命令:从库启动后,通过命令(slaveof master_ip master_port)保存主库信息,这时候复制流程还没有开始
- 建立连接:slave内部有个定时任务,每秒检查是否有新的master节点连接和复制,如果发现有,就跟master节点尝试建立socket网络连接(如果从节点无法建立连接,定时任务会无限重试直到连接成功或者执行slaveof no one取消复制)
- 发送ping命令:slave节点发送ping命令给 master节点
- 口令认证:如果master设置了requirepass,那么slave节点必须发送materauth的口令给master进行认证
- 数据同步:首次连接master会启动一个全量复制,将数据发送给slave实现同步
- 后续每次master接受到新数据都会将增量数据异步传送给从库,实现主从复制同步的过程
全量复制/同步
全量复制是Redis主从第一次建立复制时必须经历的的阶段也是Redis最早支持的复制方式。触发全量复制的命令是sync或者psync。redis2.8之前使用sync只能执行全量同步,2.8之后使用psync同时支持全量同步和部分同步(增量同步)。全量复制具体步骤如下:
- 从服务器会向主服务器发送 「PSYNC ? -1」 命令,请求主服务器执行「全量复制」操作。
- 主节点根据命令返回 FULLRESYNC
- 从节点记录主节点 ID 和 offset
- 主节点执行bgsave在后台生产RDB文件(耗时操作)并保存RDB到本地,并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令
- 主节点的bgsave执行完成后,将RDB文件发送给从节点(耗时操作);从节点首先清除自己的旧数据(如果数据量大,将成为耗时操作),然后加载接收的RDB文件(耗时操作),将数据库状态更新至主节点执行bgsave时的数据库状态
- 主节点将前述复制缓冲区中的所有写命令发送给从节点,从节点执行这些写命令,将数据库状态更新至主节点的最新状态
- 如果从节点开启了AOF,则会触发bgrewriteaof的执行,从而保证AOF文件更新至主节点的最新状态

说明:通过全量复制的过程可以看出,全量复制是非常重型的操作:
- 主节点通过bgsave命令fork子进程进行RDB持久化,该过程是非常消耗CPU、内存(页表复制)、硬盘IO的;
- 主节点通过网络将RDB文件发送给从节点,对主从节点的带宽都会带来很大的消耗
- 从节点清空老数据、载入新RDB文件的过程是阻塞的,无法响应客户端的命令;如果从节点执行bgrewriteaof,也会带来额外的消耗
部分复制/同步
正常运行时,当从节点正在复制主节点数据,如果出现网络闪断或者其他异常,从节点会让主节点补发丢失的命令数据,主节点只需要将复制缓冲区(repl-backlog-buffer)的数据发送到从节点就能够保证数据的一致性,相比较全量复制,成本小很多。步骤如下:
- 当从节点出现网络中断,超过了repl-timeout时间(默认值60秒),主节点就会中断复制连接
- 主节点会将请求的数据写入到“复制积压缓冲区”,repl-backlog-size 默认1MB
- 当从节点恢复,重新连接上主节点,从节点会将 offset 和主节点 id 发送到主节点
- 主节点校验后,如果偏移量的数后的数据在缓冲区中,就发送 cuntinue 响应 —— 表示可以进行部分复制
- 主节点将缓冲区的数据发送到从节点,保证主从复制进入正常状态
总结
- Redis 主从复制主要是通过 PSYNC 命令实现。
- 复制分为 部分复制 以及 完整复制。
- 部分复制通过 复制偏移量、复制积压缓冲区、主节点ID来实现。
- 完整复制通过 RDB 以及 复制积压缓冲区来实现。
- 主从复制主要解决的是 数据备份、读写分离等的问题。
参考文档
https://redis.io/docs/manual/replication/
边栏推荐
- Pytoch deep learning quick start tutorial -- mound tutorial notes (I)
- pytest接口自动化测试框架 | pytest之fixture介绍
- 线上一个隐匿 Bug 的复盘
- 基于 Flink CDC 实现海量数据的实时同步和转换
- Talking about web vitals
- 【活动早知道】LiveVideoStack近期活动一览
- 代码实例详解【可重入锁】和【不可重入锁】区别?
- Why BGP server is used in sunflower remote control? Automatic optimal route and high-speed transmission across operators
- Flink cdc 是不是只支持 sql-client的方式提交SQL脚本啊
- DS-112时间继电器
猜你喜欢

Test cases should never be used casually, recording the thinking caused by the exception of a test case

Real time synchronization and conversion of massive data based on Flink CDC

专访即构科技李凯:音视频的有趣、行业前沿一直吸引着我

Marriage seeking story

Understand the string class

Acwing727. Diamond pattern

Flink's real-time data analysis practice in iFLYTEK AI marketing business

JSJ-3/AC220V时间继电器

Ga-rpn: recommended area network for guiding anchors

On the construction and management of low code technology in logistics transportation platform
随机推荐
Pytest interface automated test framework | fixture call fixture
pytest接口自动化测试框架 | 使用装饰器修饰需要运行的用例
面试官:如何理解QPS,TPS,RT?
4.1 configure MySQL and register login module
使用fastJson中的JSONObject对象简化POST请求传参
向日葵资深产品总监技术分享:如何在AD域环境下应用
【倒计时10天】腾讯云音视频专场即将见面,千元大奖等你来拿!
pytest接口自动化测试框架 | fixture调用fixture
[ten thousand words long text] Based on LSM tree thought Net 6.0 C # realize kV database (case version)
PyCharm是真的强
How RFID works
Pytorch深度学习快速入门教程 -- 土堆教程笔记(二)
Harbor2.2 quick check of user role permissions
专访即构科技李凯:音视频的有趣、行业前沿一直吸引着我
Pytoch deep learning quick start tutorial -- mound tutorial notes (I)
MATLAB中strjoin函数使用
详解勒让德变换与共轭函数
Why is redis so fast? Redis threading model and redis multithreading
了解string类
虚拟偶像代言产品出问题谁负责? 且听律师分析