如果保存某副本的三台节点压力负载都不符合 lease 的迁出条件时,数据库会选择将该副本同步到三副本以外的节点,然后将 lease 迁出,以动态平衡压力。系统会对需要平衡的 range 进行筛选,对于压力没有达到阈值的 range 或迁移后对该 store 的 QPS 影响较小时,则不会进行平衡操作。 系统首先设定目标 store 数量,通常等于 range 的副本数。循环一个 range 的多个副本,排除本地副本后,如果副本所在的 store 压力符合阈值,或者不存在,将该 store 放入目标数组。 如果目标数组的目标数量不足,则继续从其他所有 store 中选择,直到符合目标数量。选择 Store 目标数组的过程需要符合 zone(分区)限制,容量限制,压力阈值限制,并排序。如果还是不足,则放弃平衡。同时,副本的迁移应该满足多样性的限制,多样性指副本所在的多级分区的分散程度,副本所在的多级分区越分散,多样性分值越高。在选择目标 store 时,需要将新的多样性分值同原来的多样性分值进行比较,如果不如以前,则放弃平衡。 ZNBase 会循环目标数组,计算新的租约和压力值,然后选择目标数组进行副本迁移。迁移过程首先用 batch 命令,副本收到命令,并发送快照。
热数据分裂
如果同时对某副本的数据进行大量的读写,压力负载是由于该副本引起时,单纯的迁移 lease 或者 replica 都无法较好的调节该情况。该部分功能由 splitQueue 进行管理。ZNBase 会选择对热点数据的 range 进行分裂,从而把压力从单个 range 上分开,该步骤会导致创建新的 replica,从而分散了压力和流量。创建新的 replica 之后的均衡仍由 store-reblancer 进行。数据库会在 range 分裂后再进行 reblance。当压力降低后,系统会自动进行 range 的合并。