久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Botposter.com集群ETCD2.3.7升級至3.0實例分析

168次閱讀
沒有評論

共計 3836 個字符,預計需要花費 10 分鐘才能閱讀完成。

本篇文章為大家展示了 Botposter.com 集群 ETCD2.3.7 升級至 3.0 實例分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Botposet.com 是一款與 HubSpot 類似的營銷自動化 SAAS 產品,全部使用 golang 開發。

說明

在 Botposter.com 中,ETCD 主要用于以下兩個職責:

master 選舉

集群信息保存

早期曾使用 ETCD 的 TTL 來實現 master 心跳檢測,由于性能原因在 Botposter.com 上個月的重構中取消了這種用法。這也恰好簡化了升級難度,因為 ETCD v3 對 TTL 有重大改動。

準備資料準備

遷移工作的主要參考以下兩篇資料:

https://github.com/coreos/etcd/blob/master/Documentation/op-guide/v2-migration.md

https://github.com/coreos/etcd/blob/master/Documentation/upgrades/upgrade_3_0.md

測試環境

開始升級前需要搭建測試環境,過程非常簡單,這一點 ETCD 做得非常好,V3 版本與 V2 版本無論從安裝方式和配置參數完全一致。

安裝參考鏈接:https://github.com/coreos/etcd/releases

配置參考鏈接:https://github.com/coreos/etcd/blob/master/Documentation/op-guide/clustering.md

配置好測試環境后,使用 etcdctl 測試 ETCD V3 是否可以正常使用。這里需要注意,一定不要忘記在環境變量中加入 ETCDCTL_API=3。否則在操作 V3 時,無論使用 SET,GET 都沒有任何數據返回,也沒有錯誤返回。建議 ETCD V3 可以提供錯誤提示。我在這里耽誤了一些時間,因為想當然的以為,使用 ETCD V3 和 ETCDCTL V3 是默認匹配的。ETCDCTL 的文檔鏈接:https://github.com/coreos/etcd/blob/master/etcdctl/README.md#migrate-options

注意:我在第一次使用 etcdctl member list 命令 (所有的命令都會出錯,此處以 member list 舉例) 的時候,返回下面錯誤代碼:

grpc: addrConn.resetTransport failed to create client transport: connection error: desc =  transport: dial tcp 127.0.0.1:22379: getsockopt: connection refused  Reconnecting to {127.0.0.1:22379   nil}

單獨運行 etcdctl 命令,會返回 etcdctl 的使用幫助,其中有一行:

 --endpoints=[127.0.0.1:2379,127.0.0.1:22379,127.0.0.1:32379] gRPC endpoints

原來默認 gRPC 的 endpoints 有三個,解決這個問題的已知辦法有兩個:一是在 etcdctl 命令行中加入 –endpoints 參數

etcdctl --endpoints=127.0.0.1:2379 member list

二是在 etcd 啟動參數中增加其它端口

-listen-client-urls http://127.0.0.1:2379,http://127.0.0.1:22379,http://127.0.0.1:32379

在 Botposter.com 中暫時使用第二種方法。因為遷移時間有限,沒有繼續查看是否可以修改 gRPC 的默認 –endpoints。

API V2 與 V3 區別

事務:ETCD V3 提供了多鍵條件事務(multi-key conditional transactions),應用各種需要使用事務代替原來的 Compare-And-Swap 操作。

平鍵空間(Flat key space):ETCD V3 不再使用目錄結構,只保留鍵。例如:/a/b/c/ 是一個鍵,而不是目錄。V3 中提供了前綴查詢,來獲取符合前綴條件的所有鍵值,這變向實現了 V2 中查詢一個目錄下所有子目錄和節點的功能。

簡潔的響應:像 DELETE 這類操作成功后將不再返回操作前的值。如果希望獲得刪除前的值,可以使用事務,來實現一個原子操作,先獲取鍵值,然后再刪除。

租約:租約代替了 V2 中的 TTL 實現,TTL 綁定到一個租約上,鍵再附加到這個租約上。當 TTL 過期時,租約將被銷毀,同時附加到這個租約上的鍵也被刪除。

與 Botposter.com 有關的改動只有平鍵空間,因為系統中使用 ETCD 目錄結構保存了 master,node 和 task 的全部信息。從官方文檔的表述看,事務和租約值得測試并用于優化 V2 的用法。

客戶端代碼升級平鍵空間

將原代碼中包含以下代碼的部分都修改為

client.GetOptions{Recursive: true}

都修改為

clientv3.WithPrefix()

數據類型

在 V2 版本中,resp.Node.ModifiedIndex 的數據類型為 uint64,V3 中 revision 為 int64。因為在 Botposter.com 使用了 resp.Node.ModifiedIndex 作為全局序列標識,所以,需要將原系統中的數據類型修改為 int64。

Compare-And-Swap

在 V2 的一種典型用法就是 Compare-And-Swap,在 Botposter.com 中也使用這種方法實現了分布式鎖,實現方法是在 SET 操作時增加下面的操作:

client.SetOptions{PrevExist:  false})

即,只有當前 key 不存在時,才能寫入成功。

在 V3 中,改為由事務實現。具體代碼如下:

kvc := clientv3.NewKV(cli)
r, _ := kvc.Txn(context.Background()).
 If(clientv3.Compare(clientv3.CreateRevision(key),  = , 0)).
 Then(clientv3.OpPut(key, v)).
 Commit()

Txn 的具體用法參考:https://godoc.org/github.com/coreos/etcd/clientv3#example-KV–Txn

Node

在 V2 中,get 操作 response 回來的 value 保存在 response.node.value,如果是一個 directory,返回的結果集保存在 response.node.nodes 中。V3 做了大幅修改,因為 V3 中不再有 directory,所有的 key 都是 flat key,所以,所有 get 操作的返回值都保存在 GetResponse.Kvs(數據類型是 []*mvccpb.KeyValue)中。而且 V2 中,keynotfound 等錯誤在 V3 中都不再保留,V3 中,當查詢的 key 不存在時,GetResponse.Count 為 0,len(GetResponse.Kvs) 也為 0,Get 操作返回的 error 為 nil。所以在 V2 中的代碼如

response.Node.Value

需要改為

GetResponse.Kvs[0].Value

另外值得注意的是,V3 中的 key 和 value 的返回值都是[]byte 類型,這可以減少很多 string 與[]byte 的數據類型轉換操作。

ETCD 升級

ETCD 升級很簡單,先按照安裝參考鏈接:https://github.com/coreos/etcd/releases,下載并解壓文件。因為 Bostposter.com 集群有自動恢復機制,所以使用離線升級的方式,在所有服務器運行腳本:

service etcd stop
cp etcd /usr/local/bin
service etcd start

ETCD 的所有啟動參數都不需要修改,升級時間不超過 1 秒。ETCD 升級后,升級集群服務的代碼,只有在升級流程容器時需要重啟 2000 多個流程,全部恢復時間大概在 1 分鐘左右。

至此,升級工作全部完成。對系統功能和集群都做了測試,沒有出現任何問題。

下面說說升級到 ETCD V3 后的感受,時間有限沒有做精確測試,沒有數據支撐略顯不夠嚴謹。

首先,V3 服務器端的內存比 V2 占用得更高,至少高 50%。尤其是壓力增大時,內存占用飆升得很快,壓力減小后幾分鐘內存會釋放出來。

其次,Client 使用后一定要 Close,因為在 V2 時,Botposter.com 中使用了 sync.pool 來保存 Client。當升級到 V3 后,操作頻繁時池化的 Client 會占用非常多的內存,因為沒有做具體測試,還不清楚一個 Client 占用多少內存。目前的解決辦法是 Client 不再池化,而且使用后立即 Close。

第三,V3 的 API 更加合理,直接的結果是代碼量減少了,異常處理也變得更簡單。

第四,從升級后的整體表現看,V3 的性能比 V2 要很多。

整體來說,在有條件的情況下,我建議升級至 ETCD V3。

上述內容就是 Botposter.com 集群 ETCD2.3.7 升級至 3.0 實例分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計3836字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 凤翔县| 偃师市| 喜德县| 金沙县| 屯门区| 长春市| 夏河县| 宜州市| 马山县| 蓬溪县| 武冈市| 礼泉县| 博爱县| 安泽县| 崇信县| 德钦县| 达拉特旗| 同心县| 临清市| 渝北区| 凌源市| 三穗县| 两当县| 大余县| 名山县| 紫金县| 淮阳县| 寿阳县| 丹巴县| 白水县| 临澧县| 惠州市| 清苑县| 黎城县| 镇平县| 沙坪坝区| 综艺| 毕节市| 萍乡市| 天津市| 马龙县|