cassandra kafka 连接源和最终一致性

cassandra kafka connect source and eventual consistency

我正在考虑使用 Kafka 连接将更新从 Cassandra 流式传输到 Kafka 主题。 StreamReactor 的现有连接器似乎使用时间戳或 uuidtimestamp 来提取自上次轮询以来的新更改。在插入语句中使用 now() 插入时间戳的值。然后连接器保存上次接收的最长时间。

由于 Cassandra 最终是一致的,所以我想知道在使用时间范围进行重复查询以获取新更改时实际发生了什么。是否没有错过插入 Cassandra 的行的风险,因为它 "arrived late" 在使用 WHERE create >= maxTimeFoundSoFar?

时查询的节点

是的,如果您使用一致性级别 1 进行读取和写入,当您已经继续处理时,您的 "cursor" 前面可能有更新的数据,但即使您使用更高的一致性,您可能 运行 变为 "problems",具体取决于您的设置。基本上有很多地方可能出错。

您可以通过使用旧的 cassandra 公式 NUM_NODES_RESPONDING_TO_READ + NUM_NODES_RESPONDING_TO_WRITE > REPLICATION_FACTOR 来增加不这样做的机会,但是由于您使用的是来自 cassandra 的 now(),因此节点时钟之间可能会有毫秒偏移,因此您甚至可能如果您有高频数据,则会丢失数据。我知道在某些系统中,人们实际上使用 raspberry pi 和 gps 模块来保持时钟偏差非常小:)

您将不得不提供更多关于您的用例的信息,但实际上是的,如果您不是 "careful",您完全可以跳过一些插入,但即使那样也没有 100% 的保证,除非您使用一些足以让新数据进入并稳定的偏移量。

基本上,您必须在过去保留一些移动时间 window,然后再移动它,并确保您不会考虑比我们说的最后一分钟更新的任何内容。这样你就可以确保数据是 "settling".

我有一些用例,在这些用例中,我们处理的感官数据会延迟数天。在一些项目中,我们只是忽略了一些数据用于按月报告的数据,因此我们总是处理旧数据并将其添加到报告数据库中。也就是说,我们在历史上保留了 window 3 天的时间。

这取决于您的用例。