Etcd集群是什么意思

這篇文章主要介紹了Etcd集群是什么意思,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)公司是一家專注于做網(wǎng)站、成都做網(wǎng)站與策劃設(shè)計(jì),巴林左旗網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:巴林左旗等地區(qū)。巴林左旗做網(wǎng)站價(jià)格咨詢:13518219792

Etcd簡(jiǎn)介

Etcd是一個(gè)開源的、高度一致的分布式key-value存儲(chǔ)系統(tǒng)。由Go語(yǔ)言實(shí)現(xiàn),具有很好的跨平臺(tái)性。主要用于配置共享和服務(wù)發(fā)現(xiàn)。通過raft算法維護(hù)集群中各個(gè)節(jié)點(diǎn)的通信和數(shù)據(jù)一致性,節(jié)點(diǎn)之間是對(duì)等的關(guān)系,即使leader節(jié)點(diǎn)故障,會(huì)很快選舉出新的leader,保證系統(tǒng)的正常運(yùn)行。目前已廣泛應(yīng)用在kubernetes、ROOK、CoreDNS、M3、openstack等領(lǐng)域。

Etcd集群是什么意思
特性:
  1. 接口操作簡(jiǎn)單,提供了http+json和grpc接口。
  2. 可選的ssl客戶端認(rèn)證,支持https訪問。
  3. 每個(gè)實(shí)例支持1000的QPS,適用于存儲(chǔ)數(shù)據(jù)量小但更新和訪問頻繁的數(shù)據(jù)。
  4. 數(shù)據(jù)按照文件系統(tǒng)的方式,分層存儲(chǔ),數(shù)據(jù)持久化。
  5. 監(jiān)視特定的鍵或目錄的變化,并對(duì)值的更改做出響應(yīng),適用于消息的發(fā)布和訂閱。

Etcd架構(gòu)及工作原理

架構(gòu)


Etcd的架構(gòu)如下圖所示,主要分為四部分。HTTP server、Store、Raft和WAL。

Etcd集群是什么意思
  • HTTP server:為用戶提供的Api請(qǐng)求。
  • Store:用于處理 etcd 支持的各類功能的事務(wù),包括數(shù)據(jù)索引、節(jié)點(diǎn)狀態(tài)變更、監(jiān)控與反饋、事件處理與執(zhí)行等等。
  • Raft:利用raft算法,保證節(jié)點(diǎn)之間數(shù)據(jù)的強(qiáng)一致性。
  • WAL:數(shù)據(jù)存儲(chǔ)方式。通過 WAL 進(jìn)行數(shù)據(jù)持久化存儲(chǔ)。Snapshot 存儲(chǔ)數(shù)據(jù)的狀態(tài)快照;Entry 表示存儲(chǔ)的具體日志內(nèi)容。

工作原理


Etcd集群是什么意思

ETCD集群是一個(gè)分布式系統(tǒng),每個(gè)ETCD節(jié)點(diǎn)都維護(hù)了一個(gè)狀態(tài)機(jī),并且存儲(chǔ)了完整的數(shù)據(jù),任意時(shí)刻至多存在一個(gè)有效的主節(jié)點(diǎn)。主節(jié)點(diǎn)處理所有來自客戶端的讀寫操作。其中狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換規(guī)則如下:

Etcd集群是什么意思

ETCD中每個(gè)節(jié)點(diǎn)的狀態(tài)集合為(Follower、Candidate、Leader),集群初始化時(shí)候,每個(gè)節(jié)點(diǎn)都是Follower角色,當(dāng)Follower在一定時(shí)間內(nèi)沒有收到來自主節(jié)點(diǎn)的心跳,會(huì)將自己角色改變?yōu)镃andidate,并發(fā)起一次選主投票;當(dāng)收到包括自己在內(nèi)超過半數(shù)節(jié)點(diǎn)贊成后,選舉成功;當(dāng)收到票數(shù)不足半數(shù)選舉失敗,或者選舉超時(shí)。若本輪未選出主節(jié)點(diǎn),將進(jìn)行下一輪選舉。當(dāng)某個(gè)Candidate節(jié)點(diǎn)成為L(zhǎng)eader后,Leader節(jié)點(diǎn)會(huì)通過心跳與其他節(jié)點(diǎn)同步數(shù)據(jù),同時(shí)參與競(jìng)選的Candidate節(jié)點(diǎn)進(jìn)入Follower角色。

Etcd集群搭建及基本應(yīng)用

部署環(huán)境


三臺(tái)系統(tǒng)為centos7的虛機(jī),IP地址如下:
10.143.74.108
10.202.252.147
10.202.254.213
下來以10.143.74.108為例,介紹安裝與配置步驟。

一鍵安裝etcd


1、創(chuàng)建安裝腳本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、或者執(zhí)行以下命令,腳本已上傳到公網(wǎng)S3存儲(chǔ)。

wget -qO- http://pub-shbt.s3.#/v2s3/build-20200419214912.sh | bash

etcd配置和systemd保活


1、 創(chuàng)建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

注釋:
  • ETCD_NAME:本member的名稱;
  • ETCD_DATA_DIR:存儲(chǔ)數(shù)據(jù)的目錄;
  • ETCD_LISTEN_CLIENT_URLS:用于監(jiān)聽客戶端etcdctl或者curl連接;
  • ETCD_ADVERTISE_CLIENT_URLS: 本機(jī)地址, 用于通知客戶端,客戶端通過此IPs與集群通信;
  • ETCD_INITIAL_ADVERTISE_PEER_URLS:本機(jī)地址,用于通知集群member,與member通信;
  • ETCD_LISTEN_PEER_URLS:用于監(jiān)聽集群中其它member的連接;
  • ETCD_INITIAL_CLUSTER:描述集群中所有節(jié)點(diǎn)的信息,本member根據(jù)此信息去聯(lián)系其他member;
  • ETCD_INITIAL_CLUSTER_STATE:集群狀態(tài),新建集群時(shí)候設(shè)置為new,若是想加入某個(gè)已經(jīng)存在的集群設(shè)置為existing。
2、 創(chuàng)建etcd的systemd配置文件 /usr/lib/systemd/system/etcd.service。
[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、 啟動(dòng)etcd。

systemctl daemon-reload

systemctl enable etcd.service

systemctl start etcd.service

4、 查看etcd集群狀態(tài)。

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

Etcd集群是什么意思

5、 讀寫以及刪除操作。

Etcd集群是什么意思

6、 watch監(jiān)聽操作。

Etcd集群是什么意思

至此,在10.143.74.108主機(jī)上,我們已經(jīng)成功安裝、啟動(dòng)etcd服務(wù),并測(cè)試了基本的功能。其他兩臺(tái)機(jī)器的配置類似,在此不再做介紹。

Etcd選主在Go中的實(shí)踐

什么是選主機(jī)制呢?舉個(gè)例子,在軍事演習(xí)中,我們總會(huì)發(fā)現(xiàn)某架預(yù)警機(jī)周圍分布著多架戰(zhàn)斗機(jī)和殲擊機(jī),他們統(tǒng)一聽從預(yù)警機(jī)的調(diào)度,有序的完成消滅敵軍的任務(wù)。那么在這個(gè)集群中,預(yù)警機(jī)就類似于我們選主中的master,某個(gè)集群有且只有一個(gè)master,完成任務(wù)的分發(fā)等工作,其他節(jié)點(diǎn)配合行動(dòng),當(dāng)這個(gè)master節(jié)點(diǎn)掛掉之后,要能夠立刻選出新的節(jié)點(diǎn)作為master。

下來我們一起看下項(xiàng)目中如何利用etcd的選主機(jī)制來實(shí)現(xiàn)應(yīng)用的高可用吧。

1、安裝clientv3。
go get "github.com/coreos/etcd/clientv3"

2、添加常量。

const prefix = "/nanoPing"
const prop = "local"
var leaderFlag bool

3、編寫client節(jié)點(diǎn)競(jìng)選函數(shù)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、添加競(jìng)選成功后執(zhí)行的動(dòng)作run。

func run() {
      log.Println("[info] Service master")
      log.Println("[info] Task start.")
}

5、編寫入口函數(shù),創(chuàng)建client節(jié)點(diǎn),參與競(jìng)選master,競(jìng)選成功,執(zhí)行任務(wù)。

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

}

6、 測(cè)試運(yùn)行結(jié)果。
選主成功的節(jié)點(diǎn)輸出:
Etcd集群是什么意思

選主失敗的節(jié)點(diǎn)輸出:

Etcd集群是什么意思

Master節(jié)點(diǎn)進(jìn)程退出后,之前的非master節(jié)點(diǎn),自動(dòng)競(jìng)選為master節(jié)點(diǎn)。

Etcd集群是什么意思

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Etcd集群是什么意思”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

網(wǎng)站標(biāo)題:Etcd集群是什么意思
轉(zhuǎn)載源于:http://muchs.cn/article6/jioeog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、定制網(wǎng)站網(wǎng)站維護(hù)、網(wǎng)站排名App設(shè)計(jì)、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)