前言
MatrixKV是一个简单的分布式强一致KV存储系统,采用Pebble作为底层的存储引擎,MatrixCube作为分布式组件,以及自定义了最简单的读写请求接口。本文实验按照官方指引借助Docker模拟一个小型MatrixKV集群,来体验下相关功能与运作机制。
环境准备
本文实验是在docker环境下运行,需要用到docker与docker-compose工具,我本地电脑win10 64bit,直接安装Docker Desktop,就包含了所需要的工具。
docker -v
docker-compose -v
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 图形化管理节点
读写请求接口与路由
基础功能测试:写入、读取、删除、再读取
数据写入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数据。