Redis从入门到放弃(7):主从复制
1、概念
主从复制是Redis的一项重要特性,用于将一个Redis服务器(Master主节点)的数据复制到其他Redis服务器(Slave从节点),以实现数据的高可用性和读写分离。数据的复制是单向的,只能由主节点到从节点。

2、作用
主从复制在Redis中扮演着重要的角色,带来了以下几个主要的作用:
高可用性:通过将数据复制到多个从节点,即使主节点发生故障,从节点可替代主节点提供服务,从而保障系统的高可用性。
读写分离:主节点负责处理写入操作,从节点负责处理读操作,从而分担主节点的负载,提高系统的整体性能。
数据冗余备份:由于从节点是主节点的副本,主节点数据的备份可以在从节点上实现。
高可用基石:主从复制还是哨兵和集群能够实施的基础。
3、配置
主从复制的配置涉及到主节点和从节点的设置,具体步骤如下:
配置主节点:在主节点的配置文件(redis.conf)中进行以下配置:
# 启用主节点
daemonize yes # 设置主节点的监听IP和端口
bind <主节点IP>
port <主节点端口> # 设置主节点的认证密码(可选)
requirepass <密码> # 开启AOF持久化(可选,默认RDB持久化)
appendonly yes
配置从节点:在从节点的配置文件(redis.conf)中进行以下配置:
# 启用从节点
daemonize yes # 设置从节点的监听IP和端口
bind <从节点IP>
port <从节点端口> # 设置从节点的认证密码(与主节点一致)
requirepass <密码> # 设置主节点的地址和端口
replicaof <主节点IP> <主节点端口>
启动节点:分别启动主节点和从节点:
redis-server redis.conf # 启动主节点
redis-server redis.conf # 启动从节点
验证复制:查看从节点的状态,确保它已成功连接到主节点:
redis-cli -h <从节点IP> -p <从节点端口> info replication

如果看到输出中有role:slave,且master_host和master_port显示正确的主节点地址和端口,说明主从复制已经配置成功。
3、原理
主从复制过程大致可分为3个阶段:建立连接阶段、数据同步阶段、命令传播阶段。

3.1、第一阶段:建立链接、协商同步
- 在执行replicaof命令后,slave会向master发送psync命令,携带master的runID(实例ID)和offset(复制进度)参数,因为是第一次请求复制,所以runID为?,offset为-1。
- master收到psync命令后返回FULLRESYNC命令,并携带master的runID和offset,slave保存。
这一步的目的是为全量复制做准备。
3.2、第二阶段:数据同步
- 完成第一阶段工作后,master会执行bgsave命令生成RDB文件,并发送给slave。
- slave在收到RDB文件后,先清空本地数据,再加载新的RDB文件数据。
3.3、第三阶段:命令传播
- 在完成第一次全量复制后,master与slave会建立一个长连接和replication buffer缓冲区,master的写入命令都会存入缓冲区。同时,master也会通过这个长连接将repl buffer数据传播给slave,来保证数据一致性。
那么有人可能会问,如果主从节点之间网络短暂中断,如何保证数据一致性?
答案:增量复制。
在2.8以前只有全量复制,如果主从库在命令传播时出现了网络闪断,那么,从库就会和主库重新进行一次全量复制,开销非常大。因此从Redis 2.8 开始提供了增量复制的功能,在网络断了之后,主从库会采用增量复制的方式继续同步。

- savle在恢复网络后,会发送 psync 命令给master,此时的 psync 命令里的 offset 参数不是 -1。
- master收到该命令后,然后用 continue 响应命令告诉slave接下来采用增量复制的方式同步数据。
- 然后master将断网期间写入命令发送给slave,然后slave再执行这些命令。
写入命令除了写入repl buffer,还会写入repl backlog(复制积压缓冲区),默认大小为1M,在内存中为环形结构。主要用于根据offset找到增量数据。结构如下图:

注意点:
断开重连并不一定是增量复制。如上图所示,repl backlog为环形结构,如果网络断开时间太长,写入命令如果超过1M,旧的命令就会被覆盖。因此如果master offset和slave offset相差的数据已被覆盖则会通过全量复制。
因此,repl backlog可以适当配置大一些。
Redis从入门到放弃(7):主从复制的更多相关文章
- Redis 从入门到放弃
Redis 从入门到放弃 http://www.iocoder.cn/Fight/Redis-went-from-getting-started-to-quitting/
- redis从入门到放弃 -> 部署方案
单点部署方案 环境准备: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@ ...
- redis从入门到放弃 -> 简介&概念
一.redis简介 Redis是一款开源的.高性能的键-值存储.它常被称作是一款数据结构服务器. 当值支持的主要数据类型为:字符串(strings)类型,括哈希(hashes).列表(lists).集 ...
- Redis——从入门到放弃
redis简介 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, ...
- Redis从入门到精通:初级篇
原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...
- 编程从入门到放弃(Java)
1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利 ...
- Redis从入门到精通:初级篇(转)
原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...
- 后端API入门到放弃指北
后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一 ...
- Redis数据库入门基础,及优缺点介绍
简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 是一个高性能的key-value数据库.R ...
- Go从入门到放弃
Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...
随机推荐
- golang调用sdl2,播放pcm音频,报错signal arrived during external code execution。
golang调用sdl2,播放pcm音频,报错signal arrived during external code execution. win10 x64下测试成功,其他操作系统下不保证成功. 采 ...
- 都说DevOps落地难,到底难在哪里?也许你还没找到套路
当你打开这篇文章的时候,也许你也在为DevOps的落地而苦恼,也许你的组织正在尝试DevOps转型,作为一线的实践者,说说我对这个"落地难"的看法,欢迎交流不同看法- DevOps ...
- Selenium - 浏览器配置(2) - 浏览器默认下载路径设置
Selenium - 浏览器配置 浏览器下载路径设置 我们默认使用谷歌浏览器下载文件的时候,总会弹出窗口指定文件下载路径: 但是selenium不能对浏览器窗口以外的窗口做操作: 可以在谷歌配置信息中 ...
- cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本。
错误信息: cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本.有关详细信息,请参阅 https:/go.microsoft.com ...
- hadoop 2.7.7 ERROR datanode.DataNode: BlockSender.sendChunks() exception: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
最近在测试Hbase在windows上的单机版的功能. 版本:hadoop 2.7.7 hbase 2.0.0 错误: ERROR datanode.DataNode: BlockSender.se ...
- Cesium开发案例整理
weigis近几年越来越被人们所关注,但是二三维开发难度也比普通web要高出许多,不管我们是在在开发或者是学习过程中,往往需要耗费大量的时间去查阅资料,和研究官方案例, 而大多二三维的包(openla ...
- 客户线上反馈:从信息搜集到疑难 bug 排查全流程经验分享
写在前面:本文是我在前端团队的第三次分享,应该很少会有开发者写客户反馈处理流程以及 bug 排查的心得技巧,全文比较长,写了一个多星期大概1W多字(也是我曾经2年工作的总结),如果你有耐心阅读,我相信 ...
- 安卓第一课:gradle仓库的导入
今天装好android studio,结果刚进入就报错了: SSL peer shut down incorrectly 读注释发现原来是gradle下载文件不成功.果然,原来是vpn掉线了,上网查了 ...
- 关于进程、线程、协程的概念以及Java中的应用
进程.线程.协程 本文将从"操作系统"."Java应用"上两个角度来探究这三者的区别. 一.进程 在我本人的疑惑中,我有以下3个问题. 1.1为什么要引入进程? ...
- 从输入URI到浏览器渲染中间都经历了什么
这篇文章总共分为两个部分,第一部分我会把从输入url到浏览器渲染的整个流程给大致说一下.第二部分我就会一一介绍各个部分的详细作用. 一.从输入url到浏览器渲染的整个流程 1.DNS域名解析 2. ...