主服务器是 Informix,版本从 9.40 到最新不等,数据库被设计为取消登录,无法更改。从服务器是最新的 PostgreSQL。主从是独立的机器,网络延迟是不可预测的。主模式是静态定义的、众所周知的并且不会更改,因此只有需要复制的数据。在master中,有三种类型的表:
- 数值数据表,通常是一个日期列、一个时间列和 15-300 个 int 列,由 2-3 个主键键控。数据永远不会更改,只会在设定的时间间隔(15、30 或 60 分钟)内添加一次,并在达到保留点时删除。复制数据集最多可以有 80,000 行,但通常在数百行范围内。这些数据需要以一种方式复制,从主到从。这种类型的表大约有 30 个,它们需要一次全部复制并尽可能快,通常在新的间隔集提交给主节点后不到一分钟。
- 混合数据表,包含日期、时间、整数和字符串类型,30-100 列,同样有 2-3 个主键。此数据也永远不会更改、不断添加并在达到保留点时被删除。数据集每小时最多 100,000 行。需要一种复制方式,主从。有几张这样的桌子,通常少于5张。
- 混合数据表,int和string类型,10列以内,2-3个主键。数据在很大程度上保持不变,偶尔会添加、编辑或删除。通常的复制集大小是不可预测的,但可能只有数百行。这些数据需要以尽可能快的速度双向复制。这种类型的表有几个,需要独立同步。
我一直在寻找可以满足我需要的现有工具,但看起来没有开源工具。我可能会根据自己的需要编写一个,并且我正在向 DB 专家寻求有关如何处理此任务的建议。
在我的估计中,可能没有一种算法可以涵盖所有用例,所以我实际上可能正在寻找两种或三种算法。这是我到目前为止发现的:
- 主更改触发触发器,将行 OID(Informix 有吗?)记录到临时表,将更改的行转储到文件,传输并加载。问题:如何缓冲触发器?主数据库未记录(无事务),因此触发器将在每次插入时触发。对主人的额外压力,不好。
- 在从机上添加一个 cron 作业,该作业将从主机中提取最新的日期/时间键,如果数据较新,则拉取它。问题:虽然定义了更新间隔,但实际上它是基于数据源时钟(不是主数据库时钟),它保证与从服务器时钟不同。更重要的是,可以有多个数据源,每个数据源都有不同的时钟,并且需要尽快复制数据。我在这里看到的唯一方法是不断地从从站轮询主站,希望在轮询到来时,所有数据都已提交(没有事务,记得吗?)。Kludgy,慢,不好。
- 在 Postgres 中添加 Informix 作为外部数据包装器并直接运行查询,而不是复制。优点:简单。缺点:Informix 连接器似乎处于 alpha 阶段,整个方法充其量只是一个未知因素。
这个话题我研究了一段时间,看来问题的核心是master端缺少事务。如果主数据库被记录,复制它会容易得多,但如果没有事务,任务会突然变得更加复杂。一方面,我如何确保没有受骗者?另一个,如何避免类型 3 表中的更新循环?考虑到所有这些,如何使复制尽可能快速反应?我的意思是数据更新和同步开始之间的延迟,数据传输完全是另一个话题。
任何输入表示赞赏。