3

主服务器是 Informix,版本从 9.40 到最新不等,数据库被设计为取消登录,无法更改。从服务器是最新的 PostgreSQL。主从是独立的机器,网络延迟是不可预测的。主模式是静态定义的、众所周知的并且不会更改,因此只有需要复制的数据。在master中,有三种类型的表:

  1. 数值数据表,通常是一个日期列、一个时间列和 15-300 个 int 列,由 2-3 个主键键控。数据永远不会更改,只会在设定的时间间隔(15、30 或 60 分钟)内添加一次,并在达到保留点时删除。复制数据集最多可以有 80,000 行,但通常在数百行范围内。这些数据需要以一种方式复制,从主到从。这种类型的表大约有 30 个,它们需要一次全部复制并尽可能快,通常在新的间隔集提交给主节点后不到一分钟。
  2. 混合数据表,包含日期、时间、整数和字符串类型,30-100 列,同样有 2-3 个主键。此数据也永远不会更改、不断添加并在达到保留点时被删除。数据集每小时最多 100,000 行。需要一种复制方式,主从。有几张这样的桌子,通常少于5张。
  3. 混合数据表,int和string类型,10列以内,2-3个主键。数据在很大程度上保持不变,偶尔会添加、编辑或删除。通常的复制集大小是不可预测的,但可能只有数百行。这些数据需要以尽可能快的速度双向复制。这种类型的表有几个,需要独立同步。

我一直在寻找可以满足我需要的现有工具,但看起来没有开源工具。我可能会根据自己的需要编写一个,并且我正在向 DB 专家寻求有关如何处理此任务的建议。

在我的估计中,可能没有一种算法可以涵盖所有用例,所以我实际上可能正在寻找两种或三种算法。这是我到目前为止发现的:

  1. 主更改触发触发器,将行 OID(Informix 有吗?)记录到临时表,将更改的行转储到文件,传输并加载。问题:如何缓冲触发器?主数据库未记录(无事务),因此触发器将在每次插入时触发。对主人的额外压力,不好。
  2. 在从机上添加一个 cron 作业,该作业将从主机中提取最新的日期/时间键,如果数据较新,则拉取它。问题:虽然定义了更新间隔,但实际上它是基于数据源时钟(不是主数据库时钟),它保证与从服务器时钟不同。更重要的是,可以有多个数据源,每个数据源都有不同的时钟,并且需要尽快复制数据。我在这里看到的唯一方法是不断地从从站轮询主站,希望在轮询到来时,所有数据都已提交(没有事务,记得吗?)。Kludgy,慢,不好。
  3. 在 Postgres 中添加 Informix 作为外部数据包装器并直接运行查询,而不是复制。优点:简单。缺点:Informix 连接器似乎处于 alpha 阶段,整个方法充其量只是一个未知因素。

这个话题我研究了一段时间,看来问题的核心是master端缺少事务。如果主数据库被记录,复制它会容易得多,但如果没有事务,任务会突然变得更加复杂。一方面,我如何确保没有受骗者?另一个,如何避免类型 3 表中的更新循环?考虑到所有这些,如何使复制尽可能快速反应?我的意思是数据更新和同步开始之间的延迟,数据传输完全是另一个话题。

任何输入表示赞赏。

4

1 回答 1

0

如果您不能以任何重要的方式更改主服务器,那么您将有一段时间进行任何类型的复制。您的基本问题是您没有真正的方法来实时处理复制更改而不跟踪已复制的更改,如果您无法更改主服务器,则无法添加。所以简短的回答是复制不是一个适合你的解决方案。考虑到 Informix 的一些其他特性,我会三思而后行,将其作为连续复制。

这导致了其他方法。最大的未知因素是网络可能不够可靠,无法仅链接数据库。这可能导致事务在等待高延迟连接的数据时挂起,从而导致各种其他问题。您可能可以使用 odbc fdw 和 informix 提供程序或使用 DBI-Link 和 DBD::Informix 来使用它,但这让我觉得这是您当前环境中的一个问题。您可以在 cron 作业中使用这些来定期填充更靠近您自己位置的第二个 PostgreSQL 服务器,因此我不会完全放弃该方法。

在我看来,您需要以一种或另一种方式将数据副本复制到您的 PostgreSQL 服务器。您可能需要执行 ETL 作业以定期导入数据。您可能希望使用辅助 postgresql 服务器和 FDW 或 DBI-Link 来提取数据。但这不太可能是实时的,不太可能是连续的。

tl; dr是您的环境并未真正设置为执行此操作。为了我的钱,我会推荐一种 ETL 方法并接受你的奴隶不会与主人同步。

于 2013-11-01T08:07:05.820 回答