KipDB 轻量级键值存储引擎
支持 嵌入 式 /单机存 储/远程调用等 多 应用场景- 以Kiss
作 为开发理念 ,设计以简单而高 效 为主 - 实现MVCC以
支持 ACID 高性能 ,BenchMark写 入 吞吐量 约为Sled的 两倍,且大数 据 量 下 的 顺序读取平均 延 迟为1μ s左右 - 远程连接
使用 ProtoBuf实现,支持 多 语言通信 - 极小
的 内 存 占 用 (待 机 /大量 冷 数 据 ) - 并发
安全 ,读读、读写并行
组件
Tips:
kip_db = "0.1.2-alpha.15 "
# 代 码编译
cargo build
# 代 码编译(正式 环境)
cargo build --release
# 单元测试
cargo test
# 性能 基 准 测试
cargo bench
# 编译镜像
docker build -t kould/kip-db:v1 .
# 运行镜像
docker run kould/kip-db:v1
/// 指定 文 件 夹以开启一 个KvStore
let kip_db = LsmStore::open("/welcome/kip_db").await?;
// 插入 数 据
kip_db.set(&b"https://github.com/KKould/KipDB", Bytes::from(&b"your star plz"[..])).await?;
// 获取数 据
let six_pence = kip_db.get(&b"my deposit").await?;
// 已 占有 硬 盘大小
let just_lot = kip_db.size_of_disk().await?
// 已 有数 据 数量
let how_many_times_you_inserted = kip_db.len().await?;
// 删除数 据
kip_db.remove(&b"ex girlfriend").await?;
// 创建事 务
let mut transaction = kip_db.new_transaction().await?;
// 插入 数 据 至 事 务中
transaction.set(&b"this moment", Bytes::from(&b"hope u like it"[..]));
// 删除该事务中key对应的 value
transaction.remove(&b"trouble")?;
// 获取此事务中key对应的 value
let ping_cap = transaction.get(&b"dream job")?;
// 提 交事务
transaction.commit().await?;
// 创建持久 化 数 据 迭代器
let guard = kip_db.iter().await?;
let mut iterator = guard.iter()?;
// 获取下 一 个元素
let hello = iterator.next_err()?;
// 移 动至第 一 个元素
let world = iterator.seek(Seek::Last)?;
// 强制 数 据 刷 入 硬 盘
kip_db.flush().await?;
/// 服 务端启动!
let listener = TcpListener::bind("127.0.0.1:8080").await?;
kip_db::net::server::run(listener, tokio::signal::ctrl_c()).await;
/// 客 户端调用!
let mut client = Client::connect("127.0.0.1:8080").await?;
// 插入 数 据
client.set(&vec![b'k'], vec![b'v']).await?
// 获取数 据
client.get(&vec![b'k']).await?
// 已 占有 硬 盘大小
client.size_of_disk().await?
// 存 入 指令 数
client.len().await?
// 数 据 刷 入 硬 盘
client.flush().await?
// 删除数 据
client.remove(&vec![b'k']).await?;
// 批量指令 执行(可 选 并行/同 步 执行)
let vec_batch_cmd = vec![CommandData::get(b"k1".to_vec()), CommandData::get(b"k2".to_vec())];
client.batch(vec_batch_cmd, true).await?
- LsmStore: LSM
存 储,使用 Leveled Compaction策略 (默 认内核 ) - HashStore: 类Bitcask
- SledStore:
基 于Sled数 据 库进行 封 装
PS D:\Workspace\kould\KipDB\target\release> ./server -h
KipDB-Server 0.1.0
Kould <2435992353@qq.com>
A KV-Store server
USAGE:
server.exe [OPTIONS]
OPTIONS:
-h, --help Print help information
--ip <IP>
--port <PORT>
-V, --version Print version information
PS D:\Workspace\kould\KipDB\target\release> ./server
2022-10-13T06:50:06.528875Z INFO kip_db::kernel::lsm::ss_table: [SsTable: 6985961041465315323][restore_from_file][TableMetaInfo]: MetaInfo { level: 0, version: 0, data_len: 118, index_len: 97, part_size: 64, crc_code: 43553795 }, Size of Disk: 263
2022-10-13T06:50:06.529614Z INFO kip_db::net::server: [Listener][Inbound Connections]
2022-10-13T06:50:13.437586Z INFO kip_db::net::server: [Listener][Shutting Down]
PS D:\Workspace\kould\KipDB\target\release> ./cli --help
KipDB-Cli 0.1.0
Kould <2435992353@qq.com>
Issue KipDB Commands
USAGE:
cli.exe [OPTIONS] <SUBCOMMAND>
OPTIONS:
-h, --help Print help information
--hostname <hostname> [default: 127.0.0.1]
--port <PORT> [default: 6333]
-V, --version Print version information
SUBCOMMANDS:
batch-get
batch-remove
batch-set
flush
get
help Print this message or the help of the given subcommand(s)
len
remove
set
size-of-disk
PS D:\Workspace\kould\KipDB\target\release> ./cli batch-set kould kipdb welcome !
2022-09-27T09:50:11.768931Z INFO cli: ["Done!", "Done!"]
PS D:\Workspace\kould\KipDB\target\release> ./cli batch-get kould kipdb
2022-09-27T09:50:32.753919Z INFO cli: ["welcome", "!"]
- Major Compation
多 级递增 循环压缩 ✅- SSTable压缩
状 态互斥- 避免并行压缩时数
据 范围重 复 ✅
- 避免并行压缩时数
- KVStore
参考 Sled增加 api- size_of_disk ✅
- clear
- contains_key
- iter ✅
- len ✅
- is_empty ✅
- ...
多 进程锁 ✅防止 多 进程对文件 进行读写造成 数 据 异常
- SSTable
布 隆 过滤器 ✅加 快 获取键值的 速度
- MetaBlock ✅
用 于存储统计数据 布 隆 过滤器 的 存 放
- Block
- DataBlock、IndexBlock复用实现并共
享 缓存 ✅ - 实现
前 缀压缩并使用 varint编码以及LZ4减小空 间占用 ✅ 基 于前缀进行 二 分 查询 ✅
- DataBlock、IndexBlock复用实现并共
- Cache
- TableCache: SSTableLoader懒加载 ✅
- BlockCache:
稀 疏索引数 据 块缓存 ✅ - 类LevelDB
的 并行LruCache: ShardingLruCache ✅
- Iterator 迭代
器 - BlockIterator ✅
- SSTableIterator ✅
- LevelIterator ✅
- VersionIterator ✅
- WAL
防 灾日志 - 落盘时异
常 后 重 启数据 回 复 ✅ - 读取
数 据 不 存在 时尝试读取 ✅
- 落盘时异
- MVCC单机
事 务 ✅- Manifest
多 版本 持久 化 ✅ - SSTable
多 版本 持久 化 ✅
- Manifest
- 网络
通信 使用 ProtoBuf进行多 语言序列 化 ✅- Ruby of KipDB
- Java of KipDB
- Rust of KipDB ✅
分布 式 使用 Raft复制协议保持 状 态一致
- 为了
方便 性能 调优等 监测,提供 了 两个Dockerfile作 为支持 - Dockerfile: KipDB
的 Server与 Cli - Dockerfile-perf:
外部 Perf监测
- Dockerfile: KipDB
打 包 KipDB本体 镜像docker build -t kould/kip-db:v1 .
打 包 Perf监测镜像docker build -f Dockerfile-perf -t kould/perf:v1 .
- 以
任意 形式 执行kould/kip例 :docker run kould/kip-db:v1
- 执行
attach-win.sh <kip-db
容器 ID>例 :./attach-win.sh 263ad21cc56169ebec79bbf614c6986a78ec89a6e0bdad5e364571d28bee2bfc
在 该bash内 输入.record.sh <kip-db
的 server进程pid>若 不 清楚 进程id是 多少 可 以直接 输入ps,通常 为1注意 !:不要 关闭bash,否 则会监听失 败!
随 后 去 对KipDB进行对应需要 监测的 操作 操作 完 毕后回 到 步 骤5的 bash内 ,以ctrl + c终止监听,得 到 perf.data- 继续
在 该bash内 输入. plot.sh <图片
,名 .svg>即 可 生成 火 焰图- 导出图片
一般 可 使用 docker cp
和 docker exec
或 挂载 volume,为方便 预览和 复制文 件 ,容器 内 置 了 轻量网页服 务,执行thttpd -p <
端 口 号 >即 可 。由 于脚本中 没 有 设置端 口 转发,需要 docker inspect <
查看目 标容器 ID> | grep IPAdress目 标容器 的 IP,然 后 在 浏览器 中 访问即 可 。若 需要 更 灵活的 操作 ,可 不用 以上 脚本 手 动添加 参 数 运行容器 。
- 导出图片