Replica(副本)与主服务器(Master)的数据同步是分布式系统中保障高可用性、负载均衡和数据冗余的关键环节。其核心目标是通过高效的日志传递与重放机制,确保副本数据与主服务器数据保持一致(或最终一致),同时平衡性能与可靠性。
根据主服务器是否等待副本确认,同步模式可分为三类:
主服务器将写操作记录到本地日志(如MySQL的binlog、Redis的repl_backlog)后,无需等待副本确认即可向客户端返回成功。这种模式的优点是对主服务器性能影响极小,吞吐量高;缺点是存在数据延迟(副本可能落后主服务器几毫秒到几秒),若主服务器在日志传播前故障,会导致少量数据丢失。
主服务器执行写操作后,必须等待至少一个副本确认(如Kafka的ISR列表中的副本、MySQL的半同步复制)才返回成功。这种模式的优点是能保证主从数据强一致性(主从数据实时同步);缺点是增加了写操作的延迟(取决于最慢副本的响应速度),且若副本故障,主服务器可能无法写入。
折中方案,主服务器只需等待一个副本(或指定数量的副本)确认,其余副本仍采用异步复制。这种模式的优点是兼顾了性能与一致性(至少有两个节点拥有最新数据);缺点是若确认副本故障,会退化为异步复制。
Redis采用主从异步复制,流程分为全量同步(首次同步)和增量同步(日常同步):
SYNC命令,主节点执行BGSAVE生成RDB文件并发送给从节点;从节点清空本地数据,加载RDB文件;主节点将RDB期间的写命令记录到repl_backlog(环形缓冲区),并发送给从节点执行。replid(复制ID)和offset(同步偏移量);主节点判断replid一致且offset在repl_backlog范围内,将差量命令发送给从节点执行。若offset超出repl_backlog范围(如从节点断线时间过长),则触发全量同步。MySQL采用基于日志的异步复制,核心组件为binlog(二进制日志)和relay log(中继日志):
IO线程连接主节点,请求binlog变化;主节点启动Log Dump线程将binlog发送给从节点;SQL线程读取relay log中的事件,重放写操作,实现数据同步。Kafka采用Leader-Follower模式(领导者-追随者),通过**ISR(In-Sync Replicas,同步副本集)**保障一致性:
ACK确认,Leader更新HW(High Watermark,高水位)(表示已同步的最大偏移量);replica.lag.time.max.ms(默认10秒),则被踢出ISR。repl_backlog_size(Redis):避免从节点断线后因offset超出repl_backlog范围而触发全量同步;rpl_semi_sync_master_wait_for_slave_count=1,保证至少一个副本同步;INFO replication(Redis)、SHOW SLAVE STATUS(MySQL)监控lag(延迟),及时处理断线或性能瓶颈。免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。