面试题答案
一键面试冲突检测
- 原理:PostgreSQL通过跟踪事务的执行顺序和修改内容来检测复制冲突。例如,不同节点上相同数据行被不同事务以不同方式修改,就会被检测为冲突。
- 实现方式:利用事务ID(XID)、日志序列号(LSN)等信息。在流复制中,备库会对比接收到的日志与本地数据状态,通过分析日志中的修改操作以及相关事务标识,判断是否存在冲突。
处理策略
- 停止复制并报错
- 原理:当检测到无法自动解决的严重冲突时,系统认为继续复制可能导致数据不一致,所以采取停止复制的方式,避免错误进一步扩散。
- 实现方式:备库检测到冲突后,向主库发送错误信息,同时自身停止应用复制日志,等待人工干预。例如,主库和备库对同一行数据进行了不同的更新操作且无法协调时,备库会停止复制并抛出类似“replication conflict detected”的错误。
- 自动重试
- 原理:对于一些可能由于瞬时原因(如网络波动等)导致的冲突,系统尝试自动重试复制操作,期望在重试时冲突已消除。
- 实现方式:备库在检测到冲突后,暂停一小段时间(可配置),然后重新尝试应用复制日志。通常会设置最大重试次数,若超过次数仍无法解决冲突,则采取其他策略(如停止复制)。
- 基于配置的冲突解决
- 原理:管理员可以根据业务需求配置冲突解决规则。比如,优先采用主库的数据(假设主库数据更权威),或者按照一定的逻辑(如时间戳最新优先)来决定采用哪一个修改。
- 实现方式:通过修改PostgreSQL的配置文件(如
postgresql.conf
)或使用特定的系统表(如pg_replication_origin
相关表)来设置冲突解决策略。例如,设置hot_standby_feedback = on
,备库可以向主库反馈冲突信息,主库根据反馈调整后续的复制行为,以优先采用主库的修改。