Project summarize #206
artikell
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
目标
a high-performance, large-capacity, multi-tenant, data-persistent, strong data consistency based on raft, Redis-compatible elastic KV data storage system based on RocksDB
代码结构
流水线
流水线代表项目的CICD流程,在github上面也能说明一个项目是如何运行,以下是当前包含的流水线:
从编译看
根目录的CMakeLists.txt有点长,当前重点关注一下部分:
关键路径
启动路径
KiwiDB是服务的核心结构体,负责整个的初始化、启动、停止动作。
其中关键的属性包括:
kiwi::CmdThreadPool cmd_threads_;
std::unique_ptrnet::EventServer>> event_server_;
std::unordered_map<kiwi::BlockKey, std::unique_ptrstd::list>, kiwi::BlockKeyHash>
整个启动流程核心就是启动一个event_server对象和一些cmd_threads。
在链接管理上,主要有event_server对象来管理:
建联路径
这里有点复杂,因此直接上调用链路
请求路径
当前客户端获取到数据后,还是先由IOThread读取,并解析请求体,其中主要通过RespParse类来实现解析,并处理确定是否完成解析操作。
当IOThread完成解析后,将会区分出几部分逻辑,并分开执行:
当提交给cmd_thread处理时,会通过命令的params去查询到对应的命令对象,最终会将params传入给cmd去执行。
各个命令被抽象为BaseCmd的子类,整个实现都在src/cmd_*.cc中。
执行过程也分为了2步走:
在执行逻辑中,除了实现正确性外,核心关注如何与raft和rocksdb的交互。以HSET命令为例:
STORE_INST.GetBackend(client->GetCurrentDB())->GetStorage()->HSet(client->Key(), field, value, &temp);db_->Get(default_read_options_, handles_[kMetaCF], base_meta_key.Encode(), &meta_value);s = db_->Get(default_read_options_, handles_[kHashesDataCF], hashes_data_key.Encode(), &data_value);batch->Put(kHashesDataCF, hashes_data_key.Encode(), internal_value.Encode());定时操作
在event_server可以插入定时任务:
event_server_->AddTimerTask(timerTask);当前任务包括2个:
而在整个Timer的执行来看,主要是在BaseEvent层,通过全局锁来阻塞并处理。关键逻辑:
timer_->OnTimer();持久化
关于持久化,主要是通过了一个Batch来实现管理,在命令执行前,都会去创建一个Batch对象,直到处理完成后,会直接执行提交操作:
batch->Commit()创建流程中,会根据状态修改持久化的回调:
Raft::on_apply和Raft::AppendLog方法代码抽象
关键结构体
网络管理
IO流程
功能结构
WIP:关键功能实现
读写分离能力
Raft能力
Block命令实现
过期/逐出能力?
已知问题
工作流问题
命令实现问题
Ref
PikiwiDB 架构入门:arana-db/kiwi#144
存储层一些可优化点:arana-db/kiwi#127
代码学习:https://meeting.tencent.com/crm/KeYVZDYW15 (password:YDEN)
pacifica算法:https://www.scp.net.cn/blog/pacifica/
DTCC 2024一些见闻:arana-db/kiwi#2
Pika 新存储结构:OpenAtomFoundation/pikiwidb#2052
Beta Was this translation helpful? Give feedback.
All reactions