etcd是CoreOS
團隊於2016年6月發起的開源項目,他的目標是構建一個高可用的分佈式鍵值(key_value)數據庫。Etcd內部採用raft
協議做爲一致性算法,Etcd是基於Go
語言實現的。目前很火的kubernetes
等項目都用到etcd組件做爲一個高可用分佈式鍵值存儲。node
etcd做爲服務發現系統,有如下特色:linux
- 簡單: 安裝配置簡單,並且提供了HTTP API進行交互,使用也很簡單
- 安全: 支持SSL證書驗證
- 快速: 根據官方提供的benchmark數據,單實例支持每秒2k+讀操做
- 可靠: 採用Raft算法,實現分佈式系統數據的可用性和一致性
etcd比較多的應用場景適用於服務發現,服務發現(Service Disvocery)要解決的是分佈式系統中最多見的問題之一,在同一個分佈式集羣中的進程或服務如何才能找到對方並創建鏈接。
服務發現: 就是要了解集羣中是否有進程在監聽UDP或TCP端口,並經過名字能夠進行查找和連接。算法
解決服務發現的先決條件:數據庫
- 一個強一致性、高可用的服務存儲目錄
基於Ralf算法的etcd天生的就是這樣一個強一致性、高可用的服務存儲目錄- 一種註冊服務和健康服務健康情況的機制。
用戶能夠在etcd中註冊服務,而且對註冊的服務配置key TTL,定時保持服務的心跳以達到監控健康狀態的效果。- 一種查找和鏈接服務的機制。
經過在etcd指定的主題下注冊的服務業能在對應的主題下查找到。爲了確保鏈接,咱們能夠在每一個服務機器上都部署一個proxy模式的etcd,這樣就能夠確保訪問etcd集羣的服務都可以互相鏈接。
etcd在生產環境中通常推薦集羣方式部署。
etcd目前默認使用2379端口提供HTTP API服務,2380端口和peer通訊(這兩個端口已經被IANA官方預留給etcd);在以前的版本中可能會分別使用4001和7001,在使用的過程當中須要注意這個區別。
咱們直接yum安裝etcd便可json
yum -y install etcd
啓動服務安全
systemctl start etcd.service && systemctl enable etcd.service
查看服務狀態bash
[root@etcd-197 /]# systemctl status etcd ● etcd.service - Etcd Server Loaded: loaded (/usr/lib/systemd/system/etcd.service; disabled; vendor preset: disabled) Active: active (running) since 四 2019-08-29 15:27:16 CST; 9s ago Main PID: 24426 (etcd) Tasks: 13 Memory: 12.7M CGroup: /system.slice/etcd.service └─24426 /usr/bin/etcd --name=default --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://localhost:2379 8月 29 15:27:16 etcd-197 etcd[24426]: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2 8月 29 15:27:16 etcd-197 etcd[24426]: 8e9e05c52164694d became leader at term 2 8月 29 15:27:16 etcd-197 etcd[24426]: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2 8月 29 15:27:16 etcd-197 etcd[24426]: published {Name:default ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c32 8月 29 15:27:16 etcd-197 etcd[24426]: ready to serve client requests 8月 29 15:27:16 etcd-197 etcd[24426]: setting up the initial cluster version to 3.3 8月 29 15:27:16 etcd-197 systemd[1]: Started Etcd Server. 8月 29 15:27:16 etcd-197 etcd[24426]: set the initial cluster version to 3.3 8月 29 15:27:16 etcd-197 etcd[24426]: enabled capabilities for version 3.3 8月 29 15:27:16 etcd-197 etcd[24426]: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!
Etcd 是 CoreOS 推出的高可用的鍵值存儲系統,主要用於k8s集羣的服務發現等,而自己 Etcd 也支持集羣模式部署,從而實現自身高可用;
Etcd 構建自身高可用集羣主要有三種形式:分佈式
靜態發現: 預先已知 Etcd 集羣中有哪些節點,在啓動時直接指定好 Etcd 的各個 node 節點地址
Etcd 動態發現: 經過已有的 Etcd 集羣做爲數據交互點,而後在擴展新的集羣時實現經過已有集羣進行服務發現的機制
DNS 動態發現: 經過 DNS 查詢方式獲取其餘節點地址信息ide
在下面3臺機器安裝Etcd集羣,(注意,Etcd集羣節點必須爲奇數)工具
節點/主機名 | IP地址 |
---|---|
Etcd1 | 172.16.1.193 |
Etcd2 | 172.16.1.195 |
Etcd3 | 172.16.1.198 |
CentOS 官方提供了 Etcd 的rpm,可經過 yum 直接安裝,目前 yum 上最新版本爲 3.3.11,比較合適;官方最新版本更新到了 3.3.12,鑑於穩定因素,這裏使用 3.3.11 搭建
# yum -y install etcd # etcd --version etcd Version: 3.3.11 Git SHA: 2cf9e51 Go Version: go1.10.3 Go OS/Arch: linux/amd64
默認的配置文件
[root@Etcd2 /]# cat /etc/etcd/etcd.conf #[Member] #ETCD_CORS="" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #ETCD_WAL_DIR="" #ETCD_LISTEN_PEER_URLS="http://localhost:2380" ETCD_LISTEN_CLIENT_URLS="http://localhost:2379" #ETCD_MAX_SNAPSHOTS="5" #ETCD_MAX_WALS="5" ETCD_NAME="default" #ETCD_SNAPSHOT_COUNT="100000" #ETCD_HEARTBEAT_INTERVAL="100" #ETCD_ELECTION_TIMEOUT="1000" #ETCD_QUOTA_BACKEND_BYTES="0" #ETCD_MAX_REQUEST_BYTES="1572864" #ETCD_GRPC_KEEPALIVE_MIN_TIME="5s" #ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s" #ETCD_GRPC_KEEPALIVE_TIMEOUT="20s" # #[Clustering] #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380" ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379" #ETCD_DISCOVERY="" #ETCD_DISCOVERY_FALLBACK="proxy" #ETCD_DISCOVERY_PROXY="" #ETCD_DISCOVERY_SRV="" #ETCD_INITIAL_CLUSTER="default=http://localhost:2380" #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #ETCD_INITIAL_CLUSTER_STATE="new" #ETCD_STRICT_RECONFIG_CHECK="true" # #[Proxy] #ETCD_PROXY="off" #ETCD_PROXY_FAILURE_WAIT="5000" #ETCD_PROXY_REFRESH_INTERVAL="30000" #ETCD_PROXY_DIAL_TIMEOUT="1000" #ETCD_PROXY_WRITE_TIMEOUT="5000" #ETCD_PROXY_READ_TIMEOUT="0" # #[Security] #ETCD_CERT_FILE="" #ETCD_KEY_FILE="" #ETCD_CLIENT_CERT_AUTH="false" #ETCD_TRUSTED_CA_FILE="" #ETCD_AUTO_TLS="false" #ETCD_PEER_CERT_FILE="" #ETCD_PEER_KEY_FILE="" #ETCD_PEER_CLIENT_CERT_AUTH="false" #ETCD_PEER_TRUSTED_CA_FILE="" #ETCD_PEER_AUTO_TLS="false" # #[Logging] #ETCD_DEBUG="false" #ETCD_LOG_PACKAGE_LEVELS="" #ETCD_LOG_OUTPUT="default" # #[Unsafe] #ETCD_FORCE_NEW_CLUSTER="false" # #[Version] #ETCD_VERSION="false" #ETCD_AUTO_COMPACTION_RETENTION="0" # #[Profiling] #ETCD_ENABLE_PPROF="false" #ETCD_METRICS="basic" # #[Auth] #ETCD_AUTH_TOKEN="simple"
修改後的配置文件,另外兩臺對照更改
[root@Etcd1 /]# grep -v "^#" /etc/etcd/etcd.conf #數據存放的目錄 ETCD_DATA_DIR="/var/lib/etcd/etcd1" #監聽的URL,用於與其餘節點通信 ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" #對外提供服務的地址,客戶端會鏈接到這裏和Etcd進行交互 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #節點的名稱 ETCD_NAME="etcd1" #改節點的member(同伴)監聽的地址,這個值會告訴集羣中其餘節點 ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.1.193:2380" #對外公告的該節點客戶端監聽地址,這個值會告訴集羣中其餘節點 ETCD_ADVERTISE_CLIENT_URLS="http://172.16.1.193:2379" #集羣中全部節點的信息,這裏的 etcd1 是節點的 --name 指定的名字;後面的172.16.1.93:2380 是 --initial-advertise-peer-urls 指定的值 ETCD_INITIAL_CLUSTER="etcd1=http://172.16.1.193:2380,etcd2=http://172.16.1.195:2380,etcd3=http://172.16.1.198:2380" # 建立集羣的 token,這個值每一個集羣保持惟一。這樣的話,若是你要從新建立集羣,即便配置和以前同樣,也會再次生成新的集羣和節點 uuid;不然會致使多個集羣之間的衝突,形成未知的錯誤 ETCD_INITIAL_CLUSTER_TOKEN="zsf-etcd-cluster" #新建集羣的時候,這個值爲 new ;假如已經存在的集羣,這個值爲 existing ETCD_INITIAL_CLUSTER_STATE="new"
啓動etcd集羣
systemctl start etcd.service
集羣啓動完成以後咱們在任意節點執行etcdctl member list
可列出全部集羣節點信息,
[root@Etcd1 /]# etcdctl member list 729a9a39e059871b: name=etcd2 peerURLs=http://172.16.1.195:2380 clientURLs=http://172.16.1.195:2379 isLeader=false ce1ac55777b620f9: name=etcd1 peerURLs=http://172.16.1.193:2380 clientURLs=http://172.16.1.193:2379 isLeader=true e62232af7400cdbe: name=etcd3 peerURLs=http://172.16.1.198:2380 clientURLs=http://172.16.1.198:2379 isLeader=false
使用etcdctl cluster-health
檢查集羣健康狀態
[root@Etcd1 /]# etcdctl cluster-health member 729a9a39e059871b is healthy: got healthy result from http://172.16.1.195:2379 member ce1ac55777b620f9 is healthy: got healthy result from http://172.16.1.193:2379 member e62232af7400cdbe is healthy: got healthy result from http://172.16.1.198:2379
etcdctl是一個命令行客戶端,它能提供一些簡潔的命令,供用戶直接跟etcd服務打交道,而無需基於 HTTP API方式。能夠方便咱們在對服務進行測試或者手動修改數據庫內容。建議剛剛接觸etcd時經過etdctl來熟悉相關操做。這些操做跟HTTP API基本上是對應的。
etcd項目二進制發行包中已經包含了etcdctl工具,etcdctl支持的命令大致上分爲數據庫操做和非數據庫操做兩類。
由於咱們這邊使用的是etcd 3.3.11版本,etcdctl默認操做的事etcd 2.X 版本,2和3版本有些命令不同,因此咱們要添加個環境變量,來使其默認操做etcd 3.X版本
export ETCDCTL_API=3 或者在`/etc/profile`文件中添加環境變量 vi /etc/profile ... ETCDCTL_API=3 ... source /etc/profile
[root@etcd-197 ~]# etcdctl version etcdctl version: 3.3.11 API version: 3.3
//增 [root@etcd-197 ~]# etcdctl put zsf 'hello world!' OK
[root@etcd-197 ~]# etcdctl get zsf zsf hello world!
指定爲json格式查找
[root@etcd-197 ~]# etcdctl get --write-out="json" zsf {"header":{"cluster_id":14841639068965178418,"member_id":10276657743932975437,"revision":6,"raft_term":3},"kvs":[{"key":"enNm","create_revision":6,"mod_revision":6,"version":1,"value":"aGVsbG8gd29ybGQh"}],"count":1}
基於相同前綴查找
[root@etcd-197 ~]# etcdctl put zsf1 'one' OK [root@etcd-197 ~]# etcdctl put zsf2 'two' OK [root@etcd-197 ~]# etcdctl get zsf --prefix zsf hello world! zsf1 one zsf2 two
[root@etcd-197 ~]# etcdctl put zsf "test" OK [root@etcd-197 ~]# etcdctl get zsf zsf test
[root@etcd-197 ~]# etcdctl del zsf1 1 [root@etcd-197 ~]# etcdctl get zsf1 [root@etcd-197 ~]#
[root@etcd-197 ~]# etcdctl --write-out=table endpoint status +----------------+------------------+---------+---------+-----------+-----------+------------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX | +----------------+------------------+---------+---------+-----------+-----------+------------+ | 127.0.0.1:2379 | 8e9e05c52164694d | 3.3.11 | 20 kB | true | 3 | 17 | +----------------+------------------+---------+---------+-----------+-----------+------------+
member add Adds a member into the cluster member remove Removes a member from the cluster member update Updates a member in the cluster member list Lists all members in the cluster
列出集羣成員:
[root@Etcd1 ~]# etcdctl member list -w table +------------------+---------+-------+--------------------------+--------------------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | +------------------+---------+-------+--------------------------+--------------------------+ | 729a9a39e059871b | started | etcd2 | http://172.16.1.195:2380 | http://172.16.1.195:2379 | | ce1ac55777b620f9 | started | etcd1 | http://172.16.1.193:2380 | http://172.16.1.193:2379 | | e62232af7400cdbe | started | etcd3 | http://172.16.1.198:2380 | http://172.16.1.198:2379 | +------------------+---------+-------+--------------------------+--------------------------+