项目场景:
一企业近期陆续开始升级办公与大数据系统,新的承包商。原有的数据库是某国内大品牌A,现在新的功能准备陆续迁移到大品牌B上。系统部署后,A依旧承担比较轻松的财务、仓库管理,B承担实时的线上业务。项目验收阶段,测试工程师发现A\B的数据录入后端日志有大量的IO超时错误,且效率低下。
先后把A厂运维、B厂运维喊过来解决,均无功而返。完全相同的配置和环境,在各自的厂内测试都是好的,搬过来就废了。
问题描述
数据传输过程中,TCP长连接终端频繁报错:
SocketTimeOutException: Read timed out
An I/O error occurred while sending to the backend.
原因分析:
此问题是在 keepalived 的 virtual_router_id 冲突导致的。 但局域网中是不同的数据库啊,怎么会冲突呢?查看后发现,A数据库、B数据库竟然底层都是 postgresql的分支,且发行版的 keepalived.conf中,virtual_router_id 都是默认值。
这个ID同一个集群要一致,集群之间要不同。否则,局域网网段内就会发生冲突。
解决方案:
临时方案:使用NAT代理,把数据库A映射到另一个网段。
永久方案:数据库A/B运维修改virtual_router_id。