etcd 是雲原生架構中重要的基礎組件,由 CNCF 孵化託管。etcd 在微服務和 Kubernates 集羣中不只能夠做爲服務註冊與發現,還能夠做爲 key-value 存儲的中間件。數據庫
《完全搞懂 etcd 系列文章》將會從 etcd 的基本功能實踐、API 接口、實現原理、源碼分析,以及實現中的踩坑經驗等幾方面具體展開介紹 etcd。預計會有 20 篇左右的文章,筆者將會每週持續更新,歡迎關注。安全
事務是鍵值存儲中的原子 If/Then/Else 結構體。etcd 提供了原語,用於將請求按原子塊(即then/else)分組在一塊兒,這些原子塊(即分組)根據鍵值存儲的內容來保護執行(即if)。事務可用於實現併發更新的一致性,構建 CAS 以及開發級別的併發控制。markdown
事務可使得 etcd 服務端在單個請求中自動處理多個外部請求。對於鍵值存儲庫的修改,這意味着該存儲庫的修訂版僅對事務增長一次,而且該事務生成的全部事件都將具備相同的修訂版。須要注意的是,禁止在單個事務中屢次修改同一 key。架構
事務中的每一個比較都會檢查存儲中的單個 key,相似於 If 操做,檢查是否存在值,與給定值進行比較或檢查鍵的修訂或版本。兩種不一樣的比較可能適用於相同或不一樣的 key。全部比較都是原子操做。若是全部比較都爲真,則表示事務成功,而 etcd 則應用事務的 then/success 請求塊,不然,則認爲失敗並應用 else/failure 請求塊。併發
關於事務的具體概念,你們能夠自行上網搜索,本文不會再去詳述這部份內容。運維
Txn 方法在單個事務中處理多個請求。txn 請求增長鍵值存儲的修訂版本併爲每一個完成的請求生成帶有相同修訂版本的事件。etcd 不允許在一個 txn 中屢次修改同一個 key。ide
rpc Txn(TxnRequest) returns (TxnResponse) {}
複製代碼
如下這段內容來自 google paxosdb 論文 proto 文件中 TxnRequest 的註釋,解釋了 Txn 請求的工做方式:微服務
咱們的實現圍繞強大的咱們稱爲 MultiOp 的原生(primitive)。全部除了循環外的其餘數據庫操做被實現爲對 MultiOp 的單一調用。MultiOp 被原子性的應用並由三個部分組成:oop
- 被稱爲guard的測試列表。在guard中每一個測試檢查數據庫中的單個項(entry)。它可能檢查某個值的存在或者缺失,或者和給定的值比較。在guard中兩個不一樣的測試可能應用於數據庫中相同或者不一樣的項。guard中的全部測試被應用而後 MultiOp 返回結果。若是全部測試是true,MultiOp 執行 t 操做 (見下面的第二項), 不然它執行 f 操做 (見下面的第三項)。
- 被稱爲 t 操做的數據庫操做列表。列表中的每一個操做是插入,刪除,或者查找操做,並應用到單個數據庫項。列表中的兩個不一樣操做可能應用到數據庫中相同或者不一樣的項。若是 guard 評價爲true 這些操做將被執行
- 被稱爲 f 操做的數據庫操做列表。相似 t 操做, 可是是在 guard 評價爲 false 時執行。
請求的消息體 TxnRequest 定義以下:源碼分析
message TxnRequest {
// compare 是斷言列表,體現爲條件的聯合
repeated Compare compare = 1;
// 成功請求列表,當比較評估爲 true 時將被應用。
repeated RequestOp success = 2;
// 失敗請求列表,當比較評估爲 false 時將被應用。
repeated RequestOp failure = 3;
}
複製代碼
compare 若是比較成功,那麼成功請求將被按順序處理,而應答將按順序包含他們對應的應答;若是比較失敗,那麼失敗請求將被按順序處理,而應答將按順序包含他們對應的應答。應答的消息體 TxnResponse 定義以下:
message TxnResponse {
ResponseHeader header = 1;
// 若是比較評估爲true則succeeded被設置爲true,不然是false
bool succeeded = 2;
repeated ResponseOp responses = 3;
}
複製代碼
header 表明通用的響應頭。responses 爲應答列表,若是 succeeded 爲 true 則對應成功請求,若是 succeeded 是 false 則對應失敗請求。Compare 消息體:
message Compare {
enum CompareResult {
EQUAL = 0;
GREATER = 1;
LESS = 2;
NOT_EQUAL = 3;
}
enum CompareTarget {
VERSION = 0;
CREATE = 1;
MOD = 2;
VALUE= 3;
}
CompareResult result = 1;
CompareTarget target = 2;
bytes key = 3;
oneof target_union {
// version 是給定 key 的版本
int64 version = 4;
// create_revision 是給定 key 的建立修訂版本
int64 create_revision = 5;
// mod_revision 是給定 key 的最後修改修訂版本
int64 mod_revision = 6;
// value 是給定 key 的值,以 bytes 的形式
bytes value = 7;
}
}
複製代碼
result 是這個比較的邏輯比較操做。target 是比較要檢查的鍵值字段。key 是用於比較操做的主題 key。在 .proto 中定義一個oneof 關鍵字後跟着oneof 名稱,設置 oneof 字段將自動清除oneof字段的全部其餘成員。在生成的代碼中,oneof 字段具備與常規字段相同的 setter 和 getter 方法。
RequestOp 消息體定義以下:
message RequestOp {
oneof request {
RangeRequest request_range = 1;
PutRequest request_put = 2;
DeleteRangeRequest request_delete_range = 3;
}
}
複製代碼
request 是能夠被事務接受的請求類型的聯合。ResponseOp 消息體:
message ResponseOp {
oneof response {
RangeResponse response_range = 1;
PutResponse response_put = 2;
DeleteRangeResponse response_delete_range = 3;
}
}
複製代碼
response 是事務返回的應答類型的集合。
本篇主要介紹了 Etcd API 中涉及的 事務 Txn 定義,Txn 方法在單個事務中處理多個請求,從而保證了業務執行的一致性。
](blueskykong.com/2020/08/27/…)