我正在使用本地托管的 Memgraph 实例,并通过 Kafka Connect 和 Kafka 从 postgres 流式传输 CDC 数据。我最近遇到了交易错误,目前还没有找到有效的解决方案。
我收到的错误是:
Error happened in consumer XX while processing a batch: Cannot resolve conflicting transactions. You can retry this transaction when the conflicting transaction is finished!
这是我的撰写对象:
memgraph:
image: memgraph/memgraph-mage:1.16-memgraph-2.16
container_name: memgraph-mage
restart: always
depends_on:
kafka:
condition: service_healthy
environment:
- vm.max_map_count=262144
ports:
- "7687:7687"
- "7444:7444"
command: ["--log-level=INFO", "--also-log-to-stderr=true", "--telemetry-enabled=false", "--stream-transaction-conflict-retries=10", "--stream-transaction-retry-interval=500"]
volumes:
- mg-data:/var/lib/memgraph
- mg-log:/var/log/memgraph
- mg-etc:/etc/memgraph
- mg-usr:/usr/lib/memgraph
networks:
- internal_net
我有两个流同时运行,它们可能会产生干扰,即同时向同一节点添加边。
目前,我必须每 2-3 分钟左右重新启动一次直播。我没有处理特别大量的数据,大约 500 个事件/分钟。我怀疑是因为某些节点同时更新,但我不知道如何调试和修复它。
如有任何帮助,我们将不胜感激。
谢谢。
如果您同时修改任何关系或节点,甚至向同一节点添加关系,您将得到冲突的事务,正如您已经正确注意到的那样。
如果事务中的一批消息修改了一个
super node
(有很多关系),其他批次(流)经常尝试更新相同的super node
,你会得到很多冲突的事务。
这一切都源于 Memgraph 具有高 ACID 一致性:https://memgraph.com/docs/fundamentals/storage-memory-usage
这是一个预期错误,您可以解决。
应根据您的工作负载配置流配置标志:https://memgraph.com/docs/database-management/configuration#streams
我希望这个值比 10 更高:
--stream-transaction-conflict-retries=
多高?答案应该取决于您的批次正在修改多少内容以及数据的结构。更大的批次和变更会增加冲突的可能性。
批量越小,重试次数越多,超时越小。
如果您选择更大的批次,那么您可能应该进行更小的重试,但具有更大的超时时间。
如果 Memgraph 能够跟上正在发生的事件的步伐,您不应该过度担心重试。
我希望这个标志取决于实际的批次持续时间。
--stream-transaction-retry-interval=500
如果一批消息/事件大约需要 3-4 秒,那么每 500 毫秒重试一次是没有意义的。