一、環境介紹
etcd主要功能是分布式的存儲鍵值,優點不多說了,分布是集群,自動選舉等等,自行百度,主要說下配置方法,折騰了幾天,終於優點眉目了,記錄下操作方法,本文參考了如下鏈接
https://www.cnblogs.com/breg/p/5728237.html
http://www.361way.com/etcd-cluster/5468.html
https://n40lab.wordpress.com/2016/08/01/installing-coreos-etcd-server-on-centos-7/
創建了4個虛擬機,虛擬機中系統為centos7(虛擬機使用的docker)
for((i=1,i<5,i++))
do
docker run -d --name etcd$i --hostname=etcd$i --privileged=true centos7 /usr/sbin/init
docker exec -it etcd$i bash -c “yum update -y&& yum install net-tools -y”
done
hostname ip
etcd1 192.168.0.5
etcd2 192.168.0.6
etcd3 192.168.0.7
etcd4 192.168.0.8
將上述ip表添加到/etc/hosts中
二、etcd安裝與配置
2.1 yum安裝etcd
yum install etcd -y
驗證etcd是否可用
# systemctl enable etcd&&systemctl start etcd # etcdctl set hello world world # etcdctl get hello world
這里的集群模式是指完全集群模式,當然也可以在單機上通過不同的端口,部署偽集群模式,只是那樣做只適合測試環境,生產環境考慮到可用性的話需要將etcd實例分布到不同的主機上,這里集群搭建有三種方式,分布是靜態配置,etcd發現,dns發現。默認配置運行etcd,監聽本地的2379端口,用於與client端交互,監聽2380用於etcd內部交互。etcd啟動時,集群模式下會用到的參數如下:
- –name
- etcd集群中的節點名,這里可以隨意,可區分且不重復就行
- –listen-peer-urls
- 監聽的用於節點之間通信的url,可監聽多個,集群內部將通過這些url進行數據交互(如選舉,數據同步等)
- –initial-advertise-peer-urls
- 建議用於節點之間通信的url,節點間將以該值進行通信。
- –listen-client-urls
- 監聽的用於客戶端通信的url,同樣可以監聽多個。
- –advertise-client-urls
- 建議使用的客戶端通信url,該值用於etcd代理或etcd成員與etcd節點通信。
- –initial-cluster-token etcd-cluster-1
- 節點的token值,設置該值后集群將生成唯一id,並為每個節點也生成唯一id,當使用相同配置文件再啟動一個集群時,只要該token值不一樣,etcd集群就不會相互影響。
- –initial-cluster
- 也就是集群中所有的initial-advertise-peer-urls 的合集
- –initial-cluster-state new
- 新建集群的標志,初始化狀態使用 new,建立之后改此值為 existing
yum安裝etcd需要修改兩個配置文件
# vim /lib/systemd/system/etcd.service [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/var/lib/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-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=\"${ETCD_INITIAL_CLUSTER_STATE}\" \ --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\"" Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
# vim /etc/etcd/etcd.conf
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd1:2380"
ETCD_INITIAL_CLUSTER="etcd01=http://etcd1:2380,etcd02=http://etcd2:2380,etcd03=http://etcd3:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://etcd1:2379"
配置好3台虛擬機之后同時啟動etcd服務# systemctl start etcd
正常情況可以查看到成員列表etcdctl member list
# etcdctl member list 3b05c2e4e4c104b4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false bd388e7810915853: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://etcd3:2379 isLeader=true d282ac2ce600c1ce: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://etcd2:2379 isLeader=false
2.2 二進制包安裝etcd
yum雖然也能用,還是二進制包的方法操作簡單些。
下載穩定版本的etcd二進制包
mkdir /var/lib/etcd;mkdir /etc/etcd; groupadd -r etcd; useradd -r -g etcd -d /var/lib/etcd -s /sbin/nologin -c "etcd user" etcd;chown -R etcd:etcd /var/lib/etcd
ETCD_VERSION=`curl -s -L https://github.com/coreos/etcd/releases/latest | grep linux-amd64\.tar\.gz | grep href | cut -f 6 -d '/' | sort -u`; ETCD_DIR=/opt/etcd-$ETCD_VERSION; mkdir $ETCD_DIR;curl -L https://github.com/coreos/etcd/releases/download/$ETCD_VERSION/etcd-$ETCD_VERSION-linux-amd64.tar.gz | tar xz --strip-components=1 -C $ETCD_DIR; ln -sf $ETCD_DIR/etcd /usr/bin/etcd && ln -sf $ETCD_DIR/etcdctl /usr/bin/etcdctl; etcd --version
四台虛擬機新建etcd服務啟動腳本
[root@etcd1 /]# vim /lib/systemd/system/etcd.service
[Unit]
Description=etcd service
After=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
User=etcd
ExecStart=/usr/bin/etcd
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
etcd靜態模式集群配置(即知道需要哪幾台虛擬機需要建立集群)etcd1,etcd2與etcd3建立集群后etcd4加入集群。
修改etcd1配置文件
[root@etcd1 /]# cat /etc/etcd/etcd.conf ETCD_NAME=etcd1 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd1:2380" ETCD_INITIAL_CLUSTER="etcd01=http://etcd1:2380,etcd02=http://etcd2:2380,etcd03=http://etcd3:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://etcd1:2379"
修改etcd2配置文件
[root@etcd2 /]# cat /etc/etcd/etcd.conf ETCD_NAME=etcd2 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd2:2380" ETCD_INITIAL_CLUSTER="etcd01=http://etcd1:2380,etcd02=http://etcd2:2380,etcd03=http://etcd3:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://etcd2:2379"
修改etcd3配置文件
[root@etcd3 /]# cat /etc/etcd/etcd.conf ETCD_NAME=etcd3 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd3:2380" ETCD_INITIAL_CLUSTER="etcd01=http://etcd1:2380,etcd02=http://etcd2:2380,etcd03=http://etcd3:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://etcd3:2379"
配置好3台虛擬機之后同時啟動etcd服務# systemctl start etcd
正常情況可以查看到成員列表etcdctl member list
[root@etcd1 /]# etcdctl member list 3b05c2e4e4c104b4: name=etcd01 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false bd388e7810915853: name=etcd03 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=true d282ac2ce600c1ce: name=etcd02 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=false
etcd配置過程中遇到的問題,添加節點,刪除節點,備份數據
### 本地連接報錯
[root@etcd2 /]# etcdctl member list Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused ; error #1: dial tcp 127.0.0.1:4001: getsockopt: connection refused error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused error #1: dial tcp 127.0.0.1:4001: getsockopt: connection refused
如果出現如上的錯誤,是因為ETCD_LISTEN_CLIENT_URLS參數沒有配置http://127.0.0.1:2379而導致的,所以這里我使用了0.0.0.0代表了監控所有地址。
除此之外仍上述報錯,當配置的很混亂的時候可以刪掉/var/lib/etcd/中的default.etcd文件,前提是數據不重要哈。還要注意default.etcd文件夾權限改為etcd:etcdchown -R etcd:etcd default.etcd
此步很重要,另外還需要細心檢查/etc/etcd/etcd.conf和/lib/systemd/system/etcd.service是否有錯誤。改完之后再重啟etcd服務(systemctl start etcd
)就ok了。
etcd集群中添加一節點etcd04
在現有集群etcd三台虛擬機中任何一台操作添加新節點etcd04
[root@etcd1 /]# etcdctl member list 3b05c2e4e4c104b4: name=etcd01 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false bd388e7810915853: name=etcd03 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=true d282ac2ce600c1ce: name=etcd02 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=false [root@etcd1 /]# etcdctl member add etcd04 http://etcd4:2380 Added member named etcd04 with ID ec8c708bb5b2fdc6 to cluster ETCD_NAME="etcd04" ETCD_INITIAL_CLUSTER="etcd01=http://etcd1:2380,etcd03=http://etcd3:2380,etcd02=http://etcd2:2380,etcd04=http://etcd4:2380" ETCD_INITIAL_CLUSTER_STATE="existing" 注意此處三條必須要與etcd04配置文件(/etc/etcd/etcd.conf)相符合 [root@etcd1 /]# etcdctl member list 3b05c2e4e4c104b4: name=etcd01 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false bd388e7810915853: name=etcd03 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=true d282ac2ce600c1ce: name=etcd02 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=false ec8c708bb5b2fdc6[unstarted]: peerURLs=http://etcd4:2380
啟動etcd服務之前修改etcd04配置文件
[root@etcd4 /]# vim /etc/etcd/etcd.conf ETCD_NAME=etcd04 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://etcd4:2380" ETCD_INITIAL_CLUSTER="etcd01=http://etcd1:2380,etcd02=http://etcd2:2380,etcd03=http://etcd3:2380,etcd04=http://etcd4:2380" ETCD_INITIAL_CLUSTER_STATE="existing" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://etcd4:2379"
如果/var/lib/etcd/中存在default.etcd一定要刪除,否側etcd服務啟動失敗(因為集群中給etcd04分配的物理id與現有庫中的id不相同)
[root@etcd4 /]# rm -rf /var/lib/etcd/default.etcd/
[root@etcd4 /]# systemctl start etcd
[root@etcd4 /]# etcdctl member list #啟動服務后再查詢etcd04已加入集群中
3b05c2e4e4c104b4: name=etcd01 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false
bd388e7810915853: name=etcd03 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=true
d282ac2ce600c1ce: name=etcd02 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=false
ec8c708bb5b2fdc6: name=etcd04 peerURLs=http://etcd4:2380 clientURLs=http://etcd4:2379 isLeader=false
etcd集群中刪除etcd04節點
現有集群節點是4個
[root@etcd1 /]# etcdctl member list
3b05c2e4e4c104b4: name=etcd01 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false
b28ea7a9615a2c72: name=etcd04 peerURLs=http://etcd4:2380 clientURLs=http://etcd4:2379 isLeader=false
bd388e7810915853: name=etcd03 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=true
d282ac2ce600c1ce: name=etcd02 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=false
在除etcd04節點外的任意一台中操作刪除etcd04節點
[root@etcd1 /]# etcdctl member remove b28ea7a9615a2c72
Removed member b28ea7a9615a2c72 from cluster
[root@etcd1 /]# etcdctl member list
3b05c2e4e4c104b4: name=etcd01 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false
bd388e7810915853: name=etcd03 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=true
d282ac2ce600c1ce: name=etcd02 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=false
etcd集群中備份數據
etcd的數據應該算是很安全的,即便出現單點故障,數據也不會丟失,前提是節點不在同一台服務器中
etcd的數據備份比較。。。網上的方法etcdctl backup --data-dir /var/lib/etcd/default.etcd/ --backup-dir /home/etcd_backup
備份完之后,發現沒有db文件,好尷尬啊,所有我直接cp了,cp -r /var/lib/etcd/default.etcd/ /home/etcd_backup
chown -R etcd:etcd default.etcd
嗯,就可以了。