彻底搞懂 etcd 系列文章(十):etcd 租约 Lease API
0 专辑概述
etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件。
《彻底搞懂 etcd 系列文章》将会从 etcd 的基本功能实践、API 接口、实现原理、源码分析,以及实现中的踩坑经验等几方面具体展开介绍 etcd。预计会有 20 篇左右的文章,笔者将会每周持续更新,欢迎关注。
前两天没有更新,今天这里祝大家国庆快乐!
1 etcd 租约服务
Lease service 提供租约的支持。Lease 是一种检测客户端存活状况的机制。群集授予具有生存时间的租约。如果 etcd 群集在给定的 TTL 时间内未收到 keepAlive,则租约到期。
为了将租约绑定到键值存储中,每个 key 最多可以附加一个租约。当租约到期或被撤销时,该租约所附的所有 key 都将被删除。每个过期的密钥都会在事件历史记录中生成一个删除事件。
在 rpc.proto 中 Lease service 定义的接口如下:
service Lease {
rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {}
rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {}
rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {}
rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) {}
}
- LeaseGrant 创建一个租约
- LeaseRevoke 撤销一个租约
- LeaseKeepAlive 用于维持租约
- LeaseTimeToLive 获取租约信息
下面分别介绍这几个方法。
2 LeaseGrant 方法
LeaseGrant 方法创建一个租约。当服务器在给定 time to live 时间内没有接收到 keepAlive 时租约过期。如果租约过期则所有附加在租约上的 key 将过期并被删除。每个过期的 key 在事件历史中生成一个删除事件。方法定义如下:
rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {}
请求的消息体是 LeaseGrantRequest:
message LeaseGrantRequest {
int64 TTL = 1;
int64 ID = 2;
}
TTL 建议以秒为单位的 time-to-live。ID 是租约的请求 ID,如果 ID 设置为 0,则出租人(也就是 etcd server)选择一个 ID。应答的消息体 LeaseGrantResponse 定义如下:
message LeaseGrantResponse {
ResponseHeader header = 1;
int64 ID = 2;
int64 TTL = 3;
string error = 4;
}
ID 是承认的租约的 ID。TTL 是服务器选择的以秒为单位的租约 time-to-live。
3 LeaseRevoke 方法
LeaseRevoke 撤销一个租约,此时所有附加到租约的 key 将过期并被删除。
rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {}
请求的消息体 LeaseRevokeRequest 定义如下:
message LeaseRevokeRequest {
int64 ID = 1;
}
ID 是要取消的租约的 ID。当租约被取消时,所有关联的 key 将被删除。应答的消息体 LeaseRevokeResponse 定义如下:
message LeaseRevokeResponse {
ResponseHeader header = 1;
}
LeaseRevokeResponse 中只有一个通用的响应头字段。
4 LeaseKeepAlive 方法
LeaseKeepAlive 方法维持一个租约。LeaseKeepAlive 通过从客户端到服务器端的流化的 keep alive 请求和从服务器端到客户端的流化的 keep alive 应答来维持租约。
rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {}
请求的消息体 LeaseKeepAliveRequest 定义如下:
message LeaseKeepAliveRequest {
int64 ID = 1;
}
ID 是要继续存活的租约的 ID。应答的消息体 LeaseKeepAliveResponse:
message LeaseKeepAliveResponse {
ResponseHeader header = 1;
int64 ID = 2;
int64 TTL = 3;
}
ID 是从继续存活请求中得来的租约 ID。TTL 是租约新的 time-to-live。
5 LeaseTimeToLive 方法
LeaseTimeToLive 方法获取租约的信息。
rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) {}
请求的消息体 LeaseTimeToLiveRequest 定义如下:
message LeaseTimeToLiveRequest {
// ID 是租约的 ID
int64 ID = 1;
bool keys = 2;
}
keys 设置为 true 可以查询附加到这个租约上的所有 key。应答的消息体 LeaseTimeToLiveResponse 定义如下:
message LeaseTimeToLiveResponse {
ResponseHeader header = 1;
// ID 是来自请求的 ID
int64 ID = 2;
int64 TTL = 3;
int64 grantedTTL = 4;
repeated bytes keys = 5;
}
其中,TTL 是租约剩余的 TTL,单位为秒;租约将在接下来的 TTL + 1 秒之后过期。GrantedTTL 是租约创建/续约时初始授予的时间,单位为秒。keys 是附加到这个租约的 key 的列表。
6 小结
本文主要介绍 etcd 租约 API 中涉及到的 LeaseGrant、LeaseRevoke、LeaseKeepAlive、LeaseTimeToLive 等主要方法,Lease API 是客户端实践中会经常用到,熟悉和了解这部分很有帮助。
订阅最新文章,欢迎关注我的公众号
- 彻底搞懂 etcd 系列文章(七):etcd gRPC 服务 API
- 彻底搞懂 etcd 系列文章(八):etcd 事务 API
- 彻底搞懂 etcd 系列文章(九):etcd compact 和 watch API
参考
etcd docs
- Ubuntu 16.04 安装VNC
- 使用Feign实现Form表单提交
- Ubuntu 16.04 Install OpenCV
- Spring Cloud各组件调优参数
- 手把手教你设置 IntelliJ IDEA 的彩色代码主题
- 实用技巧:Hystrix传播ThreadLocal对象(两种方案)
- OpenDaylight与Mininet应用实战之流表操作
- 使用Spring Cloud Feign上传文件
- 用 TensorFlow 让你的机器人唱首原创给你听
- Spring Cloud限流详解(附源码)
- 手动安装Docker 17.06
- 详述使用 IntelliJ IDEA 解决 jar 包冲突的问题
- Spring Cloud各组件重试总结
- js或者php浮点数运算产生多位小数的理解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- andriod如何搭建自己的轮询框架
- Android自定义带圆点的半圆形进度条
- Android使用MulticastSocket实现多点广播图片
- Android自定义view仿微信刷新旋转小风车
- sqlmap手册
- Android绘制动态折线图
- Python PIL库图片灰化处理
- django 实现简单的插入视频
- 快速解决Django关闭Debug模式无法加载media图片与static静态文件
- Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
- Django media static外部访问Django中的图片设置教程
- Python图片处理模块PIL操作方法(pillow)
- Android自定义View实现圆环带数字百分比进度条
- Python按照list dict key进行排序过程解析
- Java并发编程的艺术(一)