- 数据库
- 安全
- 后端
【免费下载链接】immudb
immudb - immutable database based on zero trust, SQL/Key-Value/Document model, tamperproof, data change history
immudb 是一款内置密码学证明与验证能力的不可变数据库,支持 Key-Value、文档模型与 SQL 三种数据模型。本文以仓库根目录的 CHANGELOG.md 为骨架,系统梳理 immudb 从 v0.6 到 v1.11.1 的核心技术演进:嵌入式 SQL 引擎的能力扩张、不可变存储层的防篡改设计、PostgreSQL 协议兼容、同步/异步复制、结构化审计日志以及安全依赖更新。读完本文,你将理解 immudb 各版本之间的功能脉络,并能根据版本号快速定位对应能力与已知问题的修复情况。
一、版本时间线与总体脉络
CHANGELOG 采用 Semantic Versioning 规范,记录了自 2020 年 v0.6.0 以来的全部重要变更。从时间线看,immudb 的技术演进大致可分为几个阶段:
| 版本区间 | 时间范围 | 主题 |
|---|---|---|
| v0.6.x – v0.9.x | 2020 – 2021 | 核心存储与 Key-Value 能力、客户端 SDK 成型 |
| v1.0.x – v1.1.0 | 2021 | 首个 1.0 稳定版、SQL 引擎初具规模、复制能力起步 |
| v1.2.x – v1.4.x | 2021 – 2022 | 事务模型成熟、预提交/同步复制、数据库加载/卸载 |
| v1.5.0 – v1.9.x | 2023 – 2025 | 文档引擎、多索引、pg_catalog 系统表、CASE/JOIN 扩展 |
| v1.10.0 – v1.11.1 | 2025 – 2026 | PG 兼容性大幅提升、审计日志、性能优化与安全加固 |
最新稳定版本为v1.11.1(2026-06-26),紧邻其后的 v1.11.0(2026-04-23)是一次大规模功能发布。CHANGELOG 开头的[Unreleased]段落则记录了尚未定版的新增内容,例如 immuadmin 对sysadmin权限的支持与 auditor 的新--audit-verify-values标志。
二、嵌入式 SQL 引擎:从基础查询到 PostgreSQL 兼容
2.1 早期 SQL 能力积累(v1.0 – v1.3)
SQL 引擎在 v1.0.0 前后进入嵌入式层(embedded/sql),并逐步沉淀出基础能力:
- 类型系统:支持 INTEGER(有符号 int64)、VARCHAR、BOOLEAN、BLOB(前缀
x)、TIMESTAMP,并实现 varchar → int/float 的隐式转换(type_conversion.go)。 - DDL/DML:CREATE/DROP TABLE、CREATE/DROP INDEX(含唯一索引与多列索引)、INSERT/UPDATE/DELETE、
IS NULL / IS NOT NULL、LIKE / NOT LIKE、IN子句。 - 主键与自增:v1.1.0 引入单列与多列主键、auto-incremental 整数主键,并通过
ExecAll返回"更新行数 + 最后插入主键"的执行摘要(对应 pkg/api/schema 中 SQL 执行结果的 proto 定义)。 - 事务支持:v1.2.0 起提供交互式
sqlTx与BEGIN语句,事务基于不可变存储层的 OngoingTx(见 sql_tx.go)。
2.2 JOIN 与子查询爆发(v1.5 – v1.9)
从 v1.5.0-RC1 到 v1.9.x,SQL 引擎进入"能力扩张期",文档引擎(embedded/document)也复用了 SQL 引擎作为底层查询执行器:
- 连接类型:LEFT JOIN、INNER JOIN、JOIN + 子查询、多列索引上的联接优化。
- 条件与表达式:简单/完整 CASE 语句、COALESCE、
EXTRACT FROM TIMESTAMP、BETWEEN AND、逻辑运算符优先级(NOT/AND/OR)修正。 - 系统表:v1.9.6 开始支持核心 pg_catalog 表(pg_class、pg_namespace、pg_roles),并在 pkg/pgsql/sys 中逐步补齐。
对应实现可参阅 parser.go 与文法定义 sql_grammar.y。
2.3 v1.11.0:SQL 能力的大规模发布
v1.11.0 是 CHANGELOG 中最浓墨重彩的一笔,其 SQL 特性清单几乎覆盖了现代关系型数据库的常见语法:
- 表间比较:
DIFF OF查询——通过SELECT _diff_action, ... FROM (DIFF OF t) SINCE TX N UNTIL TX M对比两个事务点之间的表状态,这一能力与不可变存储天然契合。 - 连接家族:FULL OUTER JOIN、LATERAL、CROSS JOIN、NATURAL JOIN、JOIN USING,对应实现见 full_outer_join_reader.go 与 joint_row_reader.go。
- 子查询与 CTE:EXISTS、IN、相关子查询、
WITH以及WITH RECURSIVE。 - 窗口函数:LEAD、LAG、FIRST_VALUE、LAST_VALUE、NTILE,配合每查询内存上限。
- 集合运算:EXCEPT、INTERSECT、UNION。
- DDL 家族:CREATE/DROP VIEW(持久化)、部分索引、TRUNCATE TABLE、
DROP TABLE IF EXISTS CASCADE、ALTER COLUMN、SAVEPOINT/RELEASE/ROLLBACK TO、外键、SEQUENCES、带持久化的 DEFAULT 列值。 - DML 增强:RETURNING、
ON CONFLICT DO UPDATE、FETCH FIRST N ROWS ONLY、LIMIT ALL、NULLS FIRST/LAST。 - 函数库扩充:COALESCE、NULLIF、GREATEST、LEAST、EXTRACT、BETWEEN AND、ILIKE、STRING_AGG、RANDOM、GEN_RANDOM_UUID、TO_NUMBER、CONCAT_WS、REGEXP_REPLACE、LPAD、RPAD、SPLIT_PART、INITCAP、CHR、ASCII、MD5、TRANSLATE、DATE_TRUNC、TO_CHAR、DATE_PART、AGE、CLOCK_TIMESTAMP(实现集中在 functions.go)。
- 执行引擎:未索引 GROUP BY 的哈希聚合、按会话 SQL 解析缓存、经 Clone 复用缓存的 Engine catalog、前缀指纹读集(prefix-fingerprint read-set)、PG 风格 CASE 分支加宽、EXPLAIN 输出用于计划检查。
2.4 PostgreSQL 协议兼容(pgsql 服务器)
与 SQL 语法同步推进的是 PG 线协议(wire protocol)兼容层 pkg/pgsql/server:
- v1.1.0 起支持简单查询与扩展查询消息(extended query)、flush 消息、多语句、TLS。
- v1.9.x 引入 COPY FROM stdin,支持 Rails ActiveRecord、XORM、Gitea、SQLAlchemy、JDBC 与 pgAdmin 驱动的端到端集成。
- v1.11.0 补齐
\d、\dt、\di等 psql 反斜杠命令,将其路由到真实 catalog 数据;同时将 pg_catalog 与 information_schema 完整实现为真实系统表(pkg/pgsql/sys 下的 31 个源文件),并移除了旧 pgschema 解析层约 1500 行代码。 - v1.11.0 还引入基于 AST 的 SQL 重写器(beta,
--pg-rewriter=ast,默认关闭)与COPY FROM stdin协议支持。
当前仓库 README 已同步重构为"PostgreSQL 兼容性矩阵"结构,相关实现细节可进一步阅读 pkg/pgsql/server 与 docs/pg-compat-roadmap.md。
三、不可变存储层:防篡改的根基
3.1 存储组件架构
immudb 的不可变性由 embedded/store(事务与提交)、embedded/tbtree(有序索引)与 embedded/ahtree(追加哈希树,生成线性加密证明)三者协作保证。CHANGELOG 中大量条目围绕这三层展开:
- v1.2.x:引入逻辑条目过期(logical entries expiration)、KV 元数据序列化、只读事务条目、时间戳类型支持。
- v1.3.x:基于时间的事务查找、范围键更新读取、快照与读集(MVCC 读集)边界校验。
- v1.4.x:预提交事务(precommitted tx)机制成型——事务先在 commit log 持久化、再异步提交,复制场景依赖该能力;同时支持事务丢弃(discard)与外部提交许可模式。
- v1.5.x:嵌入值模式(embedded values)、文件预分配、值缓存、可选的完整性检查(skipIntegrityCheck 参数)。
- v1.9.0:多索引(multi-indexing)与动态索引、值保留历史(value-preserving history)、
GetBetween历史区间读取、键读取器支持历史值。
3.2 v1.11 的存储与性能优化
v1.11.1 针对存储层做了多项修复与优化,能直观反映不可变存储的实现细节:
- 恢复路径增强:非正常关闭(如 OOMKill)后若磁盘残留预提交事务多于
MaxActiveTransactions,恢复逻辑会动态倍增 precommit buffer 而非直接返回ErrBufferIsFull,避免数据库永久不可恢复(对应 precommit_buffer.go)。 - 索引错误退避:将此前每次索引错误导致的 60 秒硬性写入冻结,替换为有界指数退避(100ms 起、每轮翻倍、上限 60s,整轮成功后复位)。
- 参数变更可见性:以不同
MaxValueLen、MaxKeyLen、MaxTxEntries、FileSize重新打开 store 时不再被静默忽略,而是发出告警并同时打印新旧值(options.go 中的校验逻辑)。
3.3 索引(tbtree)的持续打磨
tbtree(tamper-proof B-tree)贯穿多个版本的优化主题,CHANGELOG 明确记录的有:
- 快照一致性校验、checksum 校验、自愈索引、索引压缩(compaction)与数据丢弃。
- 节点分裂策略(middle node split)、批量插入、二分查找、清理百分比(cleanupPercentage)参数化。
- v1.9.7 修复:将时间戳保存到独立文件,避免空索引重扫。
这些能力对应 tbtree.go 与 snapshot.go 的实现。
四、事务、复制与数据库管理
4.1 事务模型
v1.2.0-RC1 至 v1.2.4 是事务能力的关键窗口:OngoingTx API、保守读冲突校验、MVCC 读集、可取消事务、执行摘要(updated rows / last inserted pk)相继落地。事务头版本化(tx header versioning)与元数据序列化也为后续复制与审计铺路。
4.2 复制演进
- v1.1.0:初始主动复制能力(active replication),systemdb 与 defaultdb 的 follower 复制。
- v1.4.x:同步复制(sync replication)核心支持——预提交事务导出/提交、follower 预提交状态跟踪、事务丢弃、
sync-acks语义、可配置的prefetchTxBufferSize与replicationCommitConcurrency。 - v1.9.x:基于双向流(bidirectional streaming)的流式复制,支持异步与同步两种模式;复制时跳过完整性检查与索引,由 pkg/replication 中的 pipeline.go 与 replicator.go 承载。
- v1.11.0:回退了 A4 pipelined fetch(对 poll 协议不适用),强调复制逻辑以主从状态机的一致性为先。
4.3 数据库管理能力
v1.2.x 引入数据库加载/卸载(load/unload)、database settings 查询端点、flush index 端点、删除数据库端点;v1.5.x 增加数据库截断(truncation,vlog 截断 + 保留期)与文档目录复制。v1.9.x 起pkg/server支持从 SQL 语句创建/选择数据库,并通过 multidb handler 统一管理多数据库用户与权限。
五、审计、安全与可观测性
5.1 结构化审计日志
v1.11.0 引入了带不可变审计轨迹的结构化审计 logger(reload 路径、异步 flush、崩溃后持久化),相关代码在 pkg/audit(event.go、logger.go、query.go)。v1.11.1 进一步为 auditor 新增--audit-verify-values开关:在链式证明校验之后,重新读取每个已提交值并做 SHA-256 校验,磁盘上的任何篡改都会让审计周期失败——这是"零信任"理念的落地体现(默认保持仅链式校验行为不变)。
5.2 认证与权限
- v1.9.1:用户创建/修改时权限自动撤销既有权限;list users 从 multidb handler 统一提供。
- v1.11.1:immuadmin 的
user create与user permission命令接受sysadmin权限,运维人员无需依赖默认 immudb 账号即可从命令行引导额外的 sysadmin 账号(对应 cmd/immuadmin)。 - v1.4.1:支持通过
--force-admin-password重置 sysadmin 密码,并在未重置时输出警告。
5.3 依赖安全更新(v1.11.1)
v1.11.1 集中升级了一批关键依赖以消除已知 CVE:
| 依赖 | 版本变化 | 修复内容 |
|---|---|---|
| golang.org/x/crypto | v0.48.0 → v0.52.0 | 8 个 HIGH + 5 个 MEDIUM CVE |
| golang.org/x/net | v0.50.0 → v0.55.0 | 7 个 HIGH + 1 个 MEDIUM CVE |
| golang.org/x/sys | v0.41.0 → v0.45.0 | CVE-2026-39824 |
| github.com/jackc/pgx/v5 | v5.9.1 → v5.9.2 | CVE-2026-41889 |
| github.com/sirupsen/logrus | v1.8.1 → v1.9.3 | Entry.Writer()DoS |
| urllib3(test/e2e) | → v2.7.0 | CVE-2026-44432 |
5.4 可观测性
- 指标:v1.3.x 引入 indexer 指标、S3 相关指标、btree 缓存/压缩 Prometheus 指标;v1.9.x 增加复制延迟指标;tools/monitoring/grafana-dashboard.json 提供开箱即用的 Grafana 面板。
- 健康检查:v1.0.5 起 immudb 与 auditor 暴露
/healthz、/version端点,auditor 统一提供/metrics、/initz、/readyz、/livez。 - 服务器选项:v1.3.2 增加 pprof 选项与 MaxSessions 限制(pkg/server/sessions)。
六、部署形态:Docker 与 Helm
CHANGELOG 记录了部署侧的持续投入:
- v1.9.3:支持 ARM64 镜像构建。
- v1.10.0:Helm Chart 全面配置支持(helm/values.yaml、helm/templates)。
- v1.11.1:官方镜像通过
docker buildx同时构建linux/amd64与linux/arm64,Go 在构建平台上原生交叉编译、不再依赖 QEMU;同时修复 almalinux-8-minimal 镜像因 UID/GID 不一致(目录属主 65532、运行时用户immu为 3322)导致的permission denied问题,现在IMMU_UID/IMMU_GID统一为 3322。 - v1.1.0:提供 scratch 与 debian 两种基础镜像,v1.9.1 起加入内嵌 swagger UI 的镜像(用于 AWS Marketplace)。
七、嵌入式使用与向后兼容
immudb 不仅以独立服务形态运行,也可作为 Go 库全进程嵌入(见 docs/EMBEDDING.md 与 examples/embedded/main.go)。CHANGELOG 中多次强调向后兼容:
- v1.2.0 修复 protobuf 与 1.1 版本的兼容性;v1.9.x 增加 proof version 概念,允许通过 immuadmin 调整 proof 兼容性。
- 复制与预提交机制支持旧版本 follower 的向后兼容模式(backward compatible replication)。
- 仓库 test/data_v1.1.0 保留了 v1.1.0 的旧数据文件,用于回归测试验证新版本能读取旧数据。
八、从版本历史中提炼的升级建议
结合 CHANGELOG 的 Bug Fixes 段落,升级时值得重点关注以下修复点(均在后续版本已解决):
- v1.11.0 引入的两个崩溃缺陷(v1.11.1 修复):大结果集
ORDER BY … OFFSET落盘排序时的空指针解引用;空/纯注释 SQL 输入导致的索引越界(现在返回ErrExpectingDQLStmt)。 - SQL 参数绑定问题:
SELECT WHERE col = $1对缓存预编译语句重复执行时复用首个绑定值的问题;带时区后缀(Z、±HH:MM)的 TIMESTAMP 参数绑定被拒绝的问题(两者均在 v1.11.1 修复)。 COUNT(col)语义:v1.11.1 起COUNT(col)与COUNT(DISTINCT col)均正确跳过 NULL,不再对非空表返回 0。- 升级依赖安全风险:若使用旧版本,建议至少升级到 v1.11.1 以覆盖 x/crypto、x/net、pgx、logrus 等依赖的已知 CVE。
结语
通过 CHANGELOG 可以清晰看到 immudb 的三条技术主线:以 ahtree/tbtree/store 为核心的不可变防篡改存储、以嵌入式 SQL 引擎为基座并逐步逼近 PostgreSQL 兼容的查询层、以及贯穿始终的"客户端验证、不信任数据库"的零信任安全模型。对于希望深入源码的读者,可以从 embedded/store/immustore.go、embedded/sql/engine.go 与 pkg/server/server.go 三个入口开始,结合本文梳理的版本脉络逐层阅读。
- 数据库
- 安全
- 后端
【免费下载链接】immudb
immudb - immutable database based on zero trust, SQL/Key-Value/Document model, tamperproof, data change history
相关推荐
Realm Swift 版本演进全解析:从 CHANGELOG 看移动数据库十年技术路线图
Realm Swift 版本演进全解析:从 CHANGELOG 看移动数据库十年技术路线图 Realm Swift 是面向 iOS/macOS 的移动数据库框架
数据库移动开发嵌入式数据库vim-go 版本演进全解析:从 CHANGELOG 看 Go 插件十年技术路线图
vim go 版本演进全解析:从 CHANGELOG 看 Go 插件十年技术路线图 vim go 是 Vim/Neovim 生态中最成熟的 Go 语言开发插件之
开发工具bootstrap-table 版本演进全解读:从 CHANGELOG 看 1.0 到 1.27 的架构变迁与技术路线
bootstrap table 版本演进全解读:从 CHANGELOG 看 1.0 到 1.27 的架构变迁与技术路线 导读 :bootstrap table
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考