etcd的簡介請參考https://blog.csdn.net/chinawangfei/article/details/95046120。
本篇主要介紹etcd的安裝。
etcd 是用 go 語言編寫的,安裝過程簡單,只需要下載對應的二進制文件,並放到合適的路徑即可。
1.單點安裝
如果在測試環境,啓動一個單點的 etcd 服務,只需要運行 etcd
命令就行。
2019-07-03 17:00:50.443272 I | etcdmain: etcd Version: 3.3.13
2019-07-03 17:00:50.443414 I | etcdmain: Git SHA: GitNotFound
2019-07-03 17:00:50.443422 I | etcdmain: Go Version: go1.12.4
2019-07-03 17:00:50.443437 I | etcdmain: Go OS/Arch: darwin/amd64
2019-07-03 17:00:50.443447 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2019-07-03 17:00:50.443460 N | etcdmain: failed to detect default host (default host not supported on darwin_amd64)
2019-07-03 17:00:50.443474 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2019-07-03 17:00:50.445897 I | embed: listening for peers on http://localhost:2380
2019-07-03 17:00:50.446235 I | embed: listening for client requests on localhost:2379
2019-07-03 17:00:50.455582 I | etcdserver: name = default
2019-07-03 17:00:50.455622 I | etcdserver: data dir = default.etcd
2019-07-03 17:00:50.455640 I | etcdserver: member dir = default.etcd/member
2019-07-03 17:00:50.455664 I | etcdserver: heartbeat = 100ms
2019-07-03 17:00:50.455676 I | etcdserver: election = 1000ms
2019-07-03 17:00:50.455691 I | etcdserver: snapshot count = 100000
2019-07-03 17:00:50.455725 I | etcdserver: advertise client URLs = http://localhost:2379
2019-07-03 17:00:50.455793 I | etcdserver: initial advertise peer URLs = http://localhost:2380
2019-07-03 17:00:50.455853 I | etcdserver: initial cluster = default=http://localhost:2380
2019-07-03 17:00:50.549110 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32
2019-07-03 17:00:50.549334 I | raft: 8e9e05c52164694d became follower at term 0
2019-07-03 17:00:50.549380 I | raft: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2019-07-03 17:00:50.549393 I | raft: 8e9e05c52164694d became follower at term 1
2019-07-03 17:00:50.583394 W | auth: simple token is not cryptographically signed
2019-07-03 17:00:50.599580 I | etcdserver: starting server... [version: 3.3.13, cluster version: to_be_decided]
2019-07-03 17:00:50.599843 I | etcdserver: 8e9e05c52164694d as single-node; fast-forwarding 9 ticks (election ticks 10)
2019-07-03 17:00:50.599884 E | etcdserver: cannot monitor file descriptor usage (cannot get FDUsage on darwin)
2019-07-03 17:00:50.601119 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32
2019-07-03 17:00:51.354949 I | raft: 8e9e05c52164694d is starting a new election at term 1
2019-07-03 17:00:51.356658 I | raft: 8e9e05c52164694d became candidate at term 2
2019-07-03 17:00:51.356929 I | raft: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2
2019-07-03 17:00:51.356957 I | raft: 8e9e05c52164694d became leader at term 2
2019-07-03 17:00:51.356967 I | raft: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2
2019-07-03 17:00:51.357503 I | etcdserver: setting up the initial cluster version to 3.3
2019-07-03 17:00:51.362463 N | etcdserver/membership: set the initial cluster version to 3.3
2019-07-03 17:00:51.362787 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c32
2019-07-03 17:00:51.362879 I | embed: ready to serve client requests
2019-07-03 17:00:51.362938 I | etcdserver/api: enabled capabilities for version 3.3
2019-07-03 17:00:51.367846 N | embed: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!
從執行結果中可以看出:
etcdserver: name = default, name表示節點名稱,默認爲default。
etcdserver: data dir = default.etcd,data-dir保存日誌和快照的目錄,默認爲當前工作目錄“./default.etcd/”。
etcdserver: initial advertise peer URLs = http://localhost:2380,通過http://localhost:2380,和集羣中其他節點通信。
etcdserver: advertise client URLs = http://localhost:2379,通過http://localhost:2379,對外提供HTTP API服務,供客戶端交互。如果配置webui,就使用這個地址。
etcdserver: heartbeat = 100ms leader發送心跳到followers的間隔時間。
etcdserver: election = 1000ms 重新投票的超時時間,如果follow在該時間間隔沒有收到心跳包,會觸發重新投票,默認爲1000ms
集羣和每個節點都會生成一個 uuid。
啓動的時候,會運行 raft協議,選舉出 leader。
2.集羣安裝
在安裝和啓動 etcd 服務的時候,各個節點需要知道集羣中其他節點的信息(一般是 ip 和 port 信息)。根據你是否可以提前知道每個節點的 ip,有幾種不同的啓動方案:
- 靜態配置:在啓動 etcd server 的時候,通過
--initial-cluster
參數配置好所有的節點信息 - 使用已有的 etcd cluster 來註冊和啓動,比如官方提供的
discovery.etcd.io
- 使用 DNS 啓動,
etcd 的安裝文檔官網已經給出了,這裏不再贅述。當然,你也可以通過 docker 來安裝 etcd,具體的文檔可以看這裏。
啓動參數中,peer-urls是一組,client-url是一組,cluster是一組。
下面給出可以常用配置的參數和它們的解釋,方便理解:
--name
:方便理解的節點名稱,默認爲default
,在集羣中應該保持唯一,可以使用 hostname--data-dir
:服務運行數據保存的路徑,默認爲${name}.etcd
--snapshot-count
:指定有多少事務(transaction)被提交時,觸發截取快照保存到磁盤--heartbeat-interval
:leader 多久發送一次心跳到 followers。默認值是 100ms--eletion-timeout
:重新投票的超時時間,如果 follow 在該時間間隔沒有收到心跳包,會觸發重新投票,默認爲 1000 ms--listen-peer-urls
:和同伴通信的地址,比如http://ip:2380
,如果有多個,使用逗號分隔。需要所有節點都能夠訪問,所以不要使用 localhost!--listen-client-urls
:對外提供服務的地址:比如http://ip:2379,http://127.0.0.1:2379
,客戶端會連接到這裏和 etcd 交互--advertise-client-urls
:對外公告的該節點客戶端監聽地址,這個值會告訴集羣中其他節點--initial-advertise-peer-urls
:該節點同伴監聽地址,這個值會告訴集羣中其他節點--initial-cluster
:集羣中所有節點的信息,格式爲node1=http://ip1:2380,node2=http://ip2:2380,…
。注意:這裏的node1
是節點的--name
指定的名字;後面的ip1:2380
是--initial-advertise-peer-urls
指定的值--initial-cluster-state
:新建集羣的時候,這個值爲new
;假如已經存在的集羣,這個值爲existing
--initial-cluster-token
:創建集羣的 token,這個值每個集羣保持唯一。這樣的話,如果你要重新創建集羣,即使配置和之前一樣,也會再次生成新的集羣和節點 uuid;否則會導致多個集羣之間的衝突,造成未知的錯誤
所有以 --init
開頭的配置,都是在 bootstrap 集羣的時候纔會用到,後續節點的重啓會被忽略。
NOTE:所有的參數也可以通過環境變量進行設置,--my-flag
對應環境變量的 ETCD_MY_FLAG
;但是命令行指定的參數會覆蓋環境變量對應的值。
爲了簡單起見,在演示時一般採用單點的 etcd server。但是,請在生產環境中配置 etcd 集羣,並使用 SSL 安全機制。