[Day 29] Partitioning (3) - Rebalancing Partitions

Rebalancing Partitions

每经过一段时间,资料库可能会因为以下几件事情改变:

  • 为了想提高查询的吞吐量,所以你加了 CPU。
  • 资料的大小增加了,所以你需要加更多记忆体。
  • 一台机器或某几个资料硬碟坏了,其他的机器得接手它们的工作。

这些改变都会需要将资料和 request 从一个节点移到另一个节点上,这个过程称之为 rebalancing

不管你采用何种 partition schema,rebalancing 起码得达成以下需求:

  • rebalancing 之後,负载 (资料、读取和写入需求) 应该要能平均分散之各台节点上。
  • rabalancing 过程中,资料库应能正常处理读取和写入。
  • 最小化资料在节点间的搬移,减少网路和硬碟 IO。

所以接下来会讲做 rebalancing 时有哪些策略。

Strategies for Rebalancing

Fixed number of partitions

这个方法需首先先在每台节点上固定 partition 数量,举例来说假设丛集有 10 台节点,我们可以指定 partition 的量为 1000 个,如此每台节点大约会有 100 个 partition,然後当节点增加时,这个新的节点会去每一台节点中 一些 partition 回来,直到整个丛集的 partition 分布变平均为止,这个过程如下图。

figure_6-6

这个 rebalancing 策略被使用在 Riak, Elasticsearch, Couchbase 和 Voldemort。

这里最大的难处就是如何在一开始就选一个对的 partiton 数量,资料会随时间比例的成长,如果 partition 设很大,做 rebalancing 或节点从挂掉到恢复都是昂贵的,但 partition 设很小,每个 partition 又容易 overhead。

Dynamic partitioning

如果资料使用 key-range partition (Day 27),固定的 parition 数量会非常不方便,容易发生边界错误,这就会导至这些资料都只流到一个 partition 里,然後其他 partition 就空了。

所以使用 key-range partition 的 HBase 和 RethinkDB 就使用 dynamic partition,当 partition 的资料大小成长到某个门槛值後,它会分裂成 2 个差不多一半大小的 partition,反过来说资料大小小於某个门槛值,它会合并邻近的 partition,这个过程很像 Day 10 提到过的 B-Trees。

dynamic partitioning 的好处就是它能随着整体的资料量做 partition 调整,资料不大时使用小量的 partition 是很有效率的,但要留意的是,当你新建资料库时,初期你的资料量小所以只会有 1 个 partition,然後其他节点就会闲置了,为了减轻这个状况,HBase 和 MongoDB 允许设定初始的 partition 数量 (也称 pre-spiling )。

最後 dynamic partitioning 也适合用在 hash-partitoin 上。

Partitioning proportionally to nodes

上面讲的 fixed number partition 和 dynamic partitioning 的 partitoin 数量都是跟资料大小成正比,也就是说,这 2 个策略都跟每个节点该放多少个 partition 无关。

第三个 partition 的策略是用在 Cassandra 和 Ketama,partition 的数量是跟节点数量成正比,换句话说就是每个节点的 partition 数量会固定,这个方法会保持每个 partition 的大小是相对稳定的。

当一个新节点加入时,它会随机选固定数量的 partition 做 split。

Operations: Automatic or Manual Rebalancing

最後一个要探讨的问题是该自动还手动做 rebalancing?

全自动 rebalancing 或许很方便,但它是不可预测的,rebalancing 是很昂贵的操作,因为它需要 rerouting request 和在节点搬移大量资料,一不小心可能会网路过载和影响 request 的 performance。

自动 rebalancing 也可能会造成意想不到的危害,举例来说一个节点过载了然後回覆变慢,其他节点可能会认为它已挂掉,然後自动 rebalancing 会开始作业,把负载 (资料、读取和写入需求) 从过载节点转到其他节点上,进而造成过载节点工作量更重,然後大家一起挂掉。

所以,书中建议手动执行,虽然比自动慢,但更能避免意外。


<<:  结束了!!

>>:  Day 29 - 使用 Config 为 NestJS 专案拆分不同开发环境

Day 15:如何解决 PowerShell 无法使用 Angular 指令的问题?

学习 Angular 的过程中,遇到了一些教学资源不见得会遇到的问题,还真是家常便饭,而且你个人电脑...

从零开始学3D游戏设计:基础粒子效果

这是 Roblox 从零开始系列,在效果章节的单元,今天你将学会如何透过粒子发射器来做出基本的粒子特...

[Day 8] 阿嬷都看得懂的替 HTML 标签穿上行内样式

阿嬷都看得懂的替 HTML 标签穿上 CSS 样式 今天我们要来介绍排版的核心标签--div。 di...

[Day 2] 阿嬷都看得懂的前端与後端怎麽分

阿嬷都看得懂的前端与後端怎麽分 首先,准备一个阿嬷-民明书房《阿嬷的古早味卤肉饭怎麽煮》 阿嬷的乖孙...

从零开始学3D游戏开发:零件介面 Part.1 开始

这是 Roblox 从零开始系列,使用者介面章节的第五个单元,你将要学会如何开始在零件的表面上去设计...