每经过一段时间,资料库可能会因为以下几件事情改变:
这些改变都会需要将资料和 request 从一个节点移到另一个节点上,这个过程称之为 rebalancing。
不管你采用何种 partition schema,rebalancing 起码得达成以下需求:
所以接下来会讲做 rebalancing 时有哪些策略。
这个方法需首先先在每台节点上固定 partition 数量,举例来说假设丛集有 10 台节点,我们可以指定 partition 的量为 1000 个,如此每台节点大约会有 100 个 partition,然後当节点增加时,这个新的节点会去每一台节点中 偷 一些 partition 回来,直到整个丛集的 partition 分布变平均为止,这个过程如下图。
这个 rebalancing 策略被使用在 Riak, Elasticsearch, Couchbase 和 Voldemort。
这里最大的难处就是如何在一开始就选一个对的 partiton 数量,资料会随时间比例的成长,如果 partition 设很大,做 rebalancing 或节点从挂掉到恢复都是昂贵的,但 partition 设很小,每个 partition 又容易 overhead。
如果资料使用 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 上。
上面讲的 fixed number partition 和 dynamic partitioning 的 partitoin 数量都是跟资料大小成正比,也就是说,这 2 个策略都跟每个节点该放多少个 partition 无关。
第三个 partition 的策略是用在 Cassandra 和 Ketama,partition 的数量是跟节点数量成正比,换句话说就是每个节点的 partition 数量会固定,这个方法会保持每个 partition 的大小是相对稳定的。
当一个新节点加入时,它会随机选固定数量的 partition 做 split。
最後一个要探讨的问题是该自动还手动做 rebalancing?
全自动 rebalancing 或许很方便,但它是不可预测的,rebalancing 是很昂贵的操作,因为它需要 rerouting request 和在节点搬移大量资料,一不小心可能会网路过载和影响 request 的 performance。
自动 rebalancing 也可能会造成意想不到的危害,举例来说一个节点过载了然後回覆变慢,其他节点可能会认为它已挂掉,然後自动 rebalancing 会开始作业,把负载 (资料、读取和写入需求) 从过载节点转到其他节点上,进而造成过载节点工作量更重,然後大家一起挂掉。
所以,书中建议手动执行,虽然比自动慢,但更能避免意外。
>>: Day 29 - 使用 Config 为 NestJS 专案拆分不同开发环境
学习 Angular 的过程中,遇到了一些教学资源不见得会遇到的问题,还真是家常便饭,而且你个人电脑...
这是 Roblox 从零开始系列,在效果章节的单元,今天你将学会如何透过粒子发射器来做出基本的粒子特...
阿嬷都看得懂的替 HTML 标签穿上 CSS 样式 今天我们要来介绍排版的核心标签--div。 di...
阿嬷都看得懂的前端与後端怎麽分 首先,准备一个阿嬷-民明书房《阿嬷的古早味卤肉饭怎麽煮》 阿嬷的乖孙...
这是 Roblox 从零开始系列,使用者介面章节的第五个单元,你将要学会如何开始在零件的表面上去设计...