【发布时间】:2019-11-13 23:45:14
【问题描述】:
我已经阅读了this,但我仍有疑问。我只有一个具有 16 GB RAM、4 个内核和 100 GB 磁盘的 VM,只有 ClickHouse 和一个轻量级 Web api 在上面工作。
我将泄露的凭据存储在数据库中:
CREATE TABLE credential (
user String,
domain String,
password String,
first_seen Date,
leaks Array(UInt64)
) ENGINE ReplacingMergeTree
PARTITION BY first_seen
ORDER BY user, domain, password, first_seen
某些凭据出现多次(在一个文件内或多个文件之间)会发生这种情况。
我的长期目标是(曾经)如下:
- 当插入一个已经在数据库中的凭证时,我想保留较小的first_seen并将新的泄漏ID添加到字段leaks。
我尝试了 ReplacingMergeTree 引擎,插入两次相同的数据 ($ cat "data.csv" | clickhouse-client --query 'INSERT INTO credential FORMAT CSV'),然后执行 OPTIMIZE TABLE credential 以强制替换引擎执行其异步工作,根据 the documentation。什么都没有发生,数据在数据库中出现了两次。
所以我想知道:
- 我错过了什么 ReplacingMergeTree 引擎?
- OPTIMIZE 是如何工作的,为什么它没有达到我的预期?
- 有没有真正的解决方案可以避免在 ClickHouse 的单个实例上复制数据?
我已经尝试过手动操作。我的问题是我的数据库中有 45 亿条记录,并且使用以下查询识别 100k 条目样本中的重复项几乎需要 5 分钟:SELECT DISTINCT user, domain, password, count() as c FROM credential WHERE has(leaks, 0) GROUP BY user, domain, password HAVING c > 1 这个查询显然不适用于 4.5b 条目,因为我没有足够的内存。
任何想法都会尝试。
【问题讨论】:
标签: clickhouse