raftd 基于raft和bolt的分布式KV数据库 由于简单实现了租约系统 可以用于简单的服务发现 基于gin框架提供http服务
GPL-3.0 License
raftd 基于raft
算法,支持数据持久化(bolt)的分布式KV数据库,可以用于简单的服务发现,基于gin框架提供http服务
cd cmd/raftd
go build
./raftd -id node01 -haddr 127.0.0.1:8001 -raddr 127.0.0.1:8101 ~/.raftd01
./raftd -id node02 -haddr 127.0.0.1:8002 -raddr 127.0.0.1:8102 -join 127.0.0.1:8001 ~/.raftd02
./raftd -id node03 -haddr 127.0.0.1:8003 -raddr 127.0.0.1:8103 -join 127.0.0.1:8001 ~/.raftd03
curl -X PUT 127.0.0.1:8001/key/test -T ./test.png
curl 127.0.0.1:8001/key/test --output 1.png
步骤:
节点同步的步骤:
获取租约并续租
# 服务1
ID=$(curl -sL -XPOST 127.0.0.1:8001/lease/grant\?ttl=10\&name=/esq/node-1);while true;do curl -sL -XPOST 127.0.0.1:8001/lease/keepalive/$ID -d 'key=nodeinfo' -d 'data={"http_addr":"127.0.0.1:9001","tcp_addr":"127.0.0.1:9002","node_id":1,"weight":1}';sleep 3;done
# 服务2
ID=$(curl -sL -XPOST 127.0.0.1:8001/lease/grant\?ttl=10\&name=/esq/node-2);while true;do curl -sL -XPOST 127.0.0.1:8001/lease/keepalive/$ID -d 'key=nodeinfo1' -d 'data={"http_addr":"127.0.0.1:9003","tcp_addr":"127.0.0.1:9004","node_id":2,"weight":2}';sleep 3;done
获取键值对
curl -sL -XPOST 127.0.0.1:8001/lease/kv/nodeinfo -d 'prefix=/esq/node'
meta
,存放当前租约的元数据,包括 LeaseTTL LeaseAliveCount LeaseStatus LeaseNamemeta
中获取)申请了却从不租用的租约该怎么处理?这些租约的状态为CREATE,如果每次同步状态机时全部重启loopCheck,会消耗一定的资源,如果同步的时候直接删除这些租约属实 鸭子睁眼——大可不必 了,目前有一个可能的解决方案是 PutInPool
TimeToLive API
存放租约的树换成LSM-Tree,KV系统属于读多写少,租约系统属于读写都比较多,每秒会有多个协程更新整棵树,可以考虑为租约系统单独做一个存储引擎,准备参考https://github.com/dgraph-io/badger/tree/v1.0.0,这个库比较成熟,值得借鉴
关于 LSM Tree 存放租约 key 应该设计为 LeaseID value 设计为 metaSize(4bytes)valueSize(4bytes)meta(struct_json_bytes)value(map_json_bytes) TODO:考虑使用某个更高性能的json库