您好,登錄后才能下訂單哦!
這篇文章主要講解了“Docker微服務的ETCD集群搭建方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Docker微服務的ETCD集群搭建方法是什么”吧!
etcd是一個高可用的鍵值存儲系統,主要用于共享配置和服務發現。etcd是由CoreOS開發并維護的,靈感來自于 ZooKeeper 和 Doozer,它使用Go語言編寫,并通過Raft一致性算法處理日志復制以保證強一致性。Raft是一個來自Stanford的新的一致性算法,適用于分布式系統的日志復制,Raft通過選舉的方式來實現一致性,在Raft中,任何一個節點都可能成為Leader。Google的容器集群管理系統Kubernetes、開源PaaS平臺Cloud Foundry和CoreOS的Fleet都廣泛使用了etcd。
簡單: curl可訪問的用戶的API(HTTP+JSON)定義明確,面向用戶的API(gRPC)
安全: 可選的SSL客戶端證書認證
快速: 單實例每秒 1000 次寫操作
可靠: 使用Raft保證一致性
1)靜態發現: 預先已知 Etcd 集群中有哪些節點,在啟動時直接指定好Etcd的各個node節點地址
2)Etcd動態發現: 通過已有的Etcd集群作為數據交互點,然后在擴展新的集群時實現通過已有集群進行服務發現的機制
3)DNS動態發現: 通過DNS查詢方式獲取其他節點地址信息
底層OS:Centos7
docker版本:Docker version 18.06.1-ce
IP:
服務器A:192.167.0.168
服務器B:192.167.0.170
服務器C:192.167.0.172
首先在各個服務器上下載最新的etcd鏡像
# docker pull quay.io/coreos/etcd
本人因機器有限,在一臺機器配置了3個容器,在機器上創建了子網絡,三臺容器在一個網絡里
# docker network create --subnet=192.167.0.0/16 etcdnet
接下來我采用了兩種方式來創建集群:1、將三個服務器挨個添加進集群;2、將三個服務器統一添加進集群。以下命令標注A的代表在A機器上執行,同理B、C。
A 在 容器/服務器 A上運行一個ETCD實例,取名為autumn-client0,注意其狀態為new,“-initial-cluster”中只有自己的IP
# docker run -d -p 2379:2379 -p 2380:2380 --net etcdnet --ip 192.167.0.168 --name etcd0 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client0 -advertise-client-urls http://192.167.0.168:2379 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.168:2380 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "autumn-client0=http://192.167.0.168:2380" -initial-cluster-state new
參數說明
—data-dir 指定節點的數據存儲目錄,這些數據包括節點ID,集群ID,集群初始化配置,Snapshot文件,若未指定—wal-dir,還會存儲WAL文件; —wal-dir 指定節點的was文件的存儲目錄,若指定了該參數,wal文件會和其他數據文件分開存儲。 —name 節點名稱 —initial-advertise-peer-urls 告知集群其他節點url. — listen-peer-urls 監聽URL,用于與其他節點通訊 — advertise-client-urls 告知客戶端url, 也就是服務的url — initial-cluster-token 集群的ID — initial-cluster 集群中所有節點
配置文件說明,例如
# [member] # 節點名稱 ETCD_NAME=node1 # 數據存放位置 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #ETCD_WAL_DIR="" #ETCD_SNAPSHOT_COUNT="10000" #ETCD_HEARTBEAT_INTERVAL="100" #ETCD_ELECTION_TIMEOUT="1000" # 監聽其他 Etcd 實例的地址 ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" # 監聽客戶端地址 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" #ETCD_MAX_SNAPSHOTS="5" #ETCD_MAX_WALS="5" #ETCD_CORS="" # #[cluster] # 通知其他 Etcd 實例地址 ETCD_INITIAL_ADVERTISE_PEER_URLS="http://node1:2380" # if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..." # 初始化集群內節點地址 ETCD_INITIAL_CLUSTER="node1=http://node1:2380,node2=http://node2:2380,etcd2=http://etcd2:2380" # 初始化集群狀態,new 表示新建 ETCD_INITIAL_CLUSTER_STATE="new" # 初始化集群 token ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster" # 通知 客戶端地址 ETCD_ADVERTISE_CLIENT_URLS=http://node1:2379,http://node1:4001
A 在服務器A的ETCD服務上,通過調用API添加一個新的節點:192.167.0.170
# curl http://127.0.0.1:2379/v2/members -XPOST -H "Content-Type: application/json" -d '{"peerURLs": ["http://192.167.0.170:2480"]}'
B 在容器/服務器B上運行一個ETCD實例,取名為autumn-client1,注意其狀態為existing,“-initial-cluster”中有前一個IP及自己的IP
# docker run -d -p 2479:2479 -p 2480:2480 --name etcd1 quay.io/coreos/etcd /usr/local/bin/etcd --name autumen-client1 -advertise-client-urls http://192.167.0.170:2379 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.170:2380 -listen-peer-urls http://0.0.0.0:2480 -initial-cluster-token etcd-cluster -initial-cluster "autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480" -initial-cluster-state existing
A 在服務器A的ETCD服務上,通過調用API添加一個新的節點:192.168.7.172
# curl http://127.0.0.1:2379/v2/members -XPOST -H "Content-Type: application/json" -d '{"peerURLs": ["http://192.167.0.172:2580"]}'
C 在服務器C上運行一個ETCD實例,取名為autumn-client2,注意其狀態為existing,“-initial-cluster”中有之前所有節點的IP及自己的IP
# docker run -d -p 2579:2579 -p 2580:2580 --name etcd quay.io/coreos/etcd -name autumn-client2 -advertise-client-urls http://192.167.0.172:2579 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.172:2580 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480,autumn-client2=http://192.167.0.172:2580" -initial-cluster-state existing
(“-initial-cluster”中包含所有節點的IP,狀態均為new)
A上執行
# docker run -d -p 2379:2379 -p 2380:2380 --restart=always --net etcdnet --ip 192.167.0.168 --name etcd0 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client0 -advertise-client-urls http://192.167.0.168:2379 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.168:2380 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480,autumn-client2=http://192.167.0.172:2580 -initial-cluster-state new
B上執行
# docker run -d -p 2479:2479 -p 2480:2480 --restart=always --net etcdnet --ip 192.167.0.170 --name etcd1 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client1 -advertise-client-urls http://192.167.0.170:2479 -listen-client-urls http://0.0.0.0:2479 -initial-advertise-peer-urls http://192.167.0.170:2480 -listen-peer-urls http://0.0.0.0:2480 -initial-cluster-token etcd-cluster -initial-cluster autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480,autumn-client2=http://192.167.0.172:2580 -initial-cluster-state new
C上執行
# docker run -d -p 2579:2579 -p 2580:2580 --restart=always --net etcdnet --ip 192.167.0.172 --name etcd2 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client2 -advertise-client-urls http://192.167.0.172:2579 -listen-client-urls http://0.0.0.0:2579 -initial-advertise-peer-urls http://192.167.0.172:2580 -listen-peer-urls http://0.0.0.0:2580 -initial-cluster-token etcd-cluster -initial-cluster autumn-client0=http://192.167.0.168:2380,autumn-client1=http://192.167.0.170:2480,autumn-client2=http://192.167.0.172:2580 -initial-cluster-state new
集群驗證。兩種方法創建的集群可通過以下方式進行驗證
1、驗證集群members。在集群中的每臺機器上查看members,得出的結果應該是相同的
[root@localhost ~]# curl -L http://127.0.0.1:2379/v2/members {"members":[{"id":"1a661f2b9997ba39","name":"autumn-client0","peerURLs":["http://192.167.0.168:2380"],"clientURLs":["http://192.168.7.168:2379"]},{"id":"4932c8ea462e079c","name":"autumn-client2","peerURLs":["http://192.167.0.172:2580"],"clientURLs":["http://192.167.0.172:2579"]},{"id":"c1dbdde07e61741e","name":"autumn-client1","peerURLs":["http://192.167.0.170:2480"],"clientURLs":[http://192.167.0.170:2479]}]}
2、某臺機器上添加數據,其他機器上查看數據,得出的結果應該是相同的
A上執行
[root@localhost ~]# curl -L http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello autumn" {"action":"set","node":{"key":"/message","value":"Hello autumn","modifiedIndex":13,"createdIndex":13},"prevNode":{"key":"/message","value":"Hello world1","modifiedIndex":11,"createdIndex":11}}
B、C上執行
[root@localhost ~]# curl -L http://127.0.0.1:2379/v2/keys/message {"action":"get","node":{"key":"/message","value":"Hello autumn","modifiedIndex":13,"createdIndex":13}}
基本操作api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Documentation/v2/api.md 集群配置api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Documentation/v2/members_api.md 鑒權認證api: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Documentation/v2/auth_api.md 配置項:https://github.com/coreos/etcd/blob/master/Documentation/op-guide/configuration.md https://coreos.com/etcd/docs/latest/runtime-configuration.html https://coreos.com/etcd/docs/latest/clustering.html https://coreos.com/etcd/docs/latest/runtime-configuration.html https://coreos.com/etcd/docs/latest/ https://coreos.com/etcd/docs/latest/admin_guide.html#disaster-recovery 采用標準的restful 接口,支持http 和 https 兩種協議。
傳統的服務調用一般通過配置文件讀取ip進行調用,這里有諸多限制,如不靈活,無法感知服務的狀態,實現服務調用負載均衡復雜等缺點,而引入etcd后,問題將大大化簡
服務啟動后向etcd注冊,并上報自己的監聽的端口以及當前的權重因子等信息,且對該信息設置ttl值。
服務在ttl的時間內周期性上報權重因子等信息。
client端調用服務時向etcd獲取信息,進行調用,同時監聽該服務是否變化(通過watch方法實現)。
當新增服務時watch方法監聽到變化,將服務加入代用列表,當服務掛掉時ttl失效,client端檢測到變化,將服務踢出調用列表,從而實現服務的動態擴展。
另一方面,client端通過每次變化獲取到的權重因子來進行client端的加權調用策略,從而保證后端服務的負載均衡。
感謝各位的閱讀,以上就是“Docker微服務的ETCD集群搭建方法是什么”的內容了,經過本文的學習后,相信大家對Docker微服務的ETCD集群搭建方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。