执行 rsync 时表暂停

问题描述 投票:0回答:1

我正在将数据摄取到 QuestDB 中,我需要快速摄取时间和对最近数据的快速查询时间,而且还需要对历史数据集进行频繁查询,并且性能要求更宽松。

我设置了两个实例,一个具有更好的硬件和 NVMe 驱动器,另一个具有用于历史查询的 HDD。我直接在快速实例上获取数据,然后同步到另一个实例。一切都很好,但偶尔我会遇到较慢的机器出现问题,表被挂起,日志中出现错误,例如

segment /var/lib/questdb/db/channels10~33/wal609/8/_event.i does not have txn with id 319, offset=21381, indexFileSize=2560, maxTxn=318, size=21381
segment /var/lib/questdb/db/channels25~37/wal131/3/_event.i does not have txn with id 326, offset=16308, indexFileSize=2616, maxTxn=325, size=16308

有什么线索我做错了吗?

database time-series questdb
1个回答
0
投票

在正常操作期间,QuestDB 通过直接内存映射写入许多不同的文件(元数据、wal 文件、列数据、可选列索引...)并定期刷新到磁盘。

在任何给定时刻,可能存在内存中一致但磁盘上不一致的文件。当我们进行 rsync 时,我们正在复制当前操作系统上的文件,有些文件可能不会刷新并且不一致。

在 QuestDB Enterprise 上,复制是开箱即用的,但在使用 QuestDB OSS 时,有几种方法可以处理此问题:

a) 双重书写。您可以使用 Kafka 代理发送消息,然后让两个实例使用同一主题。这应该可以正常工作,如果使用重复数据删除,它应该非常可靠,因为在出现错误的情况下实例会赶上。在这种情况下,只有数据被复制,没有元数据。如果从实例中删除数据,或者更改架构,或者更改任何其他元数据,其他实例将不会知道。

b) 将数据复制视为备份和恢复。在这种情况下,复制的数据库将与原始数据库完全相同。要启动备份过程,您需要在源实例上发出

CHECKPOINT CREATE
命令。这将刷新所有内容并确保您可以一致地复制数据。此时,您可以 rsync 到副本,当 rsync 完成后,您必须在主实例上发出
CHECKPOINT RELEASE
。这很重要,否则您将使用大量磁盘空间。数据同步后,您可以在另一个实例上启动恢复过程,如questdb 文档所示。

© www.soinside.com 2019 - 2024. All rights reserved.