我有一个分布式服务,其中运行服务的每个节点也托管服务所使用的数据库的Cassandra节点。如果一个节点关闭,当它重新启动时,重新同步服务的过程非常昂贵。我已经找到了一种优化过程的方法,但它涉及监视同一节点上Cassandra示例的更新。
举个例子,假设我有一个客户表:
CREATE TABLE Clients(id int, name text, status text)
当一行被更新/插入时,信息被写入每个节点上的本地文件。如果一个节点关闭,当它恢复时,本地Cassandra数据库将接收到在它不存在时对表的更新。我想监视这些更新并使用它们来更新本地文件。
我一直在研究触发器,但我找不到太多的文档。对this question的回答和评论似乎表明应该避免触发器。但这个问题是5年半前的事了。
我可以使用触发器来完成我需要的任务吗?是否有详细说明如何编写触发器的文档?
2条答案
按热度按时间ux6nzvsh1#
Cassandra触发器仍然应该避免,编写触发器涉及到将Java类构建到JAR中,并将该JAR添加到集群中的每个节点。不推荐。
对我来说,这里正确的解决方案听起来像是在Apache Pulsar中使用CDC。本质上,您在一个表上启用CDC并构建一个Pulsar连接器。这样,发送到该表的所有变化都被放在Pulsar主题上。然后您可以通过构建一个消费者来查看主题,读取主题上的消息并将其写入您选择的(本地)文件来读取这些变化。
这里有一个文档,它将带你完成这个过程。它适用于K8ssandra,但如果你跳过Kubernetes特定的步骤,过程是相同的:https://docs.k8ssandra.io/tasks/cdc/
这有助于您构建Pulsar消费者示例:https://pulsar.apache.org/docs/2.11.x/client-libraries-java/#consumer
2hh7jdfx2#
在Cassandra中完全可以做到这一点,这听起来像是变更数据捕获(CDC)的完美用例。
CDC日志记录捕获并跟踪变化(插入、更新、删除),并将其存储在与Cassandra提交日志相同格式的日志中。然后,您的应用可以通过使用
CommitLogReader
(请参阅Apache Cassandra网站上的Change Data Capture)或使用Apache Pulsar流式传输数据来“使用”CDC日志。我没有现成的流媒体示例,但如果你想看到它的实际应用,这个CDC for Astra DB文档将指导你如何在Astra Streaming上设置一个免费的Pulsar租户+主题,然后将其连接到Astra DB上的免费Cassandra集群,并启用CDC进行流媒体。这一切都在免费层,因此不需要信用卡来设置。
顺便说一下,CQL触发器是作为一个实验性功能添加到Cassandra 2.0中的,但它已经多年没有被积极开发了,所以我不建议在生产环境中部署它。干杯!