300行实现的完整分布式存储系统MatrixKV初体验

前言

MatrixKV是一个简单的分布式强一致KV存储系统,采用Pebble作为底层的存储引擎,MatrixCube作为分布式组件,以及自定义了最简单的读写请求接口。本文实验按照官方指引借助Docker模拟一个小型MatrixKV集群,来体验下相关功能与运作机制。


环境准备

本文实验是在docker环境下运行,需要用到docker与docker-compose工具,我本地电脑win10 64bit,直接安装Docker Desktop,就包含了所需要的工具。

docker -v
docker-compose -v

docker版本

Clone 代码
git clone https://github.com/matrixorigin/matrixkv

集群配置

/cfg 文件夹中有node0-node3的配置文件,其中Node0-Node2均为Prophet节点,Node3为数据节点,这里我没修改,采用官方默认配置,注意 dir-data 目录位置。

Prophet节点设置

addr-raft = "node0:8081"
addr-client = "node0:8082"
dir-data = "/data/matrixkv"

[raft]
max-entry-bytes = "200MB"

[replication]
max-peer-down-time = "15s"

[prophet]
name = "node0"
rpc-addr = "node0:8083"
prophet-node = true

[prophet.schedule]
max-container-down-time = "10s"

[prophet.embed-etcd]
join = ""
client-urls = "http://0.0.0.0:8084"
advertise-client-urls = "http://node0:8084"
peer-urls = "http://0.0.0.0:8085"
advertise-peer-urls = "http://node0:8085"

[prophet.replication]
max-replicas = 3


数据节点设置

addr-raft = "node3:8081"
addr-client = "node3:8082"
dir-data = "/data/matrixkv"

[raft]
max-entry-bytes = "200MB"

[replication]
max-peer-down-time = "15s"

[prophet]
name = "node3"
rpc-addr = "node3:8083"
prophet-node = false
external-etcd = [
    "http://node0:8084",
    "http://node1:8084",
    "http://node2:8084",
]

Docker-Compose设置

注意 shard-capacity=1024,之后的实验中可能会修改

version: '2.1'
services:
  node0:
    image: matrixkv
    ports:
      - "8080:8080"
    volumes:
      - ./cfg/node0.toml:/etc/cube.toml
      - /data/node0:/data/matrixkv
    command: 
      - --addr=node0:8080
      - --cfg=/etc/cube.toml
      # shard will split after 1024 bytes
      - --shard-capacity=1024

  node1:
    image: matrixkv
    ports:
      - "8081:8080"
    volumes:
      - ./cfg/node1.toml:/etc/cube.toml
      - /data/node1:/data/matrixkv
    command: 
      - --addr=node1:8080
      - --cfg=/etc/cube.toml
      # shard will split after 1024 bytes
      - --shard-capacity=1024
    depends_on:
      - node0

  node2:
    image: matrixkv
    ports:
      - "8082:8080"
    volumes:
      - ./cfg/node2.toml:/etc/cube.toml
      - /data/node2:/data/matrixkv
    command: 
      - --addr=node2:8080
      - --cfg=/etc/cube.toml
      # shard will split after 1024 bytes
      - --shard-capacity=1024
    depends_on:
      - node1

  node3:
    image: matrixkv
    ports:
      - "8083:8080"
    volumes:
      - ./cfg/node3.toml:/etc/cube.toml
      - /data/node3:/data/matrixkv
    command: 
      - --addr=node3:8080
      - --cfg=/etc/cube.toml
      # shard will split after 1024 bytes
      - --shard-capacity=1024
    depends_on:
      - node0
      - node1
      - node2

集群启动

编译时有报错,makefile做了修改mod=mod,并在Dockerfile中增加go的中国源站设置加快下载速度

matrixkv: dist_dir; $(info ======== compiled matrixkv binary)
	env GOOS=$(GOOS) go build -mod=mod -o $(DIST_DIR)matrixkv $(LD_FLAGS) $(ROOT_DIR)cmd/*.go
RUN go env -w GOPROXY=https://goproxy.cn,direct	
make docker // 先去喝杯茶等
docker-compose up // 开干

启动过程
节点状态

也可以使用Docker Desktop 图形化管理节点

节点状态UI展示

读写请求接口与路由

基础功能测试:写入、读取、删除、再读取

数据写入SET
curl -X POST  -H 'Content-Type: application/json' -d '{"key":"k1","value":"v1"}' http://127.0.0.1:8080/set
数据读取GET
curl http://127.0.0.1:8080/get?key=k1
数据删除DELETE
curl -X POST -H 'Content-Type: application/json' -d '{"key":"big2"}' http://127.0.0.1:8080/delete
数据读取GET
curl http://127.0.0.1:8080/get?key=k1

增删查

某一节点写入,其它节点查询,依然可以查到,体验了MatrixCube中的Shard Proxy的功能

其它节点查询

数据分片查询与分裂

MatrixCube会在写入的数据量达到一定级别的时候产生Shard分裂,在集群配置环节中,Shard的大小设置成了–shard-capacity =1024Byte。因此写入数据量超过1k将分裂,我们准备用一个3k的json文本来试验。

当前集群中的Shard情况
curl http://127.0.0.1:8080/shards
当前节点中的Shard情况
curl http://127.0.0.1:8080/shards?local=true

当前的 shard 数量,有 id 为4、6和8共3个 shard。

在这里插入图片描述

写入测试的大key再观察下

在这里插入图片描述
在这里插入图片描述

发生分裂后,shard 已经有 id 为15、16、17、19、20、21、23、24、25共9个 shard

在这里插入图片描述

节点变化与副本生成

通过Docker Desktop来手动关停node0节点容器,模拟真实环境中的机器故障情况。发现node0节点读取操作连接拒绝,其它节点读取操作是可用的。

在这里插入图片描述
在这里插入图片描述

在node0节点宕机后,为了保证3副本,MatrixCube会自动将数据复制一份到其它未分配的节点,本机是node1节点,始终通过三个副本来保证高可用性。

在这里插入图片描述

问题总结

集群启动后,体验过程中可能会遇到一些看不懂的错误,可直接删除容器重建,及删除data数据。

参考官方体验指引

MatrixCube揭秘102——300行实现的完整分布式存储系统MatrixKV

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值