centos7下Etcd3集群搭建


一、環境介紹

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啟動時,集群模式下會用到的參數如下:

  1. –name
  2. etcd集群中的節點名,這里可以隨意,可區分且不重復就行
  3. –listen-peer-urls
  4. 監聽的用於節點之間通信的url,可監聽多個,集群內部將通過這些url進行數據交互(如選舉,數據同步等)
  5. –initial-advertise-peer-urls
  6. 建議用於節點之間通信的url,節點間將以該值進行通信。
  7. –listen-client-urls
  8. 監聽的用於客戶端通信的url,同樣可以監聽多個。
  9. –advertise-client-urls
  10. 建議使用的客戶端通信url,該值用於etcd代理或etcd成員與etcd節點通信。
  11. –initial-cluster-token etcd-cluster-1
  12. 節點的token值,設置該值后集群將生成唯一id,並為每個節點也生成唯一id,當使用相同配置文件再啟動一個集群時,只要該token值不一樣,etcd集群就不會相互影響。
  13. –initial-cluster
  14. 也就是集群中所有的initial-advertise-peer-urls 的合集
  15. –initial-cluster-state new
  16. 新建集群的標志,初始化狀態使用 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:etcd

chown -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嗯,就可以了。



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM