知识卡片

Range分片与Hash分片的策略取舍,及分片数量的两难权衡

普通读书笔记卡

内容

分布式存储最常用的两种分片(sharding)策略各有明确的适用场景:Range based按用户UID的取值范围来分布数据,UID相邻的数据会被存放在一起,这样做的好处是范围查询(比如按UID区间批量取数据)效率高,但代价是数据分布可能不均匀——如果某一段UID区间的用户活跃度或数据量明显偏高,对应的分片就会比其他分片承担更大的负载,容易出现热点倾斜。Hash based则是通过某个哈希函数计算UID对应的分片,同一批相邻UID的数据会被打散到不同分片,数据分布通常更均匀,但代价是失去了range查询的连续性优势,按UID区间做批量查询会变得低效,因为符合条件的数据可能分散在任意多个分片里。分片数量本身也存在一个两难权衡:分片数量越多,意味着一次查询或一次写入可能要触碰更多的独立存储节点,会影响整体I/O效率;分片数量越少,虽然单次操作触碰的节点少、效率相对更高,但随着数据持续增长,触发扩容(re-sharding)的频率会更高,而扩容涉及数据迁移,本身是一件复杂且有风险的操作。这个权衡提示了容量规划环节的重要性:设计初期应当尽量预先规划出未来一段时间内的数据规模,并让分片数量取2的指数倍(如2、4、8、16),这样后续扩容时新增分片的数量和迁移逻辑都会更简单、更容易通过统一的规则来处理,而不是走一步看一步地随意增加分片数量。

参考来源

- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.9 微博分布式存储考试题:案例讲解及作业精选"节,"2.9.3 sharding策略"(源文件:_epub-src/OEBPS/Text/Chapter2_9_4.xhtml) - 结论依据:原文列出"Range based:根据用户UID来分布,相邻UID的数据保存在一起""Hash based:根据某个Hash函数,将一个用户UID的数据保存在指定的分片"两种策略,以及容量规划"预规划""2的指数倍"和分片数量"分片多:影响IO效率。分片少:扩容频繁、复杂"的取舍,共同支撑本卡片结论。 - 原始内容:Range based:根据用户UID来分布,相邻UID的数据保存在一起。Hash based:根据某个Hash函数,将一个用户UID的数据保存在指定的分片……预规划:容纳未来一段时间的数据。2的指数倍:shard数量变得更简单……分片多:影响IO效率。分片少:扩容频繁、复杂。