前言

MatrixKV是一个简单的分布式强一致KV存储系统,采用Pebble作为底层的存储引擎,MatrixCube作为分布式组件,以及自定义了最简单的读写请求接口。用户可以非常简单的在任意一个节点发起读写数据的请求,也可以从任意一个节点读到需要的数据。

体验过程

  1. 首先,安装实验所需工具docker和docker-compose,再将将MatrixKV代码Clone到本地。
  2. kvm分布式存储 kvm分布式节点_容器

  3. 这次实验准备的这个小型集群有四个节点,其中三个为Prophet节点,一个为数据节点。我们以docker进行容器包装的形式来在单机上进行模拟。

    我们可以看到在/cfg文件夹中有node0-node3的配置文件,其中Node0-Node2均为Prophet节点,Node3为数据节点。
  4. 在MatrixKV的路径下运行make docker命令,它会将MatrixKV整体打包成镜像,在make docker之前要执行go mod vendor,然后通过docker-compose up命令将MatrixKV的镜像分别根据不同的节点配置启动四份,从而形成我们的Node0到Node3的四节点集群。
  5. kvm分布式存储 kvm分布式节点_数据_02


  6. kvm分布式存储 kvm分布式节点_分布式_03

  7. 可以看到在我们指定的数据目录中已经开始生成了很多存储数据的文件夹以及一些初始文件。
  8. kvm分布式存储 kvm分布式节点_docker_04

  9. MatrixKV包装了几个非常简单的数据读写接口:set, get, delete
    我们可以在node0上写入数据,而在node0到node3上都可以进行读取,这验证MatrixCube的强一致性,保证任何时刻从任何节点读到的数据都是最新的以及一致的。
  10. kvm分布式存储 kvm分布式节点_分布式_05

  11. 查看现阶段集群中与节点中的Shard情况
  12. kvm分布式存储 kvm分布式节点_kvm分布式存储_06

  13. 初始状态下集群只有3个Shard,id分别为4, 8, 9, 它们实际存储的节点在node1,node2与node3中,node0为null。
    若写入一个超过1024Byte的数据之后,我们可以看到node1,node2与node3中的Shard全部进行了分裂。
  14. 最后看下MatrixCube的高可用保障的功能。
    手动停止node3docker stop matrixkv-node3-1 尝试再访问node3的命令失败,但剩下节点均可读取成功(这体现了分布式系统对整体高可用性)
  15. kvm分布式存储 kvm分布式节点_数据_07

  16. 在一个节点宕机后,为保证三副本,matrixkv 会将数据复制到可用的副本上。
    在停止node3后,node3的shard移动到了node0。
  17. MatrixKV代码
    通过整个实验我们已经完整体验了在MatrixCube帮助下将一个单机的KV存储引擎Pebble变成了一个分布式的KV存储。而其中需要MatrixKV本身实现的代码是非常简单的。总的来说就只有4个go文件,不到300行代码就可以完成MatrixKV的全部搭建。
    /cmd/matrixkv.go: 整体程序启动的入口,进行最基本的初始化并启动服务。
    /pkg/config/config.go: 定义了一个MatrixKV整体配置的数据结构。
    /pkg/metadata/metadata.go:定义了用户与MatrixKV读写交互请求的数据结构。
    /pkg/server/server.go:这是MatrixKV的最主体功能,其中主要做了三件事:
    定义MatrixKV server的数据结构。
    定义Set/Get/Delete等相关请求的Executor具体实现。
    调用Pebble库作为单机存储引擎,实现MatrixCube指定的DataStorage接口,将MatrixCube的Config项设置到相应方法上。

感谢MatrixOne社区的这次活动,让我对分布式存储系统有了一定的了解。