主从复制是一种数据库复制技术,用于在多个数据库服务器之间同步数据。
为什么要使用主从复制:
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> # 如果主节点设置了密码,需要在此配置
首先启动主节点,然后启动从节点。从节点在启动时将尝试连接到指定的主节点,并开始数据同步过程。