1. 程式人生 > 其它 >etcdv3與etcdv2特性比較

etcdv3與etcdv2特性比較

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中可以將多個操作組成一個事務,當滿足一定的條件的時候事務就會被執行。