Postgresql 使用事务来确保elasticsearch和postgres数据同步是一个好主意吗?

Postgresql 使用事务来确保elasticsearch和postgres数据同步是一个好主意吗?,postgresql,Postgresql,我正在考虑使用postgres ORM中的钩子在postgres和elasticsearch之间同步数据。这是一个实际的方法吗?或者这会不会太贵?您一定在谈论触发器。诚实的回答是,这在很大程度上取决于你的写作量 如果您处于恒定的写负载下,这可能是个坏主意。ES希望在一个大范围内获得大量数据。通常,您使用ES作为其他一些数据库(如Postgres)的索引,您可以接受ES稍微过时的情况。过去有一种叫做rivers的ES技术来帮助解决这个问题;我现在明白了 我想说的是,未来你有几个选择: 如果写入量

我正在考虑使用postgres ORM中的钩子在postgres和elasticsearch之间同步数据。这是一个实际的方法吗?或者这会不会太贵?

您一定在谈论触发器。诚实的回答是,这在很大程度上取决于你的写作量

如果您处于恒定的写负载下,这可能是个坏主意。ES希望在一个大范围内获得大量数据。通常,您使用ES作为其他一些数据库(如Postgres)的索引,您可以接受ES稍微过时的情况。过去有一种叫做rivers的ES技术来帮助解决这个问题;我现在明白了

我想说的是,未来你有几个选择:

  • 如果写入量不大,可以直接从应用程序写入,也可以使用触发器
  • 如果您的写容量非常大,可以采用事件源方法或批量更新(或者两者都做;这称为“lambda架构”,在本书中有详细描述)
事件源方法基本上是让应用程序以某种方式广播一个事件流,然后有两个进程监听该流:一个进程写入Postgres,另一个进程写入ES。这种方法也在I-Heart日志中得到提倡,尽管它是事件流。我认为你可以使用卡夫卡以外的许多其他选择,例如

批处理方法是老派的;基本上,有一个cron作业,定期运行,将数据从数据库复制到ES。如果您得到了很多小的更改,但总体数据库大小不是很大,那么这将是一个显著的性能改进。这是一个稳定的体系结构,并且非常容易实现(特别是因为ES作为一种长期数据存储机制,并不特别受信任;有关详细信息,请参阅)

所以,触发器。看起来像,;也许值得与他们接触,看看它是否值得生产。我在搜索中发现的另一个选择是,它似乎让Postgres将ES用作索引服务,而不透露它

就我个人而言,我不会向Postgres添加代码来编写ES,因为我会担心线程问题和连接失败。您的应用程序可能比将其深入数据库本身更适合在与ES对话时(这将发生)处理网络故障。另外,我不想做任何可能破坏主数据存储的事情。这并不意味着这是最糟糕的想法,只是我会犹豫是否将其投入生产。这里最引人注目的优势是,我有一种相当强烈的感觉,如果我给Postgres写了什么东西,它就在ES中,而不必在意我是从这个应用程序还是那个应用程序写的。这些都是很好的优势,但是你可以很容易地说服自己,你正在绕过CAP定理,而实际上你并没有,你只是在接受新的、更广泛的故障模式,以一个比你可能真正需要的更强的一致性模型的名义


事件源模型也有类似的优势,只是提升了一个级别:如果我写入广播频道,那么我可以假设,如果频道是持久的,如果消息到达那里,那么它最终将被两个数据库加载,等等。但这使人们更容易相信这两个系统最终是一致的,对于分布式系统来说,这通常比“完美”一致性更有用(如果您有两个服务,您可能有一个分布式系统)。

谢谢您的精彩回答,我将进一步研究您的建议。我正在考虑在应用程序端使用ORM中的after create钩子将消息发送到任务队列,然后使用lambda函数在elasticsearch上创建实际条目。但事件源模型似乎是一个更好的解决方案。@user3791980您在评论中描述的方法也是一个非常好的方法。