redis详细教程(6.主从复制)

主从复制是一种数据库复制技术,用于在多个数据库服务器之间同步数据。

为什么要使用主从复制:

redis主从复制可以提高系统的可靠性和稳定性,保证数据可用,实现了读写分离,即使主节点出现故障,从节点仍然可以提供数据。这是持久化之外的一种数据冗余方式。

当从节点启动时,或者当它决定与一个新的主节点建立复制关系时,它会向主节点发送一个PSYNC命令。这个命令的目的是请求与主节点进行数据同步。

主节点收到PSYNC命令后,会判断是否可以进行部分同步(即增量同步),还是需要进行全量同步。如果从节点之前已经同步过,并且主节点有能力进行部分同步,它会尝试部分同步。但在初始同步的情况下,或者主节点无法进行部分同步时,它会执行全量同步。

全量同步过程

创建快照

主节点开始执行一个BGSAVE命令,这个命令会在后台生成当前数据集的快照(RDB文件)。此时主节点开始缓冲所有从现在开始收到的写命令,以确保从节点在加载快照后能够继续同步最新的数据变化。

发送快照

一旦快照生成完成,主节点会将这个RDB文件发送到从节点。从节点接收到RDB文件后,会将其加载到内存中,从而获得主节点数据集的一个完整副本。

发送缓冲区命令

在从节点加载完RDB文件之后,主节点会将自开始创建快照以来缓冲的所有写命令发送给从节点,从节点会执行这些命令,确保其数据状态与主节点保持一致。

通过这个过程,从节点能够获得主节点的数据副本,并开始在后续的操作中接收和执行主节点的写命令,以保持数据的同步。

增量同步(部分同步)过程

在初始同步完成后,主从节点之间会进行增量同步,也称为部分同步。

主节点和从节点都维护一个复制偏移量(offset),这是一个不断增加的计数器,用于记录主节点处理过的写命令的数量。

当从节点与主节点断开连接后重新连接,它会告诉主节点它最后一次同步时的复制偏移量。

主节点会根据从节点提供的复制偏移量,在它的复制缓冲区(replication backlog)中查找对应的同步点。

如果复制缓冲区足够大,能够包含从节点断开连接时的数据,主节点就可以从这个点开始发送后续的写命令给从节点。

主节点将从同步点开始,发送所有新的写命令给从节点,从节点接收到这些命令后,会按照相同的顺序执行它们,从而更新其数据集,使其与主节点的数据集保持一致。

心跳机制

主从节点之间会定期发送心跳包以维持连接状态。

从节点会每隔一定时间向主节点发送REPLCONF ACK <offset>命令,报告自己的复制偏移量(offset)。

主节点可以通过心跳包来检测从节点的存活状态,并判断复制是否滞后。

主从复制的一些问题

数据一致性问题:在网络延迟或故障时,可能会出现数据短暂不一致的情况。

复制延迟:如果主节点的写操作非常频繁,从节点可能会出现复制延迟。

资源消耗:全量同步过程中,主节点生成快照和传输数据会消耗大量CPU和带宽资源。

使用主从复制:

配置主节点

通常,主节点不需要特别配置,因为它默认就是以主节点模式运行的。但是,为了确保数据的安全性和可恢复性,建议在主节点上启用持久化功能(AOF或RDB)。

配置从节点

在从节点的配置文件(通常是redis.conf)中,需要添加以下配置项:

slaveof <master-ip> <master-port> # 指定主节点的IP地址和端口

masterauth <master-password> # 如果主节点设置了密码,需要在此配置

首先启动主节点,然后启动从节点。从节点在启动时将尝试连接到指定的主节点,并开始数据同步过程。

相关推荐
Arbori_2621511 分钟前
获取oracle表大小
数据库·oracle
王强你强18 分钟前
MySQL 高级查询:JOIN、子查询、窗口函数
数据库·mysql
草巾冒小子19 分钟前
brew 安装mysql,启动,停止,重启
数据库·mysql
用户62799471826226 分钟前
南大通用GBase 8c分布式版本gha_ctl 命令-HI参数详解
数据库
斯汤雷34 分钟前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
SQLplusDB41 分钟前
Oracle 23ai Vector Search 系列之3 集成嵌入生成模型(Embedding Model)到数据库示例,以及常见错误
数据库·oracle·embedding
喝醉酒的小白1 小时前
SQL Server 可用性组自动种子设定失败问题
数据库
chem41111 小时前
Conmon lisp Demo
服务器·数据库·lisp
爱的叹息1 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
m0_555762901 小时前
QT 动态布局实现(待完善)
服务器·数据库·qt