架构总览
BlockDB 是一层逻辑数据库。它由一组相互独立的 gRPC 服务组成,这些服务既可以组装进同一个无状态的 blockdb 进程一起运行,也可以拆分为独立服务按需部署与扩展。多服务设计
BlockDB 把对外能力拆分为若干服务,每个服务可以独立启停。核心进程cmd/blockdb 通过 -services 标志选择要启动的服务集合:
元数据服务
cmd/meta-service 是独立的元数据进程,负责逻辑表的生命周期与定义管理,包含三个子服务:TableMetaService(普通表)、BlockMetaService(Block 表)、TimeMetaService(Time 表)。核心服务通过 Meta 客户端读取表元数据,自身不持有物理表结构信息。
可集成或独立部署
同一套逻辑数据库,可以根据场景自由组合:- 进程内集成:把多个服务放进同一个 blockdb 进程,本地共享依赖,便于开发和中小规模部署。
- 独立部署:按读写等资源特征把服务拆成独立进程,各自水平扩展、独立运维。
推荐部署拓扑
目前实际部署推荐按读 / 写 / 后台的边界分组:- 所有读 API(scan 除外)集成在同一个 binary:
read+block-read。 - 所有写 API 集成在同一个服务:
write。 scan与subscribe各自独立部署:避免大扫描拖累读服务、长连接订阅影响其它服务。- 批量写入 worker 独立部署:
batch-worker独立扩缩容,与实时读写隔离。
底层依赖
BlockDB 作为逻辑层,自身不直接管理数据文件,底层依赖以下设施:- 物理数据库:遵循 MySQL 协议的物理在线数据库,BlockDB 通过标准 SQL 完成实际读写。
- Redis:作为缓存使用(如区块读取缓存)。
- Kafka:作为事件总线,分发区块写入事件并支撑订阅。
- 对象存储:用于大批量写入的数据中转,以及区块 bundle 等文件的存取。
设计要点
- 无状态:核心服务进程不持有本地状态,可自由组合、水平扩展。
- 元数据与计算分离:meta-service 管理表元数据,核心读写服务保持无状态。
- 按资源特征拆分:读 / 写 / 扫描 / 订阅按资源消耗与并发模型拆分为不同服务,便于独立调优与扩缩容。