Rebalancer是一个自动化系统,用于维持群集中数据的健康分布。通过修改数据的分布和位置,Rebalancer的工作就是响应“不健康的”群集。Rebalancer是一个在线过程,可以在不影响用户操作的情况下对集群进行更改。它使数据库管理员免除了手动操作数据放置的负担。
- 健康集群
- 再平衡器组件
-
恢复队列和版本化元数据
ClustrixDB Rebalancer被设计为作为后台进程自动运行,以重新平衡整个集群中的数据。以下各节描述了Rebalancer的工作方式。分发和副本的默认值足以满足大多数部署的需求,并且通常不需要更改。
ClustrixDB Rebalancer已获得两项用于分发和切片数据的专利。
也可以看看: - 管理数据分发
- 管理平衡器
-
健康集群
在ClustrixDB中,用户表在表示形式中是垂直分区的,在表示形式中是水平分区的。创建新的表示形式后,系统将尝试确定数据的分布和位置,以便:
- 该表示具有适当数量的切片。
- 该表示形式具有适当的分发密钥,可以公平地平衡其副本之间的行,但仍允许快速查询特定副本。
- 副本在存储设备上的群集周围分布良好,并且存储设备没有过多。
- 副本跨区域分布(如果已配置)。
- 副本未放置在退役的节点上。
- 每个表示的读取在表示的节点之间是平衡的。
随着时间的流逝,表示会随着数据或集群成员资格的更改而失去这些属性。本节介绍了Rebalancer可以解决的各种情况。
保护不足:
默认情况下,Clustrix每个切片保留两个副本(副本)。如果意外的节点故障使其中一个副本不可用,则仍可通过其余副本访问该片。如果仅存在片的一个副本,则在发生其他故障时,该片上的数据很容易丢失。可以通过全局变量MAX_FAILURES指定每个切片的副本数。
当切片的副本数量少于所需数量时,重新平衡器将在不同节点上的现有副本上创建新副本。常见的原因是节点出现故障或不可用。初,群集将为该节点的副本创建恢复队列,以便当该节点返回仲裁时可以使它们成为新的副本。但是,如果该节点长时间不可用,则Rebalancer将开始从群集中其他位置制作副本的副本,并将退出恢复队列。
如果节点不可用,则群集的存储容量会减少。如果没有足够的剩余存储容量来制作新副本,则Rebalancer将无法做到这一点,并且分片仍将受到保护不足。群集不会自动保留用于重新保护片的容量。
负载不平衡:
如果表示的切片在整个群集中分布不均,则Rebalancer将尝试将其移动到更理想的位置。
重新平衡器通过以下方式独立评估每个表示形式的放置:
- 假定表示的每个片段都施加与其表示在键空间中所占份额成比例的负载。例如,如果切片的索引大小占整个表示形式的索引空间的10%,则还将假定切片也将占表示形式负载的10%。当放置片的给定副本时,重新平衡器会考虑预期的活动级别。
- 当“大负载”和“小负载”节点之间的差异小时,表示形式分布均匀。
考虑以下具有三个相等大小的切片S1,S2和S3的表示形式的示例。每个片具有分布在五个节点群集中的两个副本。
这是这种表示分布不佳的一个例子。每个切片都受到保护,以防节点发生故障,但是大多数表示形式存储在节点2上。
这是一个良好分布的例子。红色轮廓所示的副本已由Rebalancer重新定位,以改善群集平衡。尽管节点1的副本数量比其他节点多,但没有节点负载不足。
当节点太满时:
如果集群中的某个节点持有的表数据所占份额超过了该数量,则Rebalancer将尝试将副本从该节点移至利用率较低的节点。
在移动任何副本之前,重新平衡器将计算 群集存储设备的负载不平衡。如果这种不平衡低于可配置的阈值,则重新平衡器将不理会任何事情。这是为了防止Rebalancer进行小的不必要的副本移动。
平衡存储利用率是维护表示分布的第二优先级。在某些情况下,这可能会导致佳的存储设备利用率降低,以换取更好的表示分布。
当切片太大时:
表示被划分为多个切片,每个切片都被分配了表示行的一部分。如果一个切片变大,则Rebalancer会将其分割成几个新的切片并在其中分配原始切片的行。切片越大,在整个系统中移动或复制它的成本就越高。所需的大片段大小是可配置的,但默认情况下,Rebalancer将使用大于1 GiB的片段进行拆分。(由于存储开销,已利用空间将略大于用户数据的大小)。
太多的切片也可能是一个问题:更多的切片意味着群集需要管理更多的元数据,这会使查询和组更改花费更长的时间。重新平衡器不会反转拆分,因此通常的建议是在出现较少片段的一侧犯错,并在存在表示需要多少个片段的问题时允许重新平衡器拆分。可以使用ALTER语句手动反转拆分,以更改表示的切片。
由于行是散列分布在切片之间的,因此如果某个切片接近拆分阈值,则表示的其他切片也可能也需要拆分。
全局rebalancer_split_threshold_mb确定何时需要分割片。可以通过DDL为每个表或每个索引覆盖该全局值。参见切片。
读取不平衡:
ClustrixDB仅从每个片的一个副本中读取,并将该片指定为 排名副本。这使Rebalancer可以更好地管理同时分配给所有副本的写入操作和始终仅使用排名副本的读取操作的数据分发和负载。
从写的角度来看,这种五切片表示形式在五节点群集中分布良好。每个节点正在平均分配工作。
对于读取操作,ClustrixDB将一个副本指定为片的排名副本,并始终从该副本读取以平衡整个群集的负载。
由于切片的所有副本都是相同的,因此将读取定向到非排名副本将产生相同的结果。但是,为了更好地利用每个节点的内存,ClustrixDB始终从指定的排名副本中进行读取。如果排名副本不可用,则使用另一个副本代替。
退役节点(Decommissioned Nodes)
当要从群集中删除节点时,管理员可以将其指定为soft-failed。这指示重新平衡器不要在该节点上放置新副本,也不会在评估存储不平衡时考虑该副本。重新平衡器将开始在软故障节点上制作副本的其他副本,并将其放置在其他节点上。一旦有足够的副本,就可以从群集中删除软故障节点,而不会丢失数据保护。
再平衡器组件
重新平衡器是一个由多个组件组成的系统:
- 收集信息以建立集群状态模型
- 任务检查模型并决定是否需要采取措施
- 任务将操作发布到将对其进行调度的队列中
- 当操作从队列中毕业时,它将应用于集群
- 操作完成后,将更新模型以反映新状态
分配模型
有关每个副本的存在和位置的元数据在每个节点上重复,但是每个副本的大小仅在其所在节点上本地知道。
重新平衡器会定期轮询群集中的所有节点,以创建当前群集状态的模型。在两次调查之间,表示可能会由用户创建或销毁,并且可能会增加或缩小。集群的Rebalancer模型始终有些过时。这意味着它有时可能会做出次优的决策。
任务
定期任务监视每个Rebalancer任务,并根据需要独立安排纠正措施。每个任务共享集群状态的Rebalancer模型,并且知道其他排队的Rebalancer任务。管理员可以调整这些任务的某些参数,包括其速率。
重新平衡器任务摘要
尽管每个任务都是独立的,但它们会进行调整,以使一个任务的决策不会与另一个任务的决策发生冲突。例如,分割一个切片时,新切片的放置应考虑表示形式的其余切片和群集存储的容量。这些片的新副本将正确排序,因此重新排序过程无需稍后进行调整。
重新平衡器队列
由Rebalancer影响的所有更改都使用优先级队列进行调度。此队列旨在限制重新平衡器的速率,以便它不会因更改而超额预订集群,包括:
- 一次可以将一个更改应用于一个切片。
- 某些操作(如重新分配表示形式)会限制同时执行的次数。
- 有限数量的操作可以一次影响单个节点。
为操作分配了优先级,而排队的操作可以被更高优先级的操作所超越。操作开始后,即使队列中有更高优先级的操作正在等待,它也不会被中断。
重新平衡器操作可能由于多种原因而失败。如果操作失败,则将还原对群集所做的任何更改,并且Rebalancer随后可以选择重试该操作。由于群集的状态可以随时更改(在Rebalancer进行决策或执行操作时),因此即使在正常操作中也可能会出现一些故障。
重新平衡器在完成操作后不会保留任何内存,因此反复失败的操作可能会反复重试。重新平衡器假定任何导致操作失败的条件都是瞬态的。
恢复队列和版本化元数据
表示元数据的更改(包括副本位置)通过类似于表数据的多版本并发控制(MVCC)方案进行版本控制。当表示更改时,在更改之前开始的事务将永远不会观察到。较旧的交易不会被取消,而较新的交易不会等待它们。每个集合仅看到元数据的不同视图。这允许在不与当前正在运行的事务协调的情况下进行元数据更改。
元数据更改是事务性的,因此,如果在执行更改时遇到错误,则整个更改都会回滚到其开始的状态。
当Rebalancer在两个节点之间移动副本时,它会通过一系列特定的DDL 更改来这样做。在每次更改之间都有一个时期,在此期间可以开始用户交易。Rebalancer能够在线执行副本移动,并且随着操作的进行,对新事务或正在运行的事务的中断作用有限。联机操作的关键是恢复队列,它是副本在构建时遗漏的更改日志。(恢复队列与Rebalancer的优先级操作队列不同。)以下是使用恢复队列进行联机副本移动的示例。其他Rebalancer操作更为复杂,但操作类似。
副本移动示例:
从左到右阅读,该图像显示了影响副本移动所需的各个步骤。
初始状态-时代A
初,切片的副本位于节点3和节点4上。我们将切片从节点4移至节点1,在此之前此切片不存在副本。
创建一个新副本-时代B
步是在节点1上创建一个新的空副本。此副本被标记为 在系统中构建,以便查询无法访问它。同时在节点2上为此副本创建恢复队列。该队列看起来像是另一个写入切片的查询的副本,但是它的功能有所不同:它记录所有写入,以便以后可以针对新副本重放它们。这允许从节点4到节点1的复制继续进行,而不会阻止对切片的更新。新副本的更改将存储在恢复队列中。
资料复制
从原始副本进行的可序列化读取将返回创建队列时的所有行。这些行将发送到新的建筑物副本。同时,对原始副本的任何更新都将记录到队列中。
在创建队列之前,可能在时期A中启动了一些事务,这些事务一旦提交便尝试修改分片。这些事务不会知道队列,因此不会将其更新记录到该队列中。如果可序列化副本错过了这些事务的更新,则当原始副本被删除并且新副本联机时,它们的更新将丢失。因此,系统将使任何此类事务失败。为了大程度地减少这种情况的发生,可序列化的副本会延迟一段时间(大约1秒钟),以允许进程内事务完成。
队列重播
复制完成后,新副本将在复制开始时镜像原始副本。然后,读取队列的内容并将其应用于新副本。
在队列重放正在进行时,对片的更新将继续记录到恢复队列中。调整队列重播的速度要快于可将新条目添加到队列中的速率,以确保队列重播完成。
队列结束
读取队列中的后一条记录后,队列将从异步操作更改为同步操作。更新将继续存储在队列中,并在允许提交事务之前将其应用于新副本。
队列翻转-任期C
到达恢复队列的末尾时,将淘汰原始副本,并使新副本联机。
队列不再由新事务更新。来自任期B的较旧事务继续向其写入,并且队列保持同步模式,将更新转发到现已联机的新副本。
淘汰的副本将继续接收更新,但不会被新事务读取。任期B中的事务(从翻转之前开始)仍然可以看到它,并且必须看到该片的新更新。翻转之后,由于队列重播已完成,因此队列不再存储更新记录。
退休的
一旦任期B的所有旧事务都完成了,恢复队列将不再接收任何写操作。队列和退出副本将被删除,仅保留新副本。
终状态-任期D
完成后,副本的片现在位于节点1和3上。