哈希分片键和 ranged 分片键,chunk 是怎么分布的?哈希一定均匀吗?这篇用连续键、随机键、热点键三种数据在两个分片上逐个看。
chunk 分布 {'sh0': 1, 'sh1': 1};范围:
sh0 [{'k': MinKey()}, {'k': 0})
sh1 [{'k': 0}, {'k': MaxKey()})哈希分片集合在建立时就按哈希空间(以 0 为界)给每个分片一个 chunk。
chunk 分布 {'sh0': 1, 'sh1': 1};全部范围:
sh0 [{'k': MinKey()}, {'k': 0})
sh1 [{'k': 0}, {'k': MaxKey()})numInitialChunks=8 在这个版本上实测没有生效,chunk 仍是 2 个,要用 config.chunks 核对。
hashed:各分片拥有的文档数 {'sh0': 30451, 'sh1': 29549}
ranged:各分片拥有的文档数 {'sh0': 60000};chunk 分布 {'sh0': 1}哈希把连续键均匀打散(30,451 对 29,549);ranged 的连续键全挤在一个 chunk 里(60,000 对 0)。
写完后(balancer 关着):chunk 分布 {'sh0': 1};拥有文档 {'sh0': 60000}
balancer 开了 10 秒后:chunk 分布 {'sh0': 1, 'sh1': 3};拥有文档 {'sh1': 22956, 'sh0': 37044}ranged 集合上随机键开始也都在一个 chunk,但 balancer 拆分并迁移后能分开(37,044 对 22,956)。
各分片拥有的文档数 {'sh1': 9016, 'sh0': 50984}
每个 chunk 的文档数 (分片, 数量): [('sh0', 50984), ('sh1', 9016)]
最大的一个 chunk 有 50,984 个文档(85%),在 sh0 上;哈希把 k = 42 的所有文档映射到同一个哈希值,只能落在同一个 chunk 里哈希只能打散不同的键值,同一个键值始终映射到同一个哈希值、同一个 chunk:70% 文档同一个 k,85% 的文档就在一个分片上。
hot 集合 k = 42 → ['sh0'];k = 43 → ['sh1'];k ∈ [40, 50) → ['sh0', 'sh1'];k $in [1, 2, 3, 4] → ['sh0', 'sh1']
哈希键的等值查询 targeted 到一个分片,范围与 $in 多值要问多个分片。