对我正在尝试构建的流程采取何种方法提出疑问。使用PostgreSQL和Python。
情景:
所以:
streamofdata ===> [数据库A] ---->过程----> [数据库B]
数据库A相当大(40 GB)并且还在不断增长。我的问题是关于什么是尚未处理的新数据的确定并放入B.确定哪些行仍然需要处理的最佳方法是什么。
每次在尚未处理的内容上匹配主键不是我想要的方式
因此,假设新行120到130在一段时间内进入数据库A.所以我的最后一行处理行是119.是否有正确的方法来查看最后一行id(主键)119处理并说现在应该处理除此之外的任何内容?
还想知道是否有人对此类“实时”数据处理有任何进一步的资源。从技术上讲,我不确定我在寻找什么。
答案 0 :(得分:1)
嗯,有几种方法可以解决这个问题。提醒一下,您所描述的过程基本上是重新实现一种数据库复制形式,因此您可能希望熟悉Postgres的各种流行复制选项以及它们的工作方式,尤其是Slony可能是你感兴趣的。你没有指定什么类型的数据库"数据库B"是的,所以我假设它是一个单独的PostgreSQL实例,虽然这个假设不会改变下面的决定,除了排除像Slony这样的罐头解决方案。
在数据库A中需要复制的重要表上设置FOR EACH ROW trigger。您的触发器将在这些表中将每个新行INSERTed(和/或UPDATEd,DELETEd,如果您需要捕获它们)并将它们适当地发送到数据库B.你提到过使用Python,所以只需提醒一下,你可以在PL/python中编写这些触发器函数,如果这样可以让你的生活变得轻松,那么你应该能够或多或少地轻松调整你现有的代码以便它作为PL / Python触发器函数在数据库内部运行。
如果您阅读了Slony,您可能已经注意到提案#1与Slony的工作方式非常相似 - 考虑让Slony接管必要的复制是否容易或有帮助从数据库A到数据库B的表,如果你需要进一步将数据移动/转换到数据库B中的其他表,你可以在数据库B中的那些表上使用触发器。
设置一个触发器或RULE,它将发送一个NOTIFY,其中有效负载表示已更改的行。对于这些通知,您的代码将LISTEN,并立即知道哪些行已更改。 psycopg2适配器具有good support用于LISTEN和NOTIFY。注:您将需要谨慎处理您的侦听器代码已崩溃或与数据库断开连接或以其他方式错过某些通知的情况。
如果您可以控制代码流数据到数据库A,您可以让该代码接管将新数据复制到数据库B的工作。