1 客戶端通信方式
etcdv3的客戶端使用gRPC與server進行通信,通信的消息協議使用protobuf進行約定,代替了v2版本的HTTP-json格式,使用二進制替代文
本,更加節省空間。同時gRPC使用的是HTTP/2協議,同一個連接可以同時處理多個請求,不必像HTTP1.1協議中,多個請求需要建立多個連接
。同時,HTTP/2會對請求的Header和請求數據進行壓縮編碼,常見的有Header幀,用於傳輸Header內容,另外就是Data幀,來傳輸正文實體
。客戶端可以將多個請求放到不同的流中,然后將這些流拆分成幀的形式進行二進制傳輸,傳輸的幀也會有一個編號,因此在一個連接中客
戶端可以發送多個請求,減少了連接數,降低了對服務器的壓力,二進制的數據傳輸格式也會是傳輸速度更快。
2 KV存儲方式
etcd存儲的數據是一個K-V格式的存儲,etcdv2的key是一個遞歸的文件目錄結構,在v3版本中的鍵改成了扁平化的數據結構,更加簡潔,v3
中支持前綴查詢,在etcdctl get key時可以加上前綴查詢選項--prefix,從而達到v2的目錄結構查詢效果。在etcdv2中的數據是一個純內存
的實現,在etcdv3中的key放在內存中,利用btree進行索引,而將真正的value存放在磁盤中。
3 watch機制
etcdv2中的鍵被廢除以后,為了能夠跟蹤key的變化,使用了事件機制進行跟蹤,維護鍵的狀態,來防止被刪除掉的后鍵還能恢復和watch到
,但是有一個滑動窗口的大小限制,那么如果要獲取1000個時間之前的鍵就獲取不到了。因此etcdv2中通過watch來同步數據不是那么可靠,
斷開連接一段時間后就會導致有可能中間的鍵的改動獲取不到了。在etcdv3中支持get和watch鍵的任意的歷史版本記錄。另外,v2中的watch
本質上還是建立很多HTTP連接,每一個watch建立一個tcp套接字連接,當watch的客戶端過多的時候會大大消耗服務器的資源,v3版本中的
watch可以進行連接復用,多個客戶端可以共用相同的TCP連接。
4 鍵的過期機制
etcdv2中的鍵的實效是使用TTL機制來實現的,每個有存活時間的鍵,客戶端必須定期的進行刷新重新設置保證它不被自動刪除,每次刷新同
時還會重新建立連接去更新鍵。在etcdv3版本中采用了租約機制進行實現,每個租約會有一個TTL,然后將一些key附加到租約上,當租約到
期后,附加到它上邊的key都會被刪除。利用鍵的過期機制可以實現服務注冊功能,我們可以將一個服務的域名、IP等信息注冊到etcd中,並
給相應的鍵設置租約,並在TTL時間內定期維持一個心跳進行刷新。當服務故障后,心跳消失從而相應的鍵就會自動刪除,從而實現了服務的
注冊功能和服務的健康檢查功能。
5 etcd的並發操作
在多個客戶端並發的讀取或者改寫一個key的時候就會產生競爭,因此要保證對鍵的變更是原子操作,在etcdv2中提供了CAS機制,每次更新
前都會拿鍵的舊版本與當前版本進行compare比較,然后再決定是否進行swap。etcdv3中可以將多個操作組成一個事務,當滿足一定的條件的
時候事務就會被執行。