允许自定义CRDT合并的分布式数据库

4
我对分布式数据库还比较新,尽管我已经研究了相关文献(例如CAP定理,CRDT),并实现了一些POC以允许横向扩展我的应用程序。
现在我面临一个具有挑战性的问题。为了使应用程序横向扩展,服务之间的通信通过分布式队列完成。在这里,我确实需要自定义CRDT方法来保持数据最终一致,并且我要求我的应用程序像缓存一样工作(与REDIS有关)。
挑战在于我还需要持久化数据。这要求我将数据保持在应用程序缓存和数据库中最终一致。我检查了Cassandra,看到了一个票据[1],其中有人试图添加自定义CRDT合并功能(正如我之前提到的那样)。但这从未被纳入Cassandra,并且似乎还有一些问题需要解决。
我的选择是什么,可以是具体的分布式数据库引擎,允许自定义合并,也可以是算法,可以帮助解决该问题(例如通过db触发器或类似的东西)。
[1] https://issues.apache.org/jira/browse/CASSANDRA-6412

你有没有看过Redis CRDT解决方案?https://redislabs.com/blog/diving-into-crdts/ - Guy Korland
Redis对我来说不是一个选择,原因有两个:首先,我需要所有数据存储的合并操作都是完全相同的(否则就必须使用Redis进行所有操作),其次,我的应用程序涉及空间数据。Redis的地理空间支持对我的应用程序无效。 - benjist
你从Redis地理空间功能中缺少哪些功能? - Guy Korland
例如,多边形。如果这种数据类型存在的话,使用 Redis 进行分片将是下一个需要解决的挑战。 - benjist
你的意思是给定一个点,返回所有相关的多边形吗? - Guy Korland
除了点与多边形相交之外,还有多边形与多边形的重叠部分。 - benjist
2个回答

3
据我所知,很少有数据库允许您指定自己的冲突解决算法。说实话,我唯一找到的一个 - 免责声明:我不是微软倡导者 - 是Azure CosmosDB。它具有与MongoDB兼容的API,并且可以配置为使用主-主复制策略,其中需要指定自己的冲突解决算法(使用JavaScript)。您可以使用它来定义自己的合并操作。
如果您将目光投向应用程序级别的解决方案,那么有几个工具,例如Akka(在JVM或.NET版本中都可用),它使您能够在分布式数据模块内编写自定义CRDTs。JVM版本还支持多数据中心持久性,这在概念上更接近于交换CRDT的工作方式,并且可以与Cassandra后端集成。

1

我在我的merkle-crdt存储库中实现了MerkleClock CRDT。

您可以采用一种方法,即在更新数据库记录列时,获取该列的值,然后将其与当前状态的CRDT合并,然后在保存时将CRDT序列化为JSON并存储在数据库中。


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