Auto-Rebalance & Scheduling

MatrixCube是一个实现分布式系统的框架。对于分布式系统来说,数据存储在多台机器上,而当集群中的计算机的数量发生变化时,例如集群扩展或计算机崩溃,都需要跨主机进行数据转移。

Prophet是MatrixCube的自平衡和调度的关键组件。Prophet中嵌入了Etcd Server组件来存储集群的元数据。 其主要实现了三个目标:
* 保持每个Store存储量平衡。 * 保持读写请求的负载平衡。 * 保持逻辑表分布平衡。

为此,我们设计了HeartbeatEvent Notify机制来实现以上目标。每个StoreLeader Replica将向Prophet发送heartbeat信息,Prophet将根据该信息做出调度决策。因此,我们首先需要配置某些Store来承担Prophet的职责。

Store Hearbeat

每个Store周期性地向Prophet发送Heartbeat,其中包括以下信息:

  • 当前该Store存储的Replica的数量。
  • 当前该Store的存储空间,包括已使用空间与剩余空间。

Prophet收集所有的Heartbeat,然后可以得到全局的Replica视图以及每个节点的存储空间信息。根据这些信息,Prophet将发送调度命令,将部分Replica转移到合适的Store上,以便保证每个Store上的Replica数目相近。由于每份Replica的数据量相同,因此Shard之间也能达到存储量的平衡。

Replica Hearbeat

分布式体系下每一个Shard在各个Store上有相应的Replicas(副本),这些Replica形成了一个Raft-Group,并且将在组内选举Leader。Leader周期性地向Prophet发送Heartbeat,将包括一下信息:

  • 当前Shard所拥有的Replica数量,以及每个Replica的最新活跃时间。
  • 当前Leader Replica所处的Store

Prophet收集所有Hearbeat然后构建一个全局的Shard ReplicaReplica Leader视图。根据这些信息,Prophet会发出调度命令,如下:

  • Add Replica命令:如果Shard Replica的数目不足,将寻找合适的Stores并向其中添加Replica
  • Remove Replica命令:如果Shard Replica的数目超过限制,则在合适的Stores上删除Replica
  • Move Replica命令:如果Shard Replica数目分布不均匀,那么某些Replica将被转移到相映Store上来保持平衡。
  • Transfer Leader命令: 如果Leader在集群中数目不平衡,那么某些Leader将被转移。

Event Notify

收集到的Heartbeat信息将被同步到所有Store,从而每个Store中都能在本地形成全局路由信息。