本是同根生-双数据库集群keepalived virtual_route_id冲突导致连接故障

项目场景:

一企业近期陆续开始升级办公与大数据系统,新的承包商。原有的数据库是某国内大品牌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。

你可能感兴趣的:(现场工程师,海豚大象,数据库,双集群,java,keepalived,postgresql)