etcd 是雲原生架構中重要的基礎組件,由 CNCF 孵化託管。etcd 在微服務和 Kubernates 集羣中不只能夠做爲服務註冊與發現,還能夠做爲 key-value 存儲的中間件。安全
《完全搞懂 etcd 系列文章》將會從 etcd 的基本功能實踐、API 接口、實現原理、源碼分析,以及實現中的踩坑經驗等幾方面具體展開介紹 etcd。預計會有 20 篇左右的文章,筆者將會每週持續更新,歡迎關注。服務器
Lease service 提供租約的支持。Lease 是一種檢測客戶端存活情況的機制。羣集授予具備生存時間的租約。若是 etcd 羣集在給定的 TTL 時間內未收到 keepAlive,則租約到期。markdown
爲了將租約綁定到鍵值存儲中,每一個 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) {}
}
複製代碼
下面分別介紹這幾個方法。ide
LeaseGrant 方法建立一個租約。當服務器在給定 time to live 時間內沒有接收到 keepAlive 時租約過時。若是租約過時則全部附加在租約上的 key 將過時並被刪除。每一個過時的 key 在事件歷史中生成一個刪除事件。方法定義以下:微服務
rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {}
複製代碼
請求的消息體是 LeaseGrantRequest:oop
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。ui
LeaseRevoke 撤銷一個租約,此時全部附加到租約的 key 將過時並被刪除。
rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {}
複製代碼
請求的消息體 LeaseRevokeRequest 定義以下:
message LeaseRevokeRequest {
int64 ID = 1;
}
複製代碼
ID 是要取消的租約的 ID。當租約被取消時,全部關聯的 key 將被刪除。應答的消息體 LeaseRevokeResponse 定義以下:
message LeaseRevokeResponse {
ResponseHeader header = 1;
}
複製代碼
LeaseRevokeResponse 中只有一個通用的響應頭字段。
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。
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 的列表。
本文主要介紹 etcd 租約 API 中涉及到的 LeaseGrant、LeaseRevoke、LeaseKeepAlive、LeaseTimeToLive 等主要方法,Lease API 是客戶端實踐中會常常用到,熟悉和了解這部分頗有幫助。
](blueskykong.com/2020/08/27/…) 9. 完全搞懂 etcd 系列文章(八):etcd 事務 API 10. 完全搞懂 etcd 系列文章(九):etcd compact 和 watch API