面试题答案
一键面试可能导致数据不一致的情况
- 网络问题:网络延迟、中断可能使数据传输不完整或延迟,导致主从库数据不同步。
- 复制槽相关问题:如果复制槽出现故障,例如无法正常记录复制位置,可能导致数据丢失或重复复制,进而引发不一致。
- 事务处理异常:主库上事务提交后,在逻辑复制过程中,从库可能因某些错误(如约束冲突)无法正确应用事务,造成数据不一致。
- 版本兼容性:主从库PostgreSQL版本不一致或某些扩展版本差异,可能导致数据解析和应用的不一致。
通过配置参数解决问题
- wal_level:设置为
replica
或logical
,确保主库生成足够的逻辑日志用于逻辑复制,以保证从库能准确应用更改。例如在postgresql.conf
中设置wal_level = logical
。 - max_replication_slots:合理设置最大复制槽数量,避免因复制槽不足导致复制失败。如
max_replication_slots = 10
。 - max_wal_senders:配置主库允许的最大并发 WAL 发送进程数,防止因资源限制影响复制。如
max_wal_senders = 5
。
通过监控机制解决问题
- 复制延迟监控:通过查询
pg_stat_replication
视图,监控sent_lsn
和write_lsn
、flush_lsn
、replay_lsn
之间的差距,判断复制延迟情况。例如:
SELECT application_name, sent_lsn, write_lsn, flush_lsn, replay_lsn
FROM pg_stat_replication;
如果差距过大,可能存在网络或其他问题,需及时排查。
2. 复制槽状态监控:查询 pg_replication_slots
视图,检查复制槽是否正常工作。如:
SELECT slot_name, plugin, slot_type, active
FROM pg_replication_slots;
若有异常状态的复制槽,及时处理。
3. 事务应用监控:在从库上监控事务应用日志,查看是否有因约束冲突等原因导致事务无法应用的错误信息。开启合适的日志级别(如 log_statement = 'all'
),便于排查问题。同时,定期检查从库数据完整性,例如通过校验和等方式与主库数据对比。