Percona XtraDB Cluster 5.7.20同步复制测试失败求助
排查Percona XtraDB Cluster同步复制测试失败的问题
我完全理解你的困惑——Percona XtraDB Cluster(PXC)主打的就是强同步复制能力,按官方描述,事务提交后理论上其他节点应该立刻能查到数据。咱们一步步拆解可能的问题:
1. 先确认集群基础状态是否正常
先在每个节点执行以下SQL,检查集群健康度:
SHOW STATUS LIKE 'wsrep_%';
重点关注这几个核心指标:
wsrep_cluster_size:确认数值是3(假设你是3节点集群),如果不对,说明有节点未正常加入集群。wsrep_ready:必须为ON,否则节点无法参与复制流程。wsrep_local_state_comment:必须是Synced,如果显示Joining/Donor等状态,说明节点还在全量同步或存在异常。wsrep_flow_control_paused:如果这个值接近1,说明流控被触发了——你配置的gcs.fc_limit=256和fc_factor=0.99阈值过于严格,一旦节点间同步速度跟不上,写操作会被暂停,导致插入事务的写集无法及时传到其他节点。
2. 危险参数可能破坏强同步保证
你的wsrep_provider_options里有两个关键参数:
pc.ignore_quorum=true;pc.ignore_sb=true;
这两个参数的作用是允许节点在无集群quorum(多数节点在线)或脑裂场景下继续处理写请求,这直接打破了PXC的强同步机制:
- 如果测试时集群有节点离线,或存在网络分区,node1的事务可能只在本地提交,根本不会同步到其他节点。
- 正常3节点集群的quorum是2,只要有2个节点在线就能保证写集被多数节点确认。建议先注释掉这两个参数,重启所有节点后再测试。
3. 验证测试代码的事务逻辑
虽然你提到插入事务已提交,但还是要确认:
- PHP代码是否真的执行了
COMMIT?如果关闭了自动提交(autocommit=0)却未手动提交,事务只会在node1的当前会话中可见,其他节点无法查询到。 - 测试时是否在提交后立刻发起查询?理论上PXC是提交前等待多数节点确认,但极端情况下如果网络延迟极低,可适当增加100ms左右的等待再查询(不过这种情况概率极低)。
4. 检查写集同步情况
在node1执行插入事务后,立刻在node1和node2执行:
SHOW STATUS LIKE 'wsrep_last_committed';
如果两个节点的数值不一致,说明写集根本没同步过去。此时再查看wsrep_local_recv_queue(接收队列)和wsrep_local_send_queue(发送队列),若队列不为0,大概率是集群网络问题或流控导致的同步阻塞。
总结建议
- 先关闭
pc.ignore_quorum和pc.ignore_sb参数,重启所有节点,确保集群处于健康的Synced状态。 - 调整流控参数:将
gcs.fc_limit设为1024或更高,fc_factor设为0.75左右,避免轻易触发流控。 - 确认测试代码的事务提交逻辑正确,比如开启自动提交或手动执行
COMMIT。 - 重新测试,同时监控wsrep状态指标,观察写集是否正常同步。
内容的提问来源于stack exchange,提问作者ureyni
相关产品推荐
相关产品推荐

