跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

开发任务

使用 etcd 作为键值存储的应用开发步骤指南

1 - 从 etcd 中读取

在集群中读取值

先决条件

  • 安装 etcdctl

步骤

使用 get 子命令从 etcd 读取:

$ etcdctl --endpoints=$ENDPOINTS get foo
foo
Hello World!
$

其中:

  • foo 为请求的键
  • Hello World! 为获取的值

或者,以格式化输出形式:

$ etcdctl --endpoints=$ENDPOINTS --write-out="json" get foo
{"header":{"cluster_id":289318470931837780,"member_id":14947050114012957595,"revision":3,"raft_term":4,
"kvs":[{"key":"Zm9v","create_revision":2,"mod_revision":3,"version":2,"value":"SGVsbG8gV29ybGQh"}]}}
$

其中 write-out="json" 会导致值以 JSON 格式输出(注意:键不会被返回)。

2 - 向 etcd 写入

向 etcd 集群添加一个键值对

先决条件

  • 安装 etcdctl

步骤

使用 put 子命令写入键值对:

etcdctl --endpoints=$ENDPOINTS put foo "Hello World!"

其中:

  • foo 为键名称
  • "Hello World!" 为用引号括起的值

3 - 如何根据前缀获取键

按前缀获取 etcd 键的指南

先决条件

按前缀获取键

$ etcdctl --endpoints=$ENDPOINTS get PREFIX --prefix

全局选项

--endpoints=[127.0.0.1:2379], gRPC endpoints

选项

--prefix, get a range of keys with matching prefix

示例

03_etcdctl_get_by_prefix_2016050501
etcdctl --endpoints=$ENDPOINTS put web1 value1
etcdctl --endpoints=$ENDPOINTS put web2 value2
etcdctl --endpoints=$ENDPOINTS put web3 value3

etcdctl --endpoints=$ENDPOINTS get web --prefix

4 - 如何删除键

删除 etcd 键的指南

先决条件

添加或删除键

del 用于删除指定的键或键范围:

etcdctl del $KEY [$END_KEY]

选项

--prefix[=false]: delete keys with matching prefix
--prev-kv[=false]: return deleted key-value pairs
--from-key[=false]: delete keys that are greater than or equal to the given key using byte compare
--range[=false]: delete range of keys without delay

继承自父命令的选项

--endpoints="127.0.0.1:2379": gRPC endpoints

示例

04_etcdctl_delete_2016050601
etcdctl --endpoints=$ENDPOINTS put key myvalue
etcdctl --endpoints=$ENDPOINTS del key

etcdctl --endpoints=$ENDPOINTS put k1 value1
etcdctl --endpoints=$ENDPOINTS put k2 value2
etcdctl --endpoints=$ENDPOINTS del k --prefix

5 - 如何在事务中进行多次写操作

事务性写操作指南

先决条件

术语

以下是本文中使用的部分关键术语的定义,这些术语将在 Example 示例中出现。

术语定义
etcdctl用于与 etcd 服务器交互的命令行工具。
txn 命令txn 命令是“事务”的缩写。它从标准输入读取多个 etcd 请求,并将其作为单个原子事务执行。事务包含一组条件、一组在所有条件均为真时执行的请求,以及一组在任一条件为假时执行的请求。有关更多信息,请参阅 etcdctl 键值命令 。
compare事务(txn)中的 compare 子句用作条件检查,用于判断事务操作是否应继续执行。它确保仅当键值存储的当前状态符合预期条件时才应用变更,从而维护数据一致性,并在并发环境中防止冲突。要了解该命令的结构,请参阅下方 执行事务 章节。

事务

txn 以事务方式处理所有请求:

etcdctl txn --help

事务允许在 etcd 中原子性地执行多个操作,确保所有操作均被应用或全部不被应用。这在执行相关更新时对于维护数据一致性至关重要。有关事务的更多信息,请参见 API 文档 。

示例

考虑一种场景:需要在单个事务中更新用户的电子邮件和电话号码。这可确保两项更新同时生效。

05_etcdctl_transaction_2024101213

0. 使用的变量和标志

变量
/users/{<user_id>/email : 表示用户电子邮件地址的 etcd 键。
/users/<user_id>/phone : 表示用户电话号码的 etcd 键。
标志
--interactive : 用于允许手动输入事务数据的标志。

1. 初始化数据设置

首先,创建一个带有初始数据的用户。

etcdctl put /users/12345/email "old.address@johndoe.com"
etcdctl put /users/12345/phone "123-456-7890"

2. 执行事务

在单个事务中更新用户的电子邮件和电话号码。

etcdctl txn --interactive

compares:
value("/users/12345/email") = "old.address@johndoe.com"

success requests (get, put, delete):
put /users/12345/email "new.address@johndoe.com"
put /users/12345/phone "098-765-4321"

failure requests (get, put, delete):
get /users/12345/email
  • Compare:检查当前邮箱是否为 “old.address@johndoe.com "。这确保事务仅在数据符合预期时才继续执行。
  • Success:如果比较结果为真,更新邮箱和电话号码。
  • Failure:如果比较失败,获取当前邮箱以了解事务未执行的原因。

重要考虑事项

  • 原子性:事务确保电子邮件和电话号码同时更新。如果初始条件(比较)不满足,则不会应用任何更新。
  • 一致性:使用事务可维持数据一致性,尤其是在处理多个相关更新时。
  • 避免在单个事务中对同一键多次写入:在单个事务中不要对同一键写入多个值,这可能导致意外结果。每个键在事务中应仅更新一次。

6 - 如何监听键值变化

etcd 键监听指南

先决条件

监听键

watch 以接收后续变更的通知:

etcdctl watch $KEY [$END_KEY]

选项

-i, --interactive[=false]: interactive mode
--prefix[=false]: watch on a prefix if prefix is set
--rev=0: Revision to start watching
--prev-kv[=false]: get the previous key-value pair before the event happens
--progress-notify[=false]: get periodic watch progress notification from server

继承自父命令的选项

--endpoints="127.0.0.1:2379": gRPC endpoints

示例

06_etcdctl_watch_2016050501
etcdctl --endpoints=$ENDPOINTS watch stock1
etcdctl --endpoints=$ENDPOINTS put stock1 1000

etcdctl --endpoints=$ENDPOINTS watch stock --prefix
etcdctl --endpoints=$ENDPOINTS put stock1 10
etcdctl --endpoints=$ENDPOINTS put stock2 20

7 - 如何创建租约

etcd 租约创建指南

lease 以 TTL 写入:

07_etcdctl_lease_2016050501
etcdctl --endpoints=$ENDPOINTS lease grant 300
# lease 2be7547fbc6a5afa granted with TTL(300s)

etcdctl --endpoints=$ENDPOINTS put sample value --lease=2be7547fbc6a5afa
etcdctl --endpoints=$ENDPOINTS get sample

etcdctl --endpoints=$ENDPOINTS lease keep-alive 2be7547fbc6a5afa
etcdctl --endpoints=$ENDPOINTS lease revoke 2be7547fbc6a5afa
# or after 300 seconds
etcdctl --endpoints=$ENDPOINTS get sample

8 - 如何创建锁

etcd 分布式锁创建指南

LOCK 使用指定名称获取一个分布式互斥锁。锁获取成功后,将一直持有,直至 etcdctl 终止。

先决条件

创建锁

lock 用于分布式锁:

08_etcdctl_lock_2016050501
etcdctl --endpoints=$ENDPOINTS lock mutex1

选项

  • endpoints - 定义集群中机器地址的逗号分隔列表。
  • ttl - 锁会话的超时时间,单位为秒。