Airbyte同步MySQL至Snowflake时连接意外中断问题求助
问题背景
Airbyte部署在EC2 t2.medium实例(CPU使用率60%-70%,存储16GB),同步少量MySQL表到Snowflake时正常,但同步全部表时出现连接中断错误,部分表虽显示成功日志,但整体同步会在读取MySQL一段时间后停止。
错误信息
Nested Stack Trace: ** BEGIN NESTED EXCEPTION ** java.io.EOFException MESSAGE: Can not read response from server. Expected to read 1,843 bytes, read 841 bytes before connection was unexpectedly lost
相关日志示例
部分表成功日志
2023-08-08 16:10:25 [42mnormalization[0m > 184 of 201 START table model <snowflake_schema>.<table_name>..................................................... [RUN]
2023-08-08 16:10:26 [42mnormalization[0m > 180 of 201 OK created table model <snowflake_schema>.<table_name>........................................................ [[32mSUCCESS 1[0m in 1.86s]
数据源读取中断日志
2023-08-08 15:56:31 [44msource[0m > INFO i.a.d.j.s.AdaptiveStreamingQueryConfig(accept):40 Set new fetch size: 138428 rows
2023-08-08 15:56:31 [44msource[0m > INFO i.a.d.j.s.AdaptiveStreamingQueryConfig(accept):40 Set new fetch size: 137718 rows
2023-08-08 15:56:31 [44msource[0m > ERROR i.a.d.j.StreamingJdbcDatabase$1(tryAdvance):107 SQLState: S1000, Message: Error retrieving record: Unexpected Exception: java.io.EOFException message given: Can not read response from server. Expected to read 1,876 bytes, read 735 bytes before connection was unexpectedly lost.
解决步骤
1. 修改MySQL JDBC连接参数
EOFException本质是大流量传输时连接被意外断开,在Airbyte的MySQL数据源配置中添加以下参数:
useCompression=true:启用数据压缩,减少传输数据量connectTimeout=60000、socketTimeout=180000:延长连接和套接字超时时间,避免长时间读取被断开useCursorFetch=true、defaultFetchSize=10000:强制使用游标读取,限制单次抓取行数,降低单次传输负载
2. 降低同步并发度
全表同步时并发过高会导致EC2或MySQL负载过载:
- 在同步配置中,将并发读取数从默认值调低至3-5
- 启用表级同步顺序执行,避免同时同步多个大表
3. 排查EC2网络稳定性
- 通过CloudWatch查看EC2实例的网络监控,确认是否存在数据包丢失或延迟波动
- 若跨区域同步,将Airbyte实例切换至与MySQL同区域,减少网络传输损耗
4. 调整MySQL服务端配置
- 检查并调高
wait_timeout和interactive_timeout参数,确保超时时间大于单表同步的最长耗时 - 临时增加
max_connections值,避免因并发连接数耗尽导致连接被拒绝
5. 固定Airbyte抓取大小
日志显示自适应抓取大小被调至13万+行,过大的单次抓取会增加连接压力:
- 在MySQL数据源高级设置中,强制设置
fetch size为5000-10000,禁用自适应调整
内容的提问来源于stack exchange,提问作者user15915737

