首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 什么是ZooKeeper?
02 | ZooKeeper提供什么服务?
03 | 开始使用ZooKeeper
04 | 使用ZooKeeper实现Master-Worker协同
05 | ZooKeeper架构解析
06 | ZooKeeper API简介
07 | ZooKeeper API:Watch示例
08 | 使用ZooKeeper实现分布式队列
09 | 使用ZooKeeper实现分布式锁
10 | 使用ZooKeeper实现选举
11 | 使用Apache Curator简化ZooKeeper开发
12 | 如何安装配置一个ZooKeeper生产环境?
13 | 如何进行ZooKeeper的监控?
14 | 通过ZooKeeper Observer实现跨区域部署
15 | 通过动态配置实现不中断服务的集群成员变更
16 | ZooKeeper节点是如何存储数据的?
17 | 使用ZooKeeper实现服务发现(1)
18 | 使用ZooKeeper实现服务发现(2)
19 | 使用ZooKeeper实现服务发现(3)
20 | Kafka是如何使用ZooKeeper的?
21 | 什么是Paxos协议?
22 | 对比Chubby和ZooKeeper
23 | Raft协议解析
24 | 什么是etcd?
25 | etcd API: KV部分
26 | etcd API:Watch和Lease部分
27 | 使用etcd实现分布式队列
28 | 使用etcd实现分布式锁
29 | 如何搭建一个etcd生产环境?
30 | 存储数据结构之B+tree
31 | 存储数据结构之LSM
32 | 本地存储技术总结
33 | ZooKeeper本地存储源码解析
34 | 网络编程基础
35 | 事件驱动的网络编程
36 | Java的事件驱动网络编程
37 | ZooKeeper的客户端网络通信源码解读
38 | ZooKeeper的服务器网络通信源码解读
39 | ZooKeeper的Request Processor源码解读
40 | Standalone的ZooKeeper是如何处理客户端请求的?
41 | Quorum模式下ZooKeeper节点的Request Processor Pipeline
42 | ZooKeeper的Leader Election
43 | ZooKeeper的Zab协议
44 | 客户端和服务器端交互:Watch和Session
当前位置:
首页>>
技术小册>>
ZooKeeper实战与源码剖析
小册名称:ZooKeeper实战与源码剖析
### 25 | etcd API:KV部分 在分布式系统中,键值存储(Key-Value Store)作为最基础的数据存储模型之一,因其简单高效而广受欢迎。etcd,作为一个高度一致的分布式键值存储系统,由CoreOS团队开发,自诞生以来便因其卓越的性能、可靠性和易于使用的API而成为微服务架构、云原生应用及Kubernetes等项目中不可或缺的一部分。本章将深入探讨etcd的KV(Key-Value)API,解析其设计原理、使用方法以及高级特性。 #### 25.1 etcd KV API概述 etcd的KV API提供了基本的键值对操作能力,包括但不限于增删改查(CRUD)操作。这些API通过HTTP/JSON或gRPC协议暴露,允许客户端以编程方式与etcd集群交互。etcd的KV存储模型是简单直接的:每个键(Key)唯一对应一个值(Value),值可以是任意字节序列。etcd还通过版本控制(Revision)和租赁(Lease)机制提供了数据的版本管理和自动过期能力。 #### 25.2 KV API基本操作 ##### 25.2.1 PUT操作 PUT请求用于创建或更新键值对。如果指定的键已存在,则更新其值;如果键不存在,则创建新的键值对。PUT操作通常还伴随着一个可选的TTL(Time-To-Live)参数,用于设置键值对的存活时间。 ```bash # 使用HTTP/JSON API curl -L http://127.0.0.1:2379/v3/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy"}' # 使用gRPC API(伪代码) client.Put(context.Background(), &pb.PutRequest{ Key: []byte("foo"), Value: []byte("bar"), }) ``` 在上述示例中,`Zm9v`是`foo`的Base64编码,`YmFy`是`bar`的Base64编码,etcd API默认对键和值进行Base64编码。 ##### 25.2.2 GET操作 GET请求用于检索一个或多个键值对。可以指定单个键,也可以指定键的范围(通过前缀匹配)来批量检索。 ```bash # 检索单个键 curl -L http://127.0.0.1:2379/v3/kv/get -X POST -d '{"key": "Zm9v"}' # 检索键的范围(以foo为前缀) curl -L http://127.0.0.1:2379/v3/kv/range -X POST -d '{"key": "Zm9v", "range_end": "Zm9vZm92ZXI="}' # 使用gRPC API(伪代码) resp, err := client.Range(context.Background(), &pb.RangeRequest{ Key: []byte("foo"), RangeEnd: []byte("foofover"), }) ``` 注意,`range_end`是开区间,即不包括该键本身。 ##### 25.2.3 DELETE操作 DELETE请求用于删除一个或多个键值对。可以指定单个键进行删除,也可以通过键的范围来批量删除。 ```bash # 删除单个键 curl -L http://127.0.0.1:2379/v3/kv/delete -X POST -d '{"key": "Zm9v"}' # 删除键的范围 curl -L http://127.0.0.1:2379/v3/kv/delete -X POST -d '{"key": "Zm9v", "range_end": "Zm9vZm92ZXI="}' # 使用gRPC API(伪代码) _, err := client.DeleteRange(context.Background(), &pb.DeleteRangeRequest{ Key: []byte("foo"), RangeEnd: []byte("foofover"), }) ``` ##### 25.2.4 租赁(Lease) etcd通过租赁机制提供了键值对的自动过期功能。首先,客户端需要创建一个租赁,然后可以将键值对与这个租赁关联起来。当租赁过期时,所有与该租赁关联的键值对都会被自动删除。 ```bash # 创建一个租赁,TTL为30秒 curl -L http://127.0.0.1:2379/v3/lease/grant -X POST -d '{"TTL": 30}' # 将键值对与租赁关联 curl -L http://127.0.0.1:2379/v3/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy", "lease": 租赁ID}' # 使用gRPC API(伪代码) leaseID, err := client.Grant(context.Background(), &pb.LeaseGrantRequest{TTL: 30}) client.Put(context.Background(), &pb.PutRequest{ Key: []byte("foo"), Value: []byte("bar"), Lease: leaseID.ID, }) ``` #### 25.3 KV API的高级特性 ##### 25.3.1 乐观锁(Compare-And-Swap, CAS) etcd支持通过`Txn`(事务)API实现乐观锁机制,允许客户端在特定条件下执行PUT或DELETE操作。这通过比较键值对的当前值与预期值是否一致来实现。 ```bash # 伪代码,演示使用gRPC API进行CAS操作 resp, err := client.Txn(context.Background()). If(compare.Compare(compare.Value(key), "=", "expectedValue")). Then(clientv3.OpPut(key, "newValue")). Commit() ``` ##### 25.3.2 监听与Watch etcd的Watch API允许客户端订阅键值对的变化,并在变化发生时获得通知。这对于实现缓存同步、事件驱动的应用等场景非常有用。 ```bash # 监听单个键的变化 curl -N http://127.0.0.1:2379/v3/watch -H "Content-Type: application/json" -d '{"key": "Zm9v"}' # 使用gRPC API(伪代码) watchChan := client.Watch(context.Background(), &pb.WatchRequest{ Key: []byte("foo"), }) for watchResp := range watchChan { for _, event := range watchResp.Events { // 处理事件 } } ``` ##### 25.3.3 事务(Transactions) etcd的Txn API提供了一种在单个操作中执行多个条件判断和读写操作的能力,这些操作要么全部成功,要么全部失败,从而保证了数据的一致性。 ```bash # 伪代码,演示使用gRPC API进行事务操作 resp, err := client.Txn(context.Background()). If(compare.Compare(compare.Version(key), ">", version)). Then(clientv3.OpPut(key, "newValue")). Else(clientv3.OpGet(key)). Commit() ``` #### 25.4 性能与优化 使用etcd KV API时,性能优化是一个重要考虑因素。以下是一些提升性能的建议: - **批量操作**:尽量使用批量操作(如Range、DeleteRange)来减少网络往返次数。 - **合理使用Watch**:避免创建过多的Watch连接,因为它们会消耗etcd集群的资源。 - **租赁管理**:合理规划租赁的TTL,避免过短的TTL导致频繁续租,也避免过长的TTL导致资源无法及时释放。 - **并发控制**:在并发访问高的情况下,利用乐观锁或悲观锁机制来控制对数据的访问。 #### 25.5 总结 etcd的KV API作为其核心功能之一,提供了强大而灵活的键值存储能力。通过PUT、GET、DELETE等基本操作,以及租赁、监听、事务等高级特性,etcd能够满足各种分布式系统对数据存储和同步的需求。了解并熟练掌握etcd KV API的使用,对于开发高效、可靠的分布式应用至关重要。希望本章内容能帮助读者深入理解etcd KV API的工作原理和使用方法,进而在项目中灵活应用。
上一篇:
24 | 什么是etcd?
下一篇:
26 | etcd API:Watch和Lease部分
该分类下的相关小册推荐:
企业级监控系统Zabbix
从零开始学微服务
云计算那些事儿:从IaaS到PaaS进阶(一)
Web服务器Apache详解
Web大并发集群部署
Linux云计算网站集群之nginx核心
Redis数据库高级实战
Linux性能优化实战
高并发系统设计核心
Linux云计算网站集群架构之存储篇
Docker容器实战部署
DevOps开发运维实战