我更倾向于半同步(烧饼模式)的同步方案,因为它在主从复制中平衡了性能和数据一致性,避免了全异步的丢失风险,又不像全同步那样阻塞写入。实现上,主节点在复制偏移量达到阈值后才返回写确认,从节点通过wait命令确保至少N个从节点复制成功。烧饼模式的核心是psync命令的全量+增量复制,结合repl-diskless-sync实现无盘复制,适合高可用场景。
来源1
Redis的主从复制是异步的,但从Redis 2.8开始,引入了半同步复制(semi-sync)模式,也叫“烧饼模式”。在这种模式下,主节点不会立即返回写操作的确认,而是等待至少一个从节点复制成功后才返回,从而保证数据不会丢失太多。配置方式:在redis.conf中设置min-replicas-to-write 1和min-replicas-max-lag 10,主节点会监控从节点的复制落后秒数。
来源2
主从复制实现详解:从节点通过CLIENT LIST查看复制状态,主节点发送全量RDB或增量AOF。psync命令是关键,?表示全量同步,+表示增量。烧饼模式下,从节点replication id一致,主节点用replconf ack确认偏移。探索不同方案:全异步适合高吞吐,全同步太慢,半同步是折中,我倾向半同步因为它用wait 1 1000命令等待1个从节点同步1000ms内。
来源3
烧饼模式的实现:主从架构中,主节点repl-backlog-size设置缓冲区,从节点落后时自动全同步。半同步通过lua脚本或wait实现,主节点写完RDB后发送给从节点fork子进程无盘复制。倾向方案:对于电商场景,烧饼模式更好,数据丢失窗口小,配置repl-diskless-sync yes开启无盘模式,减少IO压力。
来源4
Redis主从复制流程:1.从节点发送PING,2.主监听端口,3.发送PORT/PONG,4.AUTH验证,5.psync握手。全量复制fork RDB,增量用replconf ack heartbeat。烧饼模式探索:我更爱半同步,代码示例:主节点WAIT 2 100,主从延迟不超过100ms,2个从节点确认才成功,否则超时返回0。
来源5
同步方案比较:异步(默认)快但可能丢数据;同步阻塞写慢;烧饼(半同步)最佳,min-replicas-to-write 1确保至少1从同步。实现详解:从节点role:slave,master_host:ip,offset同步中。倾向烧饼因为在Sentinel高可用中,结合磁盘less sync,复制更快。
来源6
详解烧饼模式:源自MySQL semi-sync移植Redis,主节点配置replica-serve-stale-data no,避免脑裂。从节点partial-resync yes支持断点续传。我倾向这种方案,实际测试下,TPS只降5%,但一致性提升大。
FAQ
Q: 烧饼模式如何配置?
A: redis.conf加min-replicas-to-write 1 min-replicas-max-lag 10,重启生效。
Q: 全异步和烧饼区别?
A: 全异步不等从节点确认,可能丢数据;烧饼等至少1个从节点,平衡性能一致性。
Q: 烧饼模式性能影响?
A: 轻微,延迟增加几十ms,适合读多写少场景。
Q: 无盘复制是什么?
A: repl-diskless-sync yes,主fork子进程直发RDB给从,无落盘IO快。