本文档介绍了etcd的存储架构,重点关注其如何使用多版本并发控制(MVCC)和嵌入式bbolt数据库来存储和管理数据。它涵盖了存储引擎的设计原则、组织结构、数据结构以及快照和压缩等操作。
有关Raft共识实现的信息,请参阅Raft共识。
etcd存储引擎的设计遵循以下关键原则:
来源
在最低层面,etcd使用bbolt(原名BoltDB)作为其持久化存储引擎。bbolt是一个嵌入式的、单文件的B+树数据库,提供符合ACID特性的事务。
后端包装了bbolt数据库,并提供了附加功能,例如:
bbolt将数据组织到存储桶(bucket)中,这类似于传统数据库中的表。etcd使用几个预定义的存储桶来存储不同类型的数据:
| 存储桶名称 | 目的 |
|---|---|
key | 存储实际的键值数据 |
meta | 存储元数据,包括一致性索引 |
lease | 存储租约相关信息 |
members | 存储集群成员信息 |
members_removed | 跟踪已移除的集群成员 |
cluster | 存储集群范围的信息 |
alarm | 存储告警信息 |
认证 | 存储认证数据 |
来源
MVCC层位于后端存储之上,并为键提供版本控制。这使得etcd能够提供一致的读取而不会阻塞写入,并支持时间穿越查询(读取之前版本的数据)。
MVCC的核心是一个单调递增的版本号,作为数据库的逻辑时间戳。
MVCC存储中的键被编码以维护版本控制。
对于每个键,etcd会存储:
来源
etcd中的读取操作通过MVCC层进行,该层确保了数据一致性。
写入操作更为复杂,因为它们必须经过Raft共识过程。
来源
etcd中的快照提供数据库状态的时间点备份。
压缩是删除历史数据以回收空间的过程。
--auto-compaction-retention标志配置的。虽然压缩会将空间标记为空闲,但它不会在文件系统层面回收该空间。碎片整理会重新组织数据库以回收这些空间。
来源
一致性索引是一个单调递增的数字,用于跟踪最后一个已应用的Raft索引。它有助于确保:
etcd包含一个损坏检查器,用于验证数据完整性。
来源
MVCC设计意味着数据大小会随着时间增长,除非配置了压缩。请考虑:
影响存储性能的关键配置参数:
| 参数 | 描述 | 默认 |
|---|---|---|
--quota-backend-bytes | 触发告警前的最大后端大小。 | 0 (无限制) |
--auto-compaction-retention | 自动压缩保留期。 | 0 (禁用) |
--snapshot-count | 触发快照的已提交事务数量。 | 10,000(截至v3.5.0+) |
--experimental-compaction-batch-limit | 压缩期间要处理的最大修订版本数。 | 1000 |
--experimental-compaction-sleep-interval | 压缩批次之间的睡眠间隔。 | 100毫秒 |
后端批处理设置对写入性能有显著影响。
来源
在服务器启动期间,存储引擎按以下顺序初始化:
来源
存储引擎与Raft共识算法紧密协作。
来源