KipDB - Keep it Public DB

github star github fork

Crates.io LICENSE Rust Community

KipDB 轻量级键值存储引擎

整体设计参考LevelDB,旨在作为NewSQL分布式数据库的存储引擎 - 支持嵌入式/单机存储/远程调用等多应用场景 - 以Kiss作为开发理念,设计以简单而高效为主 - 实现MVCC以支持ACID - 高性能,BenchMark写入吞吐量约为Sled的两倍,且大数据量下的顺序读取平均延迟为1μs左右 - 远程连接使用ProtoBuf实现,支持多语言通信 - 极小的内存占用(待机/大量冷数据) - 并发安全,读读、读写并行

组件原理Wiki : https://github.com/KKould/KipDB/wiki

快速上手 🤞

组件引入

toml kip_db = "0.1.1-alpha.0"

代码编译

基本编译

``` shell

代码编译

cargo build

代码编译(正式环境)

cargo build --release

单元测试

cargo test

性能基准测试

cargo bench ```

Docker镜像编译

``` shell

编译镜像

docker build -t kould/kip-db:v1 .

运行镜像

docker run kould/kip-db:v1 ```

直接调用(基本使用)

```rust /// 指定文件夹以开启一个KvStore let kipdb = LsmStore::open("/welcome/kipdb").await?;

// 插入数据 kipdb.set(&b"https://github.com/KKould/KipDB", Bytes::from(&b"your star plz"[..])).await?; // 获取数据 let sixpence = kipdb.get(&b"my deposit").await?; // 已占有硬盘大小 let justlot = kipdb.sizeofdisk().await? // 已有数据数量 let howmanytimesyouinserted = kipdb.len().await?; // 删除数据 kip_db.remove(&b"ex girlfriend").await?;

// 创建事务 let mut transaction = kipdb.newtransaction().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?; ```

远程应用

服务启动

```rust /// 服务端启动! let listener = TcpListener::bind("127.0.0.1:8080").await?;

kipdb::net::server::run(listener, tokio::signal::ctrlc()).await; ```

远程调用

```rust /// 客户端调用! 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.sizeofdisk().await? // 存入指令数 client.len().await? // 数据刷入硬盘 client.flush().await? // 删除数据 client.remove(&vec![b'k']).await?; // 批量指令执行(可选 并行/同步 执行) let vecbatchcmd = vec![CommandData::get(b"k1".tovec()), CommandData::get(b"k2".tovec())]; client.batch(vecbatchcmd, true).await? ```

内置多种持久化内核👍

操作示例⌨️

服务端

``` shell 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 --port -V, --version Print version information

PS D:\Workspace\kould\KipDB\target\release> ./server
2022-10-13T06:50:06.528875Z INFO kipdb::kernel::lsm::sstable: [SsTable: 6985961041465315323][restorefromfile][TableMetaInfo]: MetaInfo { level: 0, version: 0, datalen: 118, indexlen: 97, partsize: 64, crccode: 43553795 }, Size of Disk: 263 2022-10-13T06:50:06.529614Z INFO kipdb::net::server: [Listener][Inbound Connections] 2022-10-13T06:50:13.437586Z INFO kipdb::net::server: [Listener][Shutting Down]

```

客户端

``` shell 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]

OPTIONS: -h, --help Print help information --hostname [default: 127.0.0.1] --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", "!"] ```

Features🌠

使用步骤

  1. 打包KipDB本体镜像docker build -t kould/kip-db:v1 .
  2. 打包Perf监测镜像docker build -f Dockerfile-perf -t kould/perf:v1 .
  3. 以任意形式执行kould/kip
  4. 执行attach-win.sh <kip-db容器ID>
  5. 在该bash内输入. record.sh <kip-db的server进程pid>
  6. 随后去对KipDB进行对应需要监测的操作
  7. 操作完毕后回到步骤5的bash内,以ctrl + c终止监听,得到perf.data
  8. 继续在该bash内输入. plot.sh <图片名.svg>, 即可生成火焰图

参考自:https://chinggg.github.io/post/docker-perf/

如果你想参与我们的工作、提供更好的意见或抱着一起学习的心态,欢迎联系我以加入群聊

微信联系方式

Thanks For

JetBrains