文章

分布式 kv 数据库:platodb

platodb 介绍

platodb 是一款基于 LSM-Tree 存储结构的高性能分布式 key-value 数据库,采用 go 语言编写,支持快速的读写性能、崩溃恢复和主-从集群架构。适用于高吞吐量和低延迟需求的存储场景。

github 仓库:https://github.com/Jasonbourne723/platodb

Quick start

基于 Docker 快速安装 platodb

拉取镜像

1
docker pull jasonbourne723/platodb:latest

运行 platodb

1
docker run -d --name platodb --restart=always -p 3307:3307 platodb:latest

使用 plato-cli 连接

1
plato-cli -h 127.0.0.1 -p 3306

ping 命令测试

1
2
> ping
pong

架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
+---------------------+
|   Network Server    | (处理客户端请求)
+---------------------+
           |
           ▼
+---------------------+
|  Command Processor  | (解析命令)
+---------------------+
           |
           ▼
+-------------------------------------------------------+
|                         DB                            |
|  +---------------------+   +------------------------+ |
|  |  Memory Table       |   |  Write-Ahead Log (WAL) | |
|  |  (可变内存存储)      |   |  (崩溃恢复)             | |
|  +---------------------+   +------------------------+ |
|                 |                         |           |
|                 ▼                         ▼           |
|  +---------------------+   +------------------------+ |
|  |  Flusher (持久化)    |   |        SSTable         | |
|  +---------------------+   | (持久化块存储)          | |
|                            +------------------------+ |
+-------------------------------------------------------+
  • 网络服务器:负责接收客户端请求,通过 TCP 协议与客户端通信,解析请求后交由命令处理器处理。
  • 命令处理器:负责解析客户端发送的命令,如 Get、Set、Delete,并将其映射为具体的数据库操作。
  • 数据库引擎 (DB)
    • MemoryTable:活跃的数据存储,所有写入操作优先存储到内存表中。当内存表达到一定阈值时,会触发持久化。
    • WAL:在写入内存表前记录日志,确保在系统崩溃后可以恢复未持久化的数据。
    • SSTable:磁盘上的持久化存储结构,采用分段存储,支持二分查找、布隆过滤器加速查询,以及块缓存和快照机制提升读取性能。

数据格式


# sstable 分段
┌────────────┐      ┌────────────┐
│ 000001.seg │      │ 000002.seg │
└────────────┘      └────────────┘ 

# segment文件分块
┌──────────┬──────────┬───────────┬────────────┐
│ block-1  │ block-2  |  block-3  │  block-... │
└──────────┴──────────┴───────────┴────────────┘

# block块内包含多个记录
┌──────────┬──────────┬───────────┬────────────┐
│ chunk-1  │ chunk-2  |  chunk-3  │  chunk-... │
└──────────┴──────────┴───────────┴────────────┘

# 正常记录的字节格式
┌──────────┬──────┬─────────┬──────────┬─────────┬────────┐
│ tombstone│ crc  | KeyLen  │   Key    │ ValueLen│  Value │
└──────────┴──────┴─────────┴──────────┴─────────┴────────┘

# 已删除记录的字节格式
┌───────────┬───────┬─────────┬─────────┐
│ tombstone |  crc  │ KeyLen  │   Key   │
└───────────┴───────┴─────────┴─────────┘

性能表现

1
2
3
4
goos: windows
goarch: amd64
cpu: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
BenchmarkSet-16    	  224626	      5283 ns/op	    1204 B/op	      14 allocs/op

1
2
3
4
goos: windows
goarch: amd64
cpu: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
BenchmarkGet-16    	 1023334	      1083 ns/op	       0 B/op	       0 allocs/op
本文由作者按照 CC BY 4.0 进行授权