找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1287

积分

0

好友

167

主题
发表于 13 小时前 | 查看: 2| 回复: 0

在介绍 Etcd 数据库的增删改查操作之前,我们有必要先了解其两个核心 API 版本:V2 和 V3。它们是设计理念与底层实现都显著不同的两代接口,目前主流的生产环境使用的是 V3 版本。

版本演进与核心差异

etcd 从 3.4 版本 开始,将命令行工具 etcdctl 的默认 API 版本正式从 v2 改为了 v3。如果你使用的是 etcd 3.0 到 3.3 版本,则需要手动指定 ETCDCTL_API=3 才能使用 v3 API,否则默认仍会使用 v2。

一个关键的理解是:v2 和 v3 可以看作是两个独立的数据存储库。使用 v2 API 写入的数据和使用 v3 API 写入的数据在底层是相互隔离的,两个存储区之间没有 自动同步关联查询 的机制。这意味着,如果你需要让一份数据同时在基于 v2 和 v3 的旧新应用中都可用,就必须分别用两个版本的客户端各写入一次,或者借助官方迁移工具进行一次性的数据拷贝。

下图清晰地展示了 etcd 服务器内部如何处理不同版本的 API 请求:

Etcd v2 与 v3 API 交互架构图

数据结构:树形目录

ZooKeeper 类似,Etcd 也采用了树形目录结构来组织数据。所有的键(Key)都像文件系统中的路径,例如 /project/database/host。这种结构非常直观,便于按“目录”进行归类和管理。在 Kubernetes 中,这种结构被用来存储集群内所有资源对象的定义。

下图以 Kubernetes 的资源存储为例,展示了这种树形路径的典型形态:

Kubernetes 资源在 Etcd 中的存储路径示意图

理解了这个基础模型后,我们就可以开始进行具体的 CRUD 操作了。本文所有操作均基于 v3 API

开始前的关键设置

在进行任何操作之前,必须确保你的环境使用的是 v3 API。否则,命令会默认使用 v2 API,导致操作失败或写入错误的数据存储区。

export ETCDCTL_API=3
# 或者在每次执行 etcdctl 命令时显式指定
ETCDCTL_API=3 etcdctl get /some/key

增 / 改 (Put)

put 命令是幂等的,即无论执行多少次,只要键和值相同,最终结果都一样。如果指定的键不存在,则创建它;如果已存在,则用新值覆盖旧值。

# 基本写入:将值 “192.168.1.100” 写入键 `/project/database/host`
etcdctl put /project/database/host “192.168.1.100”

# 带租约写入:键将在租约过期后自动删除
LEASE_ID=$(etcdctl lease grant 60)  # 创建一个有效期为60秒的租约,并获取其ID
etcdctl put /tmp/session_token “abc123” --lease=$LEASE_ID

查 (Get)

get 命令的查询方式非常灵活,可以根据不同需求获取数据。

# 1. 精确获取:获取指定键的值
etcdctl get /project/database/host

# 2. 范围获取:获取键在字节序区间 [/project/database/a, /project/database/z) 内的所有键值对
etcdctl get /project/database/a /project/database/z

# 3. 前缀获取(最常用):模拟列出目录下的所有内容
etcdctl get /project/database/ --prefix
# 输出示例:
# /project/database/host
# 192.168.1.100
# /project/database/port
# “3306”

# 4. 获取历史版本:需要启用 MVCC 功能,查看指定修订版本时的数据
etcdctl get /project/database/host --rev=5  # 获取该键在全局修订版本5时的值

# 5. 只获取键名或仅统计数量
etcdctl get /project/database/ --prefix --keys-only
etcdctl get /project/database/ --prefix --count-only

删 (Del)

删除操作同样支持精确删除和基于前缀的范围删除。

# 1. 精确删除:删除指定的键
etcdctl del /project/database/host

# 2. 前缀删除:模拟删除整个目录及其下所有子键
etcdctl del /project/database/ --prefix

# 3. 删除并返回被删除的键值对数据
etcdctl del /project/database/ --prefix --prev-kv

总结

掌握 Etcd 的 v3 API 基本命令是管理和运维现代分布式系统,特别是 Kubernetes 集群的必备技能。从简单的 putget,到利用 --prefix 进行目录式操作,再到结合租约(Lease)实现临时节点,这些操作构成了使用 Etcd 的基石。在实际生产环境中,理解其树形数据模型并结合具体的业务场景(如服务发现、配置存储、分布式锁)来设计键的命名空间,将更能发挥出这个强大键值存储系统的威力。如果想了解更多关于分布式存储或系统架构的深入讨论,欢迎来 云栈社区 交流。




上一篇:PostgreSQL Full Page Write vs MySQL Doublewrite Buffer:性能差3倍,AI改内核代码实践
下一篇:深入解析蓝绿发布、灰度发布、滚动发布的原理、对比与选型指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-10 18:27 , Processed in 0.397841 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表