2016-10-04 107 views
3

我想同步兩個依賴數據庫(elasticsearch和casandra)與我的父數據庫:postgres。我正在嘗試在本文中實現一種方法:https://qafoo.com/blog/086_how_to_synchronize_a_database_with_elastic_search.html。所以,我想出了2種方法同步elasticsearch&cassandra與postgres數據庫

  1. Sync之前更新/插入數據相關的數據庫

    router.put('/account/edit', function(req, res) { 
    
        syncElasticWithDatabase().then(() => { 
         elastiClient.update({...}); // client for elasticsearch 
         cassandraClient.execute({...}); // client for cassandra 
          req.end(); 
        }) 
    
    }) 
    

syncElasticWithDatabase()updates表使用數據(從postgres的),這種方法可以是因爲慢有些人不得不等待syncElasticWithDatabase()完成。我喜歡這種方法,因爲我利用了​​(詳細檢查文章)。數據在新數據進入之前同步,允許依賴關係追上,只有遺漏數據纔會同步。與下面的選項2不同,防止重新索引/重新插入。

  • 使用底色處理(EI:在運行每24小時),我可以同步通過選擇數據從update_error表,它包含當elasticsearch或卡桑德拉失敗數據「錯過了數據」 。這裏有一個粗略的例子

    router.put('/account/edit', function(req, res) { 
    
        psqlClient.query('UPDATE....').then(() => { 
         elastiClient.update({...}); // client for elasticsearch 
         cassandraClient.execute({...}); // client for cassandra 
        }).catch(err => { 
         psqlClient.query('INERT INTO update_error ....') 
         }) 
    
        }) 
    

    但是這種方法需要重新索引或重新插入數據,因爲在某些情況下,同時卡桑德拉沒有或兩種方式elasticsearch可以插入數據。因此,我需要一個單獨的列來記錄失敗的數據庫類型。這樣我可以選擇自上次同步時間以來每種數據庫(ealsticsearch或cassandra)失敗的數據。

  • 問題

    1. 方法1,似乎完美的,但是這將意味着某些人將不得不等待更長的時間比其他帳戶更新由於syncElasticWithDatabase()。然而上面的文章完全一樣(看他們的圖)還是我誤解了一些東西?

    2. 由於上述延遲(如果我是正確的),我介紹了選項2.然而,它只是太多,以同步恕我直言。然而,我花了很長時間思考這個......所以有比1和2更容易或更好的方法嗎?

    3. Apache Zoo Keeper會幫助我的情況嗎?

    謝謝:)


    其他參考

    Sync elasticsearch on connection with database - nodeJS

    https://gocardless.com/blog/syncing-postgres-to-elasticsearch-lessons-learned/

    +0

    我們怎麼批量導入的Postgres表elasticsearch在Windows! –

    回答

    0

    基本上,你需要使用這裏描述方法0並插入&從一個數據庫表中選擇數據。但請確保在「更新」中選擇數據時限制選擇的數量,例如:LIMIT 100

    這裏的工作流程:

    1. 將數據保存到「更新」表中insert/update(如果delete確保你把它標記爲一列刪除)
    2. 然後運行這個程序 - >

      • 選擇您最後一次插入:彈性搜索或Cassandra的sequence_id
      • 使用它從「更新」表中選擇數據Ë像這樣:id > :sequence_id

    然後,您可以插入數據(進入elasticsearch或卡桑德拉)或爲所欲爲。確保您將數據插入依賴數據庫之前的「更新」表。而且沒有必要複製document_id,因此用新的替換它們。這提供了一致性,並允許您在運行cron作業或同時執行特定操作時進行選擇。然後將您的sequence_id更新爲最後一個。

    我選擇插入/更新/刪除後直接同步數據到「更新」,然後我做res.end()(或任何完成響應),並使用sync()函數按升序選擇100條新記錄。我還每24小時運行一次cron作業(不包含LIMIT 100),以確保任何遺漏的數據將被同步。哦,是的,如果所有數據庫的更新都成功了,那麼你可能會從「更新」中刪除記錄,除非你出於其他原因使用它。但請注意,elasticsearch可以是內存條鬆動數據

    祝你好運:)而且我打開的建議