在clickhouse中选择分片键的最佳方法是啥?

Posted

技术标签:

【中文标题】在clickhouse中选择分片键的最佳方法是啥?【英文标题】:what is the best way to chose shard key in clickhouse?在clickhouse中选择分片键的最佳方法是什么? 【发布时间】:2021-02-20 20:40:46 【问题描述】:

我想了解如何在 Clickhosue 中选择分片键?以及clickhosue如何选择哪个分片? 例如,我有一个包含 3 列的表: 用户身份, 时间戳, city_id。

我应该按 user_id 还是按城市分片?

我使用 murmurHash3_64 函数。

murmurHash3_64(city_id = 1) 返回:

┌──murmurHash3_64(1)─┐
│ 956517343494314387 │
└────────────────────┘

当我有 3 个或 2 个分片时,Clickhouse 中选择分片 id 的机制是什么?

【问题讨论】:

【参考方案1】:

https://clickhouse.tech/docs/en/engines/table-engines/special/distributed/

首先,您需要了解为什么需要按一些有意义的列进行分片。为什么不能使用rand()

通常使用什么不是问题,因为分片自然遵循业务需求。如果你没有这样的要求,那么你应该使用rand()

CH 使用模运算 + 权重。 这很简单。如果您有 6 个分片,则 956517343494314387 % 6 = 5 === 分片编号 5。因此具有相同 city_id 的行将放置在同一个分片上。

因此,如果您选择 city_id 作为分片键并且城市的分布通常不相等,那么阴影也会不相等。 纽约或墨西哥等大城市的所有行都将在一个分片中。

所以 user_id 看起来更适合作为分片键。

【讨论】:

分片键可以使用多列吗? @DivyanshuJimmy 是的,在 99% 的情况下人们使用哈希函数,而 CH 哈希函数接受多个参数,只需使用 cityHash64(user, transaction, date, someothercol, someothercol2) 作为分片键

以上是关于在clickhouse中选择分片键的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在现有 Django 应用程序中更改主键的最佳方法是啥?

ClickHouse集群部署 全网最佳实践

使用 C 类型 uuid_t 作为 std::map 中的键的最佳方法是啥?

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

在 Spanner 中拥有大量分片是不是会产生成本?

使用 GUID 作为主键的最佳做法是啥,特别是在性能方面? [关闭]