您好,登錄后才能下訂單哦!
這篇文章主要介紹了Etcd集群是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Etcd簡介
Etcd是一個開源的、高度一致的分布式key-value存儲系統。由Go語言實現,具有很好的跨平臺性。主要用于配置共享和服務發現。通過raft算法維護集群中各個節點的通信和數據一致性,節點之間是對等的關系,即使leader節點故障,會很快選舉出新的leader,保證系統的正常運行。目前已廣泛應用在kubernetes、ROOK、CoreDNS、M3、openstack等領域。
Etcd架構及工作原理
架構
Etcd的架構如下圖所示,主要分為四部分。HTTP server、Store、Raft和WAL。
工作原理
ETCD集群是一個分布式系統,每個ETCD節點都維護了一個狀態機,并且存儲了完整的數據,任意時刻至多存在一個有效的主節點。主節點處理所有來自客戶端的讀寫操作。其中狀態機的狀態轉換規則如下:
ETCD中每個節點的狀態集合為(Follower、Candidate、Leader),集群初始化時候,每個節點都是Follower角色,當Follower在一定時間內沒有收到來自主節點的心跳,會將自己角色改變為Candidate,并發起一次選主投票;當收到包括自己在內超過半數節點贊成后,選舉成功;當收到票數不足半數選舉失敗,或者選舉超時。若本輪未選出主節點,將進行下一輪選舉。當某個Candidate節點成為Leader后,Leader節點會通過心跳與其他節點同步數據,同時參與競選的Candidate節點進入Follower角色。
Etcd集群搭建及基本應用
部署環境
一鍵安裝etcd
1、創建安裝腳本build.sh。
ETCD_VER=v3.4.7# choose either URLGOOGLE_URL=https://storage.googleapis.com/etcdGITHUB_URL=https://github.com/etcd-io/etcd/releases/downloadDOWNLOAD_URL=${GITHUB_URL}rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gzrm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-testcurl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gztar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gzcp /tmp/etcd-download-test/etcd /usr/binetcd --versioncp /tmp/etcd-download-test/etcdctl /usr/binetcdctl version
2、或者執行以下命令,腳本已上傳到公網S3存儲。
wget -qO- http://pub-shbt.s3.#/v2s3/build-20200419214912.sh | bash
etcd配置和systemd保活
1、 創建etcd配置文件/etc/etcd/etcd.conf。
ETCD_NAME=instance01ETCD_DATA_DIR="/usr/local/etcd/data"ETCD_LISTEN_CLIENT_URLS="http://10.143.74.108:2379,http://127.0.0.1:2379"ETCD_ADVERTISE_CLIENT_URLS="http://10.143.74.108:2379"ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.143.74.108:2380"ETCD_LISTEN_PEER_URLS="http://10.143.74.108:2380"ETCD_INITIAL_CLUSTER="instance01=http://10.143.74.108:2380,instance02=http://10.202.253.147:2380,instance03=http://10.202.254.213:2380"ETCD_INITIAL_CLUSTER_STATE=new
[Unit] Description=Etcd Server After=network.target [Service] Type=simple WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/bin/etcd KillMode=process Restart=always RestartSec=3 LimitNOFILE=655350 LimitNPROC=655350 PrivateTmp=false SuccessExitStatus=143 [Install] WantedBy=multi-user.target
3、 啟動etcd。
systemctl daemon-reload
systemctl enable etcd.service
systemctl start etcd.service
4、 查看etcd集群狀態。
HOST_1=10.143.74.108
HOST_2=10.202.253.147
HOST_3=10.202.254.213
ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
etcdctl -w table --endpoints=$ENDPOINTS endpoint status
5、 讀寫以及刪除操作。
6、 watch監聽操作。
至此,在10.143.74.108主機上,我們已經成功安裝、啟動etcd服務,并測試了基本的功能。其他兩臺機器的配置類似,在此不再做介紹。
Etcd選主在Go中的實踐
下來我們一起看下項目中如何利用etcd的選主機制來實現應用的高可用吧。
go get "github.com/coreos/etcd/clientv3"
2、添加常量。
const prefix = "/nanoPing" const prop = "local" var leaderFlag bool
3、編寫client節點競選函數campaign。
func campaign(c *clientv3.Client, election string, prop string) {
for {
//gets the leased session for a client
s, err := concurrency.NewSession(c, concurrency.WithTTL(15))
if err != nil {
log.Println(err)
continue
}
//returns a new election on a given key prefix
e := concurrency.NewElection(s, election)
ctx := context.TODO()
//Campaign puts a value as eligible for the election on the prefix key.
//Multiple sessions can participate in the election for the same prefix,
//but only one can be the leader at a time
if err = e.Campaign(ctx, prop); err != nil {
log.Println(err)
continue
}
log.Println("elect: success")
leaderFlag = true
select {
case <-s.Done():
leaderFlag = false
log.Println("elect: expired")
}
}
}
4、添加競選成功后執行的動作run。
func run() { log.Println("[info] Service master") log.Println("[info] Task start.") }
5、編寫入口函數,創建client節點,參與競選master,競選成功,執行任務。
func Start() {
donec := make(chan struct{})
//create a client
cli, err := clientv3.New(clientv3.Config{Endpoints: g.Config().Etcd.Addr,Username:g.Config().Etcd.User,Password:g.Config().Etcd.Password})
if err != nil {
log.Fatal(err)
}
defer cli.Close()
go campaign(cli, prefix, prop)
go func() {
ticker := time.NewTicker(time.Duration(10) * time.Second)
for {
select {
case <-ticker.C:
{
if leaderFlag == true{
run()
return
}else{
log.Println("[info] Service is not master")
}
}
}
}
}()
<-donec
}
選主失敗的節點輸出:
Master節點進程退出后,之前的非master節點,自動競選為master節點。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Etcd集群是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。