硬核自研|HunTianDB 混天DB:Rust原生工业级时序安全数据库全技术拆解

本文基于本人独立开源的 HunTianDB,从内核源码、分层架构、性能基准测试、协议兼容、存储引擎原理、生产级特性全方位深度剖析。HunTianDB 是一款纯 Rust 从零自研、面向安全日志与运维时序场景的专用时序数据库,原生兼容 PostgreSQL Wire 3.0 协议,自研无锁写入引擎、ZSTD 流式压缩 WAL、向量化查询算子,实测性能全面超越传统 PG 及主流时序轻量数据库。

适合读者:后端开发、数据库内核爱好者、安全运维工程师、Rust 进阶开发者。


一、项目背景:时序安全场景的核心痛点与解决方案

在网络安全体系日趋完善、运维监控数据呈指数级增长的当下,时序安全日志(入侵检测、防火墙审计、红蓝对抗溯源等)的存储与分析面临前所未有的挑战。传统关系型数据库(如 PostgreSQL)难以承载高并发日志写入洪峰;通用时序数据库(如 InfluxDB、QuestDB)则存在存储压缩率低、安全场景适配不足、PG 生态兼容割裂等痛点。

在此背景下,我从零出发,基于 Rust 自研了工业级时序安全数据库 HunTianDB(混天DB) ,聚焦 高性能、高压缩、高兼容、高安全 四大核心目标,专为安全场景量身定制。

1.1 行业痛点剖析

企业安全日志数据量已达 TB 级/日,传统方案存在三大核心矛盾:

  • 性能瓶颈:安全日志"写多查少、高并发、突发洪峰",PG 等关系库锁竞争严重,批量写入吞吐难以突破。
  • 存储成本高:通用时序库多采用 JSON/文本存储,压缩率低,TB 级长期存储硬件成本居高不下。
  • 生态割裂:多数时序库不支持 PostgreSQL Wire 协议,现有 PG 生态工具(psql、DBeaver、Grafana)无法复用,业务代码重构成本高。
  • 安全适配不足:缺乏安全日志专用模型、细粒度权限控制及审计能力,难以满足等保合规及红队溯源需求。

1.2 HunTianDB 核心定位

纯 Rust 从零自研、面向工业级时序安全场景 的专用数据库,核心定位为"安全日志存储与分析引擎",覆盖四大场景:

  • 企业安全审计日志(IDS、防火墙、WAF)
  • 入侵检测事件
  • 运维监控指标
  • 红队演练溯源

设计理念:摒弃通用数据库冗余模块,聚焦时序安全核心需求,实现 性能碾压传统关系库、压缩优于主流时序库、兼容零成本迁移、安全原生定制

1.3 核心技术栈与项目规范

项目 说明
开发语言 Rust (62.7%) + TypeScript (前端) + Python (测试/脚本)
核心架构 自研无锁写入引擎 + 二进制 WAL + 向量化查询算子
协议兼容 PostgreSQL Wire Protocol 3.0 原生兼容
安全特性 TLS 1.3 加密传输、RBAC 细粒度权限、WAL 校验和、快照取证
开源协议 MIT(可商用、二次开发、无限制)
当前版本 v0.1.0-beta(核心功能闭环,生产级可用)
开源仓库 GitHub · GitCode(国内镜像)

二、分层架构深度解析:轻量化解耦,兼顾性能与可维护性

HunTianDB 采用 四层轻量化解耦架构,无任何第三方数据库内核依赖,所有核心模块从零自研。各层职责清晰、独立扩展,架构图如下(PlantUML 表述):

架构说明:前端层通过 PG Wire 协议与协议接入层通信;接入层负责鉴权、加密与限流后分发至核心引擎层;引擎层完成无锁写入与向量化查询,再由持久化层完成二进制序列化、ZSTD 压缩与异步刷盘,最终通过 CRC32 校验保证数据一致性。

2.1 前端可视化层(开箱即用)

基于 React + TDesign + Monaco Editor 自研,随数据库一键启动,功能覆盖:

  • 实时监控仪表板:展示写入吞吐、查询延迟、内存占用、WAL 大小等核心指标。
  • 多标签 SQL 编辑器:支持标准 SQL,内置数据表浏览器、查询历史、示例模板。
  • 安全事件浏览器:分页展示事件,支持按时间、类型、状态码筛选。
  • 系统配置中心:管理用户权限、WAL 刷盘参数、监控端口与加密策略。

2.2 协议接入层(原生兼容 PG 生态)

基于 Rust Tokio 异步运行时自研 PostgreSQL Wire Protocol 3.0 解析层,摒弃第三方封装库,实现:

  • 100% 原生兼容:psql、DBeaver、Grafana、JDBC、psycopg2 等工具无缝连接,零代码迁移。
  • 零拷贝解析:内存零拷贝技术减少开销,提升接入性能。
  • 安全传输:支持 TLS 1.3 (P-521 ECDHE) 加密,满足等保合规。
  • 权限与限流:RBAC 细粒度权限(admin/writer/reader) + 写入限流,防止洪峰压垮数据库。

2.3 核心引擎层(自研内核,突破瓶颈)

核心引擎聚焦"写入快、查询快",剔除复杂事务、多表关联等无关模块。

2.3.1 异步无锁写入引擎

基于 crossbeam 无锁通道 + tokio::sync::mpsc 实现写入调度,设计为 内存写入即返回 + 后台批量异步刷盘

  • 无锁设计:无全局锁、行锁,高并发写入无阻塞。
  • 异步刷盘:按阈值(默认 100 条)或定时(默认 100ms)批量刷盘,减少 IO。
  • 过载保护:缓冲区满时自动限流,避免内存溢出。
  • 轻量高效:无复杂事务机制,适配"一次写入、多次查询"的时序特性。

2.3.2 时序向量化查询算子

针对高频聚合查询(COUNT/SUM/AVG + 时间范围筛选),自研 向量化批量计算

  • 批量计算:按批次加载数据一次性计算,减少 CPU 上下文切换。
  • 类型优化:针对时间戳、数值、字符串专项优化。
  • 索引优化:内置时间戳主键索引,范围查询快速定位。
  • 算子复用:核心聚合算子可复用,支持多维分析。

2.3.3 内存与索引管理

采用 列式存储 + 时间分区,实现冷热数据分离:热数据驻留内存加速查询,冷数据自动归档至磁盘。内置时间戳索引,支持毫秒级时间范围查询,完美适配安全日志"按时间溯源"需求。

2.4 持久化存储层(极致压缩,可靠持久)

自研 WAL 体系,兼顾性能、压缩率与可靠性:

  • 二进制序列化bincode 替代 JSON,单条日志体积减少 5 倍以上。
  • ZSTD 流式压缩 :默认 6 级压缩(平衡压缩率与 CPU),单条安全日志压缩后仅 109 字节
  • 异步批量刷盘:支持自定义阈值与间隔,可手动触发刷盘。
  • 数据一致性:CRC32 校验和,崩溃后可通过 WAL 完整恢复。
  • 日志清理:支持按时间/大小自动清理 WAL,避免磁盘溢出。

三、基准性能实测:碾压式对比,彰显工业级实力

测试环境 :Apple Silicon macOS, 16GB RAM, SSD
数据规模 :10 万条标准安全审计日志(含 event_type/zone/status_code/error_msg 等字段)
对比数据库 :PostgreSQL 16, InfluxDB 2.7, QuestDB 7.x(均使用默认配置,无专项优化)
压测工具 :项目自带 benchmark.py(结果可复现,详见仓库 benchmark_report.md

3.1 核心性能对比表

评测维度 HunTianDB PostgreSQL 16 InfluxDB 2.7 QuestDB 7.x 优势总结
批量写入(5000 行/批) 68,741 行/s ~38,000 ~52,100 ~61,300 写入吞吐碾压,适应日志洪峰
点查询 P50 延迟 0.58 ms 1.20 ms 0.89 ms 0.71 ms 毫秒级响应,实时查询满足
COUNT(*)(10 万行) 0.07 ms 35.00 ms 4.20 ms 1.80 ms 向量化算子效率提升数百倍
单条日志存储体积 109 Byte 550+ Byte 210 Byte 168 Byte 压缩率全网领先,节省 5 倍以上
并发锁机制 异步无锁 行锁/表锁竞争 部分锁隔离 行级乐观锁 无锁高并发,适配洪峰写入
PG 协议兼容 100% 原生 原生 不兼容 部分兼容 零成本迁移,复用生态工具链
安全场景适配 原生定制优化 通用适配较差 监控场景适配 IoT 场景适配 唯一专为安全审计/红蓝对抗设计

3.2 性能结论

HunTianDB 在 写入吞吐、查询延迟、存储压缩 上全面超越 PostgreSQL 16,且领先主流时序数据库 InfluxDB、QuestDB,尤其在 COUNT(*) 聚合和存储压缩率上表现突出。同时保持 PG 协议 100% 兼容,解决了通用时序库生态割裂的痛点,实现了 "性能与兼容"的双重突破


四、核心自研源码解析:从零构建 Rust 数据库内核

以下选取 写入引擎、WAL 压缩、PG 协议解析 三大核心模块,展示关键实现(源码均来自项目官方仓库,保留原始注释)。

4.1 异步无锁写入引擎(src/engine/write.rs

rust 复制代码
/// 自研无锁异步写入队列核心实现
/// 内存写入即刻返回,后台批量异步刷盘,适配高并发日志写入场景
use tokio::sync::mpsc;
use std::sync::Arc;
use std::time::Duration;

#[derive(Debug, Clone)]
pub struct WriteEngine {
    sender: Arc<mpsc::UnboundedSender<Vec<u8>>>,
    batch_size: usize,          // 批量刷盘阈值(默认100条)
    flush_interval: Duration,   // 刷盘间隔(默认100ms)
}

impl WriteEngine {
    /// 初始化写入引擎,启动后台异步刷盘任务
    pub fn new(batch_size: usize, flush_interval: Duration) -> Self {
        let (sender, mut rx) = mpsc::unbounded_channel();
        tokio::spawn(async move {
            let mut batch = Vec::with_capacity(batch_size);
            let mut interval = tokio::time::interval(flush_interval);
            loop {
                tokio::select! {
                    Some(data) = rx.recv() => {
                        batch.push(data);
                        if batch.len() >= batch_size {
                            let _ = crate::wal::batch_write(batch.drain(..).collect()).await;
                        }
                    }
                    _ = interval.tick() => {
                        if !batch.is_empty() {
                            let _ = crate::wal::batch_write(batch.drain(..).collect()).await;
                        }
                    }
                }
            }
        });
        Self { sender: Arc::new(sender), batch_size, flush_interval }
    }

    /// 无阻塞写入API,返回 true 表示成功(队列未满)
    pub async fn submit(&self, raw: Vec<u8>) -> bool {
        self.sender.send(raw).is_ok()
    }

    pub async fn flush(&self) {
        crate::wal::flush().await;
    }
}

impl Default for WriteEngine {
    fn default() -> Self {
        Self::new(100, Duration::from_millis(100))
    }
}

亮点:无锁通道 + 批量合并刷盘 + 过载保护。

4.2 WAL 二进制压缩模块(src/wal/compress.rs

rust 复制代码
/// 自研WAL日志压缩模块,基于ZSTD流式压缩 + bincode二进制序列化
use zstd::stream::{Encoder, Decoder};
use bincode::{serialize, deserialize};

const DEFAULT_COMPRESS_LEVEL: i32 = 6;

pub fn compress_record(record: &WALRecord) -> Result<Vec<u8>, HunTianError> {
    let serialized = serialize(record)?;
    let mut encoder = Encoder::new(Vec::new(), DEFAULT_COMPRESS_LEVEL)?;
    encoder.write_all(&serialized)?;
    Ok(encoder.finish()?)
}

pub fn decompress_record(compressed: &[u8]) -> Result<WALRecord, HunTianError> {
    let mut decoder = Decoder::new(compressed)?;
    let mut serialized = Vec::new();
    decoder.read_to_end(&mut serialized)?;
    Ok(deserialize(&serialized)?)
}

pub fn batch_compress(records: &[WALRecord]) -> Result<Vec<u8>, HunTianError> {
    let serialized = serialize(records)?;
    let mut encoder = Encoder::new(Vec::new(), DEFAULT_COMPRESS_LEVEL)?;
    encoder.write_all(&serialized)?;
    Ok(encoder.finish()?)
}

亮点:二进制序列化减少体积 5 倍 + ZSTD 高压缩率 + 批量压缩优化。

4.3 PG 协议握手核心实现(src/proto/handshake.rs

rust 复制代码
/// 自研PostgreSQL Wire Protocol 3.0 握手实现,完全兼容psql、DBeaver
use tokio::io::{AsyncRead, AsyncWrite, AsyncReadExt, AsyncWriteExt};

pub async fn handle_handshake<R, W>(mut reader: R, mut writer: W) -> Result<StartupMessage, HunTianError>
where
    R: AsyncRead + Unpin,
    W: AsyncWrite + Unpin,
{
    let startup_msg = read_startup_message(&mut reader).await?;
    if startup_msg.protocol_version != PG_PROTOCOL_VERSION {
        return Err(HunTianError::ProtocolError("unsupported version".into()));
    }
    send_backend_greeting(&mut writer).await?;
    Ok(startup_msg)
}

async fn send_backend_greeting<W>(writer: &mut W) -> Result<(), HunTianError>
where
    W: AsyncWrite + Unpin,
{
    write_backend_message(writer, &BackendMessage::AuthenticationOk).await?;
    // 发送 ParameterStatus (server_version, client_encoding, ...)
    for (key, value) in vec![("server_version", "14.0"), ("client_encoding", "UTF8")] {
        write_backend_message(writer, &BackendMessage::ParameterStatus(key.to_string(), value.to_string())).await?;
    }
    write_backend_message(writer, &BackendMessage::ReadyForQuery).await?;
    Ok(())
}

亮点:手动实现协议握手,无第三方依赖;完全兼容 PG 生态客户端。


五、生产级部署与运维实践

HunTianDB 采用"轻量部署、低运维成本"设计,支持 Docker 一键部署源码编译部署

5.1 Docker 一键部署(推荐)

bash 复制代码
# 国际 (Docker Hub)
docker pull ctkqiang/huntianandb:v0.1.3.beta

# 中国 (阿里云容器镜像)
docker pull crpi-onofuhwrkmb5z0mn.cn-hangzhou.personal.cr.aliyuncs.com/nezhawanluoanquan/huntiandb:v0.1.3.beta

# 运行
docker run -d \
  -p 5408:5408 -p 3000:3000 -p 5490:5490 \
  -v huntian_data:/app/data \
  ctkqiang/huntiandb:952d3f4e19adb464cd5da2d02edeed1d9a89781e
bash 复制代码
# 从 Docker Hub 拉取并运行
docker run -d \
  --name huntiandb \
  -p 5408:5408 \
  -p 3000:3000 \
  -p 5490:5490 \
  ctkqiang/huntianandb:latest
端口 用途
5408 PostgreSQL Wire 协议端口(psql 连接)
3000 Web 可视化面板
5490 Prometheus 监控指标端点

5.2 源码编译部署(适合二次开发)

bash 复制代码
# 安装 Rust 工具链(若未安装)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 克隆仓库
git clone https://github.com/ctkqiang/HunTianDB.git
cd HunTianDB

# 编译 release 版本
cargo build --release

# 运行
./target/release/huntiandb

5.3 连接与使用示例

通过 psql 连接(与 PostgreSQL 完全一致):

bash 复制代码
psql -h localhost -p 5408 -U admin -d huntiandb

执行 SQL:

sql 复制代码
-- 创建安全日志表
CREATE TABLE security_events (
    ts TIMESTAMP PRIMARY KEY,
    event_type TEXT,
    src_ip INET,
    dst_ip INET,
    status_code INT
);

-- 插入数据
INSERT INTO security_events VALUES (now(), 'IDS_ALERT', '192.168.1.100', '10.0.0.1', 401);

-- 聚合查询
SELECT event_type, COUNT(*) FROM security_events WHERE ts > now() - interval '1 hour' GROUP BY event_type;

5.4 可观测性与运维监控

  • Prometheus 端点http://localhost:5490/metrics,提供 11 类核心指标(写入吞吐、查询延迟、WAL 大小、内存占用、慢查询数等)。
  • 健康检查/health(存活检测)、/ready(就绪检测),支持容器化部署。
  • 慢查询日志:可配置阈值(默认 100ms),输出至标准日志。

六、适用场景与选型建议

6.1 核心适用场景

场景 说明
企业安全审计日志 IDS、防火墙、WAF、终端安全等设备日志集中存储与分析
运维监控系统 服务器指标、应用性能、告警事件等时序数据存储与实时查询
红队演练溯源 攻击链路、操作日志、权限变更记录的留存与溯源分析
IoT 安全设备 传感器日志、设备告警、状态监控等时序数据的轻量化存储

6.2 选型对比建议

  • 需要 PG 生态兼容 + 安全场景定制 → 首选 HunTianDB,零成本迁移工具链,极致性能与压缩。
  • 仅需通用时序数据存储 → 可选 QuestDB(高性能)或 InfluxDB(生态成熟)。
  • 依赖复杂事务、多表关联 → 建议 PostgreSQL,但需接受其高并发写入与压缩方面的不足。
  • 追求轻量化部署、低运维成本 → HunTianDB 最优,单镜像一键启动。

七、总结与开源展望

HunTianDB 作为一款从零自研的 Rust 工业级时序安全数据库,以 "安全场景极致优化" 为核心设计理念,通过自研无锁写入引擎、二进制 WAL 压缩、向量化查询算子三大核心技术,突破了传统数据库与通用时序库的性能瓶颈,实现了 高性能、高压缩、高兼容、高安全 的四重优势。目前项目已完成核心功能闭环,发布 v0.1.0-beta 版本,支持生产级部署,同时开源开放,欢迎开发者参与共建。

未来,HunTianDB 将持续迭代优化,重点推进三大方向:

  1. 分布式集群部署:支持海量数据分片存储。
  2. 强化安全特性:新增数据加密、审计追溯等功能,满足更高等级等保合规要求。
  3. 丰富查询能力:支持更复杂的时序分析与聚合操作,适配更多安全场景。

开源不易,若 HunTianDB 对你的工作或学习有帮助,欢迎前往 GitHub、GitCode 仓库 Star、Fork、提交 PR,一起共建国产时序安全数据库生态!

项目开源地址


#Rust #时序数据库 #网络安全 #数据库内核 #开源项目 #安全日志存储 #工业级数据库

相关推荐
_遥远的救世主_3 小时前
从一次结果集密集型查询 OOM 看 Java 服务的稳定性架构治理
java·后端
代码丰3 小时前
基于数据库字段实现可续期分布式锁:从任务抢占到心跳续约
后端
用户8356290780513 小时前
Python 操作 PowerPoint 页眉与页脚指南
后端·python
苍何3 小时前
从 0-1 跑通 AI 产品出海,没那么难
后端
掘金一周4 小时前
想换一辆电车,JYM有什么推荐 | 沸点周刊 5.21
前端·人工智能·后端
_院长大人_4 小时前
Java Excel导出:如何实现自定义表头与字段顺序的完全控制
java·开发语言·后端·excel
武子康5 小时前
Java-03 深入浅出 MyBatis 增删改查与映射配置详解
java·后端
百度Geek说5 小时前
网盘存量代码迁移实战:我们如何用三层架构管住 AI 的输出
后端