Informix到Postgres,连续数据复制算法

时间:2013-07-12 20:40:59

标签: postgresql informix database-replication

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

  1. 数字数据表,通常是一个日期列,一个时间列和15-300个int列,由2-3个主键键入。数据永远不会更改,仅在设置的时间间隔(15,30或60分钟)中添加一次,并在达到保留点时删除。复制数据集最多可达80,000行,但通常在数百行范围内。这个数据需要以一种方式复制,从主到奴。大约有30个这种类型的表,它们需要一次性地尽快复制,通常在新的间隔集提交给主服务器后不到一分钟。
  2. 混合数据表,包括日期,时间,整数和字符串类型,30-100列,同样是2-3个主键。此数据也不会更改,连续添加,并在达到保留点时删除。数据集每小时最多100,000行。需要一种方式复制,从主到奴。有几个这样的表,通常不到5个。
  3. 混合数据表,包含int和字符串类型,少于10列,2-3个主键。数据基本上保持不变,偶尔添加,编辑或删除。通常的复制集大小是不可预测的,但可能会有数百行。这些数据需要尽可能快地以两种方式复制。有一些这种类型的表,它们需要独立同步。
  4. 我一直在寻找能够做到我需要的现有工具,但看起来没有一个是开源的。我可能会根据自己的需要编写一个,我正在寻找DB大师关于如何处理这项任务的建议。

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

    1. 主更改上的触发触发器,记录行OID(Informix将它们具有?)到临时表,将更改的行转储到文件,传输并加载。问题:如何缓冲触发器?主DB未记录(无事务),因此触发器将在每个INSERT上触发。对主人的额外压力,并不好。
    2. 在从属设备上添加一个cron作业,该作业将从主设备中提取最新的日期/时间键,如果数据较新,请将其拉​​出。问题:虽然定义了更新间隔,但实际上它是基于数据源时钟(非主数据库时钟),它保证与从服务器时钟不同。更多的是,可以有几个数据源,每个数据源都有不同的时钟,并且数据需要尽快复制。我看到的唯一方法就是不断地从奴隶轮询主人,希望在民意调查进入时,数据全部提交(没有交易,记得吗?)。 Kludgy,慢,不好。
    3. 在Postgres中添加Informix作为外部数据包装器并直接运行查询,而不是在复制时烦恼。优点:简洁。缺点:Informix连接器似乎处于alpha阶段,整个方法充其量只是一个未知因素。
    4. 我一直在研究这个话题,似乎问题的核心是主方缺乏交易。如果主数据库被记录,复制它会容易得多,但没有事务,任务突然变得复杂得多。首先,我如何确保没有欺骗?另一个,如何避免类型3表中的更新循环?考虑到所有这些,如何使复制尽可能快速反应?我的意思是数据更新和同步开始之间的延迟,数据传输是另一个主题。

      赞赏任何意见。

1 个答案:

答案 0 :(得分:0)

如果你无法以任何重要的方式改变主人​​,你就会有任何复制的时间。您的基本问题是,您没有真正的方法来实时处理复制更改,而无需跟踪已复制的更改,如果您无法更改主文件,则无法添加更改。所以简短的回答是,复制不是可以为您工作的解决方案。考虑到Informix的其他一些功能,我会考虑将其作为连续复制。

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

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

tl; dr是你的环境没有真正设置来做到这一点。对于我的钱,我建议采用ETL方法,并接受你的奴隶不会与主人同步。