我有一个禁用日志记录的有状态 Kafka Streams 应用程序。我必须禁用它的原因是因为某些记录的聚合状态可能会变得非常大,并且在每次更改时向更改日志主题发送更新是不可行的。
因此使用 StatefulSet,其中在重新启动时保留rocksdb 文件。我在here读到Kafka Streams默认禁用rocksdb事务日志,因为它使用变更日志主题来实现容错,但就我而言,我想应该启用它。如何配置?
读完本文后:
Rocksdb 的可用性不高,并且没有故障转移方案。这并不意味着当您使用 Kafka Streams 将状态存储数据存储在 RocksDB 中时会丢失状态存储数据,因为 Kafka Streams 通过将状态存储数据复制到 Kafka 主题来使 RocksDB 具有容错能力。
我有点担心,因为我禁用了变更日志主题。由于我完全依赖rocksdb文件来实现容错,除了启用事务日志之外,还需要采取其他预防措施吗?
它在 Kafka Streams 的默认 RocksDB options 中被禁用,因为 WAL 应该是 Kafka 本身:
wOptions = new WriteOptions();
wOptions.setDisableWAL(true);
不依赖变更日志主题会让很多事情变得棘手,因为 RocksDB 并不意味着成为事实来源(Kafka 是),而只是作为进行键值存储查询的有用工具。
当您的应用程序启动并且还没有 RocksDB 状态时,您将失去从变更日志主题到 RocksDB 的重新水合。保持 KStreams 应用程序的灵活性非常重要,例如当您需要添加/删除应用程序的实例时 - 通过更改日志主题,它将补充必要数据的子集。
许多 KStreams 操作员使用 Kafka 事务写入变更日志主题和您自己的主题。写入 RocksDB 与 Kafka 不是事务性的:您的应用程序可能会将内容写入 Kafka,然后写入 RocksDB。如果您的应用程序在 RocksDB 写入之前停止(重新启动、失败等),这将使您的状态不一致,因为 KStreams 不知道它没有写入 RocksDB(这是 KStream 应用程序启动时检查的第一件事,与变更日志主题和 RocksDB,确保其一致)