Flink CDC中postgresql 全量表同步导致wal日志太大了,导致flink无法读取?可以直接把wal删掉吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用Flink CDC进行PostgreSQL全量表同步时,如果WAL日志过大导致Flink无法正常读取,直接删除WAL日志并不是一个安全的解决方案。以下是详细的原因分析和解决方法:
WAL(Write-Ahead Logging)是PostgreSQL确保数据一致性和可靠性的核心机制。它记录了数据库的所有变更操作,用于故障恢复、逻辑复制和增量同步等场景。如果直接删除WAL日志,可能会导致以下问题: - 数据一致性破坏:Flink CDC依赖WAL日志来捕获增量数据。如果WAL日志被删除,可能导致Flink CDC无法正确读取增量数据,进而引发数据丢失或不一致。 - 复制中断:PostgreSQL的Replication Slot会保留未消费的WAL日志。如果直接删除这些日志,可能会导致Replication Slot失效,进而中断CDC任务。 - 实例锁定风险:如果WAL日志堆积导致磁盘空间不足,直接删除可能会引发数据库实例锁定,影响业务运行。
因此,直接删除WAL日志并不是推荐的操作。
在Flink CDC全量同步过程中,WAL日志过大的常见原因包括: 1. 全量同步阶段未完成:Flink CDC在全量同步阶段会扫描历史数据,同时增量数据仍然会被写入WAL日志。如果全量同步耗时较长,WAL日志会持续增长。 2. 非活跃的Replication Slot未清理:如果存在未使用的或延迟的Replication Slot,PostgreSQL会保留这些Slot对应的WAL日志,导致日志堆积。 3. 消费端延迟:Flink CDC作为WAL日志的消费者,如果未能及时上传消费位点信息(LSN),PostgreSQL会保留未消费的日志。 4. 参数配置不合理:例如wal_keep_segments
或wal_keep_size
设置过高,导致过多的WAL日志被保留。
针对上述问题,可以采取以下措施来缓解WAL日志过大的问题:
SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_insert_lsn(), restart_lsn)) AS delay_size
FROM pg_replication_slots;
如果发现某些Slot的状态为INACTIVE
且延迟较大,可以考虑删除这些Slot:
SELECT pg_drop_replication_slot('slot_name');
注意:删除INACTIVE
的Replication Slot后,PostgreSQL会自动清理与之相关的WAL日志。
execution.checkpointing.interval: 5min
wal_keep_segments
(PostgreSQL 12之前):建议设置为128。wal_keep_size
(PostgreSQL 12及之后):建议设置为2048MB。max_wal_size
:建议根据实例内存动态调整,公式为LEAST(GREATEST(DBInstanceClassMemory/2097152, 2048), 16384)
。min_wal_size
:建议设置为LEAST(GREATEST(DBInstanceClassMemory/8388608, 256), 8192)
。scan.incremental.snapshot.backfill.skip=true
注意:此配置仅适用于下游系统支持幂等性的情况,否则可能导致数据重复。
在Flink CDC全量同步过程中,WAL日志过大是一个常见问题,但直接删除WAL日志可能会导致数据丢失或复制中断。建议通过清理非活跃的Replication Slot、调整Checkpoint间隔时间、优化WAL参数以及提高消费端性能等方式来解决问题。如果问题仍未解决,可以联系阿里云技术支持获取进一步帮助。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。