1. 簡介:算法
1.1. ETCD是kubernetes和openstack都用到的組件,須要首先裝好數據庫
1.2. 官方網站:https://coreos.com/etcd/緩存
1.3. ETCD的做用:bash
Etcd是Kubernetes的存儲狀態的數據庫。雖然Kubernetes系統中有重要的內存緩存,但Etcd被認爲是記錄系統狀態。服務器
Etcd的快速總結:它是一個集羣分佈式數據庫,它能夠提供分佈式數據的一致性。這類的系統(如Zookeeper, Consul)是在 Google開發的chubby系統以後造成的,這些系統也稱爲"鎖服務器",由於他們能夠實現分佈式鎖。Etcd和chubby的數據模型是一個簡單的層次化的Key,並存儲了簡單的非結構化value,這看起來像是一個文件系統。有意思的是,在Google, chubby 被頻繁用於爲實現訪問本地文件和對象存儲的功能的抽象文件接口。然而,分佈式數據庫的高度一致性,提供了數據的嚴格寫入順序並容許client原子性的對數據作更新操做。app
可靠的系統的狀態管理是任何系統中很是困難的一件事情。在分佈式系統中,它是更加困難的,由於它引入了一致性算法,如raft或paxos。經過使用etcd,Kubernetes能夠專一系統的其餘部分。分佈式
Etcd的watch機制是Kubernetes工做的關鍵。系統容許client去執行輕量級的對於Key值變化事件的訂閱。當要watch的數據發生變化時, client會當即獲得通知。這能夠用做分佈式系統組件之間的協調機制。 一個組件一旦寫入etcd,其餘組件能夠當即對該變化做出反應。
Etcd的消息機制正好和PubSub消息隊列機制相反。在許多消息隊列系統系統中,topic不存儲真正的用戶數據,但發佈到這些topic的消息含有豐富的數據。對於像Etcd這樣的系統,Key(相似於主題)存儲了真實的數據而消息(數據變化通知)不含獨特的豐富消息。換句話說,對於消息隊列來講,topic很簡單,而像Etcd則正好相反。網站
2. 環境:url
2.1. etcd: 3.2.9-3.el7spa
2.2. 機器列表
功能與組件 | 機器名 | 服務IP | 管理IP | Processor Cores | RAM | Storage | 備註 |
Mongo/Redis/RabbitMQ/Memorycached/Etcd | HCTJOSCACHE01 | 10.30.2.45 | 172.16.0.45 | ||||
Mongo/Redis/RabbitMQ/Memorycached/Etcd | HCTJOSCACHE02 | 10.30.2.46 | 172.16.0.46 | ||||
Mongo/Redis/RabbitMQ/Memorycached/Etcd | HCTJOSCACHE03 | 10.30.2.47 | 172.16.0.47 |
3. 安裝:
3.1. 直接使用yum安裝
yum install etcd
3.2. 再給ETCD建立一個獨立的文件系統
# lvcreate -n lv_etcd -L 10G vg_system # mkfs.xfs /dev/mapper/vg_system-lv_etcd # mkdir -p /data/etcd
修改/etc/fstab
#etcd /dev/mapper/vg_system-lv_etcd /data/etcd xfs defaults 0 0
mount -a
chown etcd:etcd /data/etcd
4. 配置:
4.1. 配置文件:/etc/etcd/etcd.conf
hctjoscache01
[root@hctjoscache01 ~]# grep -v "^#" /etc/etcd/etcd.conf [Member] ETCD_DATA_DIR="/data/etcd" ETCD_LISTEN_PEER_URLS="http://172.16.0.45:2380" ETCD_LISTEN_CLIENT_URLS="http://172.16.0.45:2379" ETCD_NAME="hctjoscache01" [Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.0.45:2380" ETCD_ADVERTISE_CLIENT_URLS="http://172.16.0.45:2379" ETCD_INITIAL_CLUSTER_TOKEN="k8s-cluster" ETCD_INITIAL_CLUSTER="hctjoscache01=http://172.16.0.45:2380,hctjoscache02=http://172.16.0.46:2380,hctjoscache03=http://172.16.0.47:2380"
hctjoscache02
[root@hctjoscache02 ~]# grep -v "^#" /etc/etcd/etcd.conf
[Member]
ETCD_DATA_DIR="/data/etcd"
ETCD_LISTEN_PEER_URLS="http://172.16.0.46:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.16.0.46:2379"
ETCD_NAME="hctjoscache02"
[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.0.46:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.0.46:2379"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-cluster"
ETCD_INITIAL_CLUSTER="hctjoscache01=http://172.16.0.45:2380,hctjoscache02=http://172.16.0.46:2380,hctjoscache03=http://172.16.0.47:2380"
hctjoscache03
[root@hctjoscache03 ~]# grep -v "^#" /etc/etcd/etcd.conf [Member] ETCD_DATA_DIR="/data/etcd" ETCD_LISTEN_PEER_URLS="http://172.16.0.47:2380" ETCD_LISTEN_CLIENT_URLS="http://172.16.0.47:2379" ETCD_NAME="hctjoscache03" [Clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.0.47:2380" ETCD_ADVERTISE_CLIENT_URLS="http://172.16.0.47:2379" ETCD_INITIAL_CLUSTER_TOKEN="k8s-cluster" ETCD_INITIAL_CLUSTER="hctjoscache01=http://172.16.0.45:2380,hctjoscache02=http://172.16.0.46:2380,hctjoscache03=http://172.16.0.47:2380"
4.2. 編輯服務文件 /usr/lib/systemd/system/etcd.service
[Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/data/etcd EnvironmentFile=-/etc/etcd/etcd.conf User=etcd # set GOMAXPROCS to number of processors ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd \ --name=\"${ETCD_NAME}\" \ --data-dir=\"${ETCD_DATA_DIR}\" \ --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}, http://127.0.0.1:2379\" \ --initial-advertise-peer-urls ${ETCD_INITIAL_ADVERTISE_PEER_URLS} \ --listen-peer-urls ${ETCD_LISTEN_PEER_URLS} \ --advertise-client-urls ${ETCD_ADVERTISE_CLIENT_URLS} \ --initial-cluster-token ${ETCD_INITIAL_CLUSTER_TOKEN} \ --initial-cluster ${ETCD_INITIAL_CLUSTER} \ --initial-cluster-state new" Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
4.3. 記得reload一下systemd
systemctl daemon-reload
4.4. 能夠啓動服務了
systemctl start etcd
注意:啓動第一個節點時時間較長,由於etcd須要初始化集羣,可是因爲其餘節點並無啓動,因此會超時,記得看一下日誌
4.5.查看集羣狀態,要看到is healthy纔算是正常
etcdctl cluster-health