Auto-Rebalance & Scheduling
MatrixCube是一个实现分布式系统的框架。对于分布式系统来说,数据存储在多台机器上,而当集群中的计算机的数量发生变化时,例如集群扩展或计算机崩溃,都需要跨主机进行数据转移。
Prophet是MatrixCube的自平衡和调度的关键组件。Prophet中嵌入了Etcd Server组件来存储集群的元数据。
其主要实现了三个目标:
* 保持每个Store存储量平衡。
* 保持读写请求的负载平衡。
* 保持逻辑表分布平衡。 
为此,我们设计了Heartbeat和Event Notify机制来实现以上目标。每个Store和Leader 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 Replica与Replica 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中都能在本地形成全局路由信息。