MatrixCube简介

MatrixCube是一个基于Multi-Raft实现的自带调度能力的分布式存储框架,实现了集群的高可用性、强一致性与可扩展性。MatrixCube的设计目标是让开发人员只需要关注一个节点上的业务逻辑但却能够轻松实现各种强一致的分布式存储服务。我们可以使用MatrixCube来构建一些常见的分布式存储服务,比如:分布式Redis分布式KV等等。

MatrixCube框架

MatrixCube

核心概念

我们首先需要阐明一些MatrixCube的核心概念。

Store

MatrixCube分布式系统包括一定数量的主机,数据正是存放在这些机器中——我们把集群中的每台计算机称之为Store

Shard

数据库中的数据是按逻辑组织成表,而数据又可以分成不同的分区进行存储,如此可以得到更好的扩展性。因此,数据在Matrixcube集群中分片存储,每个数据分片我们称之为一个Shard,而一个Store中可以管理多个Shard;当Shard的存储容量超过限制时,会进行分裂(Split)。

Replica

为了保证存储服务的高可用性,每个Shard的数据需要存储多份,并且分布在不同的Store上,Shard的一个数据副本我们称之为一个Replica。所以一个Shard会包含多个Replica,并且每个Replica中的数据都是相同的。

Raft-group与Leader

多个数据副本存储在不同的Store上,一旦其中的一个副本更新,其他的副本也必须与之保持一致。无论客户端向哪个副本发出查询请求,都将得到相同的结果。为了保证数据的一致性,我们采用Raft协议来实现数据共识,一个Shard的多个Replica会组成一个Raft-Group
在每个Raft-group中,将会选出一个Leader来代表整个组,所有的读写请求仅仅由这个Leader处理。

更多相关信息:Raft中如何选举出一个Leader?

Data Storage

DataStorage是实现分布式存储服务的接口,使用MatrixCube就必须要预先定义DataStorage,用来存储单机数据。基于DataStorage可以轻松构建一些常见的分布式存储服务。MatrixCube默认提供了一个完整的基于KV的DataStorage,因为基于KV的存储可以满足大部分的场景。

Prophet

Prophet是一个调度模块,主要职责是实现Auto-Rebalance,从而维持每个ShardReplica数目均衡(本质上是为了保持Store之间的存储量与吞吐量均衡)。集群中初始的三个Store便是全部的Prophet Nodes

更多相关信息:Prophet如何实现调度功能?

Raftstore

Raftstore 是MatrixCube的核心组件,实现了MatrixCube中大多数重要功能:

  • Metadata storage:存储StoreShardRaft-log的元数据信息。

  • Multi-Raft management:管理了StoreShardReplicaRaft-Group之间的相关关系,实现多个Raft-Group,Leader选举和再选举。

  • Global Routing:ProphetEvent Notify机制构建了一个全局路由表;读写路由将也基于此路由表。

  • Shard Proxy:Shard Proxy用来代理Shard的读写请求。为了对MatrixCube的使用者屏蔽Multi-Raft的实现细节,MatrixCube集群中的任意节点对于发起读写请求的客户端都是等价的,用户可以在任意节点发起读写操作,这些读写请求会被Shard Proxy代理,并根据全局路由将请求转发到正确的节点。

更多相关信息:Shard Proxy与Global Routing的工作机理

主要特性

强一致性*

MatrixCube实现了强大的一致性,它保证在任何数据成功写入之后,之后的读取将获得最新的值,而无论来自哪个节点。

容错性

MatrixCube实现的分布式存储服务具有容错性、高可用性。若一个Shard拥有2*N+1Replicas,那么只要失效的Replicas不超过N个,系统都将正常运转。
例如,有3个Stores的集群可以在1个Store下线时继续运转;有5个Stores的集群可以在2个 Stores下线的情况运转。

Shard Splitting

Shard容量大小有一定限制。每当Shard超过其存储容量限制时,MatrixCube将Shard分裂为两个,并保持分裂后的每个Shard具有相同的存储量。
你可以在此处了解有关此过程的详细叙述:Shard Splitting的工作机制

Auto-Rebalance

分布式系统应该充分利用所有节点的计算能力和存储能力。对于MatrixCube集群,当增加或减少Stores时,将发生Auto-Rebalance,它将在Store之间转移数据,以达到每个Store的负载平衡。

详情请见[Auto-Rebalance的工作机制]:(matrixcube-auto-rebalance-scheduling.md)。

Scale-out

通过shard splittingauto-rebalance,MatrixCube分布式系统能够横向扩展,集群存储和吞吐量能力与Stores的数量成比例。

用户自定义存储引擎

MatrixCube对集群中每个数据存储引擎没有限制。换言之,任何存储引擎只要实现了MatrixCube定义的DataStorage接口,都可以搭建起基于MatrixCube的分布式系统。默认情况下,MatrixCube提供了一个基于Pebble的Key-Value存储引擎(PebbleRocksDB的Go语言版本)。

用户自定义读写

MatrixCube作为一种通用分布式存储框架,可以构建不同的分布式存储系统。用户也可以自定义读写命令。只要它能够在单机版本中工作,MatrixCube就可以将其升级到分布式版本。