2015-06-06 33 views
1

對我嘗試構建的流程採取什麼樣的方法有疑問。使用PostgreSQL和Python。不斷處理來自PostGre數據庫的數據 - 採取什麼方法?

場景:

  • 我有兩個數據庫A和B
  • B是A
  • 數據連續流轉換成A,其需要在一個特定 方式處理的經處理版本(使用多處理),然後存儲在B.
  • A中的每個新行都只需處理一次。

所以:

streamofdata ===>[數據庫A] ---->過程---->[數據庫B]

數據庫A是相當大(40 GB)和不斷增長。我的問題是關於什麼是尚未處理和放入B的新數據的確定。什麼是確定哪些行仍然需要處理的最佳方式。

什麼還沒有被處理,每次對應的主鍵是不是要我猜

的方式讓我們說新行120到130在一段時間內接觸到數據庫中的。所以我最後一行處理的行是119.是否正確的方法來查看最後一行ID(主鍵)119處理,並說現在應該處理的東西之外,現在應該處理?

還想知道是否有人對這種「實時」數據處理有任何進一步的資源。不完全確定我在技術上所尋找的是什麼。

回答

1

好吧,有幾種方法可以處理這個問題。提醒一下,您所描述的過程基本上是重新實現一種數據庫複製形式,因此您可能需要熟悉Postgres的各種流行復制選項及其工作方式,特別是您可能感興趣的是Slony 。你沒有指定什麼類型的數據庫「數據庫B」,所以我認爲它是一個單獨的PostgreSQL實例,儘管這個假設不會改變很多關於下面的決定,除了排除像Slony這樣的一些罐頭解決方案。

  1. 在數據庫中的你有重要的表(S),其需要被複制建立一個FOR EACH ROW trigger。您的觸發器會將這些表中的每個新行插入(和/或更新,刪除,如果需要的話),並將它們適當地發送到數據庫B.你提到過使用Python,所以只要提醒你可以在PL/python中編寫這些觸發函數,如果這樣可以讓你的生活變得容易,也就是說你應該能夠或多或少地輕鬆調整你現有的代碼,以便它在數據庫中運行作爲PL/Python觸發器函數。

  2. 如果您閱讀了關於Slony的內容,您可能已經注意到提案#1與Slony的工作方式非常相似 - 考慮讓Slony接管所需表格的複製是否容易或有幫助從數據庫A到數據庫B,那麼如果您需要將數據進一步移動/轉換到數據庫B內的其他表中,則可以使用數據庫B中這些表上的觸發器來執行此操作。

  3. 設置觸發或RULE這將表明這已經改變該行的有效載荷發送一個NOTIFY。您的代碼將爲這些通知LISTEN並立即知道哪些行已更改。對於LISTEN和NOTIFY,psycopg2適配器具有good support。注:您需要謹慎處理您的監聽器代碼崩潰或與數據庫斷開連接或以其他方式錯過某些通知的情況。

  4. 如果你有過的代碼流數據進入數據庫的控制,你可以有代碼接管其複製新的數據到數據庫B的工作

相關問題