【发布时间】:2019-05-27 04:04:45
【问题描述】:
是否可以将 clickhouse 用作键值存储,是否定期覆盖数据但很少读取?如果可以,我应该使用什么引擎?
【问题讨论】:
标签: key-value-store clickhouse
是否可以将 clickhouse 用作键值存储,是否定期覆盖数据但很少读取?如果可以,我应该使用什么引擎?
【问题讨论】:
标签: key-value-store clickhouse
ClickHouse 不是为该用例而构建的,它故意在其文档的主页中说明了这一点。
何时不使用 ClickHouse
- 事务性工作负载 (OLTP)
- 高请求率的键值访问
- Blob 或文档存储
- 过度标准化的数据
但是,如果 QPS 较低,您仍然可以获得良好的点查询延迟分数。 ClickHouse 还提供了多种字典,可以更好地作为外部键值存储。还有一个StorageJoin引擎,支持joinGet功能,类似于redis的HGET操作。在此PR 之后,您可以覆盖StorageJoin 中的现有密钥。
PR 已合并。这是一个孤立的例子。
首先按如下方式填充 StorageJoin 表:
CREATE TABLE my_fancy_kv_store (s String, x Array(UInt8), k UInt64)
ENGINE = Join(ANY, LEFT, s);
INSERT INTO my_fancy_kv_store VALUES ('abc', [0], 1), ('def', [1, 2], 2);
那你就可以把它当成字典(key-value)了:
SELECT joinGet('my_fancy_kv_store', 'x', 'abc');
SELECT joinGet('my_fancy_kv_store', 'k', 'def');
【讨论】:
EmbeddedRocksDB 表引擎是最近添加的,可以提供帮助。
更多可以在这里找到:https://kb.altinity.com/engines/altinity-kb-embeddedrocksdb-and-dictionary
在我的测试中,与 MergeTree 相比,我发现 EmbeddedRocksDB 处理的 QPS 提高了 10-20 倍,响应速度提高了 10-100 倍。
它可能因用例而异,但它足以让我不必费心寻找单独的Redis / RocksDB / DynamoDB 安装(因为在 CH 中拥有 KV 存储有助于跨 MT 和 EmbeddedRocksDB 加入,我真的不需要扩展达到redis / DDB的限制)
【讨论】: