redis主从复制

1、概念

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

2、作用

主从复制在Redis中扮演着重要的角色,带来了以下几个主要的作用:

  1. 高可用性:通过将数据复制到多个从节点,即使主节点发生故障,从节点可替代主节点提供服务,从而保障系统的高可用性。
  2. 读写分离:主节点负责处理写入操作,从节点负责处理读操作,从而分担主节点的负载,提高系统的整体性能。
  3. 数据冗余备份:由于从节点是主节点的副本,主节点数据的备份可以在从节点上实现。
  4. **高可用基石:**主从复制还是哨兵和集群能够实施的基础。

3、配置

主从复制的配置涉及到主节点和从节点的设置,具体步骤如下:

  1. 配置主节点:在主节点的配置文件(redis.conf)中进行以下配置:
bash 复制代码
# 启用主节点
daemonize yes

# 设置主节点的监听IP和端口
bind <主节点IP>
port <主节点端口>

# 设置主节点的认证密码(可选)
requirepass <密码>

# 开启AOF持久化(可选,默认RDB持久化)
appendonly yes
  1. 配置从节点:在从节点的配置文件(redis.conf)中进行以下配置:
bash 复制代码
# 启用从节点
daemonize yes

# 设置从节点的监听IP和端口
bind <从节点IP>
port <从节点端口>

# 设置从节点的认证密码(与主节点一致)
requirepass <密码>

# 设置主节点的地址和端口
replicaof <主节点IP> <主节点端口>
  1. 启动节点:分别启动主节点和从节点:
bash 复制代码
redis-server redis.conf   # 启动主节点
redis-server redis.conf   # 启动从节点
  1. 验证复制:查看从节点的状态,确保它已成功连接到主节点:
xml 复制代码
redis-cli -h <从节点IP> -p <从节点端口> 

info replication

如果看到输出中有role:slave,且master_host和master_port显示正确的主节点地址和端口,说明主从复制已经配置成功。

4、原理

主从复制过程大致可分为3个阶段:建立连接阶段、数据同步阶段、命令传播阶段。

4.1、第一阶段:建立链接、协商同步

  • 在执行replicaof命令后,slave会向master发送psync命令,携带master的runID(实例ID)和offset(复制进度)参数,因为是第一次请求复制,所以runID为?,offset为-1。
  • master收到psync命令后返回FULLRESYNC命令,并携带master的runID和offset,slave保存。

这一步的目的是为全量复制做准备。

4.2、第二阶段:数据同步

  • 完成第一阶段工作后,master会执行bgsave命令生成RDB文件,并发送给slave。
  • slave在收到RDB文件后,先清空本地数据,再加载新的RDB文件数据。

4.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可以适当配置大一些

相关推荐
SimonKing11 分钟前
大V说’AI替代不了你’,但现实是——用AI的人正在替代你
java·后端·程序员
IT_陈寒12 分钟前
SpringBoot里的这个坑差点让我加班到天亮
前端·人工智能·后端
BingoGo1 小时前
Laravel13 + Vue3 的免费可商用 PHP 管理后台 CatchAdmin V5.2.0 发布
后端·php·laravel
rannn_1111 小时前
【Redis|高级篇1】分布式缓存|持久化(RDB、AOF)、主从集群、哨兵、分片集群
java·redis·分布式·后端·缓存
weixin_408099671 小时前
【实战教程】EasyClick 调用 OCR 文字识别 API(自动识别屏幕文字 + 完整示例代码)
前端·人工智能·后端·ocr·api·安卓·easyclick
添尹1 小时前
Go语言基础之指针
开发语言·后端·golang
GreenTea10 小时前
一文搞懂Harness Engineering与Meta-Harness
前端·人工智能·后端
我是大猴子12 小时前
Spring代理类为何依赖注入失效?
java·后端·spring
码事漫谈13 小时前
手把手带你部署本地模型,让你Token自由(小白专属)
前端·后端
码农BookSea14 小时前
ReAct:让大模型学会边想边做
后端·ai编程