使用PostgreSQL数据库同步Elasticsearch和Cassandra

3
我希望将两个相关联的数据库(elasticsearch和casandra)与我的主数据库postgres同步。我正在尝试在本文中实现的方法:https://qafoo.com/blog/086_how_to_synchronize_a_database_with_elastic_search.html。所以我想出了两种方法。
  1. Sync before updating/inserting data into dependent databases

     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() 完成,因此这个方法可能会变慢。我喜欢这个方法,因为我利用了 sequantial_ids (有关详情请查看文章)。在新数据到达之前,数据已经被同步,允许依赖项跟上,只有遗漏的数据将被同步。与下面的选项2不同,可以防止重新索引/重新插入。

  1. Using a backround process (ei: running every 24 hours), I could sync data by selecting "missed out data" from update_error table, which contains data when elasticsearch or cassandra fail. Here's a rough example

     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 ....')
          })
    
      })
    

    However this method would require to reindex or reinsert data, because in some cases elasticsearch could insert data while cassandra didn't or either way. Because of this I will need a separate column that will record database type that failed. This way I can select data that failed since the last synchronization time for each type of database (ealsticsearch or cassandra).

问题:

  1. 方法1看起来很完美,但这意味着由于syncElasticWithDatabase(),有些人需要等待更长时间才能更新他们的帐户。然而,上面的文章确实做到了这一点(看看他们的图表),或者我误解了什么?

  2. 因为上述延迟(如果我理解正确),我介绍了第二个选项。然而,为了同步,这太多了。但是我花了很多时间思考这个问题...那么是否有比1和2更简单或更好的方法?

  3. Apache Zoo Keeper在我的情况下有帮助吗?

谢谢 :)


其他参考资料

Sync elasticsearch on connection with database - nodeJS

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


我们如何在Windows上批量导入PostgreSQL表到Elasticsearch? - Rizwan Patel
1个回答

0

基本上,您需要使用此处描述的方法 https://qafoo.com/blog/086_how_to_synchronize_a_database_with_elastic_search.html 并从一个数据库表中插入和选择数据。但是请确保在选择“更新”中的数据时限制选择次数,例如:LIMIT 100

以下是工作流程:

  1. insert/update期间将数据保存到“更新”表中(如果delete请确保在一列中标记为已删除)
  2. 然后运行此过程 ->

    • 从elasticsearch或Cassandra中选择您最后的插入:sequence_id
    • 使用它从“更新”表中选择数据,如下所示:id > :sequence_id

然后,您可以将数据插入到Elasticsearch或Cassandra中,或者进行其他操作。确保在依赖数据库之前将数据插入“更新”表中。并且无需复制document_id,因此请用新的替换它们。这样可以保持一致性,并允许您选择在特定操作期间运行cron作业或同步所有内容。然后将sequence_id更新为最后一个。

我选择在插入/更新/删除“更新”后立即同步数据,然后执行res.end()(或任何其他完成响应的操作),并使用sync()函数按升序选择100个新记录。我还每24小时运行一次cron作业(不带LIMIT 100),以确保任何遗漏的数据都会被同步。哦,是的,如果所有数据库的更新都成功,则可以将“更新”中的记录删除,除非您出于其他原因使用它。但请注意,Elasticsearch可能会在内存中丢失数据。

祝你好运 :) 我也愿意听取建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接