Etcd分布式存儲系統


介紹

  etcd是一款高性能的開源的分布式key-value分布式存儲系統,可以用於配置共享和服務的注冊與發現等功能。類似於zookeeper和consul。

  etcd 誕生於 CoreOS 公司,它最初是用於解決集群管理系統中 OS 升級的分布式並發控制以及配置文件的存儲與分發等問題。正如etcd官網所說,etcd 被設計為提供高可用、強一致,可靠的的 key-value 分布式數據存儲服務。

  etcd的官網:https://etcd.io/

  etcd的github地址:https://github.com/etcd-io/etcd

  

 

使用etcd的項目

  1.CoreOS。

    2.Kubernetes。

  3.CloudFoundry。

 

etcd應用場景

  1.服務注冊與發現(Service Discovery)。

    服務注冊發現一般用於微服務中,就是解決在同一個分布式集群中的進程或者一個服務,如何自動確定系統中有哪些服務,如何取找到目標服務或者進程並建立連接。涉及到一個服務有哪些實例,這些服務的地址等信息等是個問題,服務注冊與發現就是用於解決該問題。新添加的服務通過注冊后可以讓服務請求方可以發現。

    

     服務發現的幾個關鍵問題:

      1)服務注冊中心不僅僅是記錄當前有多少個服務提供者,同時服務注冊中心還監控每個服務提供者的狀態,他們之前有心跳機制,如果其中有一台服務提供者連不上就會讓其下線,保證服務請求者連接的服務都是可用的。

    2.配置中心。

     將一些配置信息放在etcd上進行集中管理。這類場景的使用方式一般是應用在啟動的時候主動從etcd獲取一次配置信息,同時在etcd節點上注冊一個Watcher並等待,以后每次配置有更新的時候,etcd都會實時通知訂閱者,以達到獲取最新配置信息的目的。

  2.分布式鎖。

    因為 etcd使用 Raft算法保持了數據的強一致性,某次操作存儲集群中的 值就必然是全局一致的,所以 etcd容易實現分布式鎖

    鎖服務包含兩種使用方式, 是保持獨占,二是控制時序

     1)保持獨占

        保持獨占即所有試圖獲取鎖的用戶最終只有個可以得到

           etcd 為此 提供了一套實現分布式鎖原子操作 CAS ( ComparaAndSwap)的 API通過設置 prevExist 值,可以保證在多個節點上同時創建某個目錄時,只有一個節點能夠成功,而成功的那個即可獲得分布式鎖

.        2)控制時序

      試圖獲取鎖的所有用戶都會進入等待隊列,獲得鎖的順序是全局唯一的,同時還能決隊列的執行順序

      etcd 為此也提供了 一套 API (自動創建有序鍵),它會將一個目錄的鍵值指 定為 POST 動作,這樣, etcd 就會在目錄下生成一個當前最大的值作為鍵,並 存儲這個新的值(客戶端編號)

      

 

 

  3.負載均衡。

  4.分布式通知與協調。

  5.消息發布和訂閱。。

  6.分布式隊列。   

 

etcd的特點

   1.完全復制:集群中的每個節點都可以使用完整的存檔。

   2.高可用性:Etcd可用於避免硬件的淡點故障或網絡分區問題。當集群中主節點掛了,會選舉新的leader主節點。

   3.一致性:根據CAP理論,基於Raft算法的Etcd滿足CAP中的CP,每次讀取都會返回跨多主機的最新寫入。

   4.簡單:相對於其他同類產品適用簡單,包括一個定義良好的,面向用戶的API(gRPC)。

   5.安全:支持客戶端SSL安全認證,實現了可選的客戶端證書身份驗證的自動化TLS。

   6.快速:每秒10000次寫入的基准速度。

   7.可靠:使用Raft分布式算法實現了強一致性,高可用性的服務存儲目錄。

 

etcd的架構及內部機制

總體架構

    

 

     etcd的架構主要分四個部分

      1.HTTP Server:用於處理用戶發送的API請求以及其他etcd節點的同步與心跳信息的請求。

      2.Store:用於處理etcd支持的各類功能的事務,包括數據索引,節點狀態的變更,監控與反饋,事件處理與執行等,是etcd對用戶提供的大多數API功能的具體實現。

      3.Raft:Raft分布式強一致性算法的具體實現,是etcd的核心。

      4.WAL:Write Ahead Log(預寫式日志),是etcd的數據存儲方式,這種技術在mysql中也有用到。除了在內存中存有所有數據的狀態及節點的索引以外,etcd就通過WAL進行持久化存儲。WAL中所有數據提交前都會實現記錄日志。Snapshot是為了防止數據過多而進行的狀態快照,Entry表示存儲的具體日志內容。

   

內部機制

  一個 etcd 集群,通常會由 3 個或者 5 個節點組成,多個節點之間通過 Raft 一致性算法的完成分布式一致性協同,算法會選舉出一個主節點作為 leader,由 leader 負責數據的同步與數據的分發。當 leader 出現故障后系統會自動地選取另一個節點成為 leader,並重新完成數據的同步。客戶端在多個節點中,僅需要選擇其中的任意一個就可以完成數據的讀寫,內部的狀態及數據協同由 etcd 自身完成。

  在 etcd 整個架構中,有一個非常關鍵的概念叫做 quorum,quorum 的定義是 (n+1)/2,也就是說超過集群中半數節點組成的一個團體,在 3 個節點的集群中,etcd 可以容許 1 個節點故障,也就是只要有任何 2 個節點可用,etcd 就可以繼續提供服務。同理,在 5 個節點的集群中,只要有任何 3 個節點可用,etcd 就可以繼續提供服務,這也是 etcd 集群高可用的關鍵。

  在允許部分節點故障之后繼續提供服務,就需要解決一個非常復雜的問題:分布式一致性。在 etcd 中,該分布式一致性算法由 Raft 一致性算法完成,這個算法本身是比較復雜的有機會再詳細展開,這里僅做一個簡單的介紹以方便大家對其有一個基本的認知。Raft 一致性算法能夠工作的一個關鍵點是:任意兩個 quorum 的成員之間一定會有一個交集(公共成員),也就是說只要有任意一個 quorum 存活,其中一定存在某一個節點(公共成員),它包含着集群中所有的被確認提交的數據。正是基於這一原理,Raft 一致性算法設計了一套數據同步機制,在 Leader 任期切換后能夠重新同步上一個 quorum 被提交的所有數據,從而保證整個集群狀態向前推進的過程中保持數據的一致。

 

 

etcd安裝

  etcd下載地址:https://github.com/etcd-io/etcd/releases  在這里選擇一個版本。

    我的環境是Mac系統使用brew安裝即可。

  

      安裝完畢后查看etcd版本

  

 

etcd使用

   1. 啟動etcd服務:執行etcd命令即可啟動服務。

songguojundeMBP:~ songguojun$ etcd
[WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead
2020-05-09 19:10:42.606712 I | etcdmain: etcd Version: 3.4.4
2020-05-09 19:10:42.606862 I | etcdmain: Git SHA: Not provided (use ./build instead of go build)
2020-05-09 19:10:42.606872 I | etcdmain: Go Version: go1.13.8
2020-05-09 19:10:42.606877 I | etcdmain: Go OS/Arch: darwin/amd64
2020-05-09 19:10:42.606882 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2020-05-09 19:10:42.606891 N | etcdmain: failed to detect default host (default host not supported on darwin_amd64)
2020-05-09 19:10:42.606897 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2020-05-09 19:10:42.607019 N | etcdmain: the server is already initialized as member before, starting as etcd member...
[WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead

    可以通過命令查看啟動狀態

songguojundeMBP:~ songguojun$ lsof -i:2380
COMMAND  PID       USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
firefox  471 songguojun   84u  IPv4 0xa91ef03152373cdb      0t0  TCP localhost:62070->localhost:2380 (ESTABLISHED)   
etcd    1428 songguojun    7u  IPv4 0xa91ef0314fb65973      0t0  TCP localhost:2380 (LISTEN)

   也可以使用brew管理命令啟動:brew services run etcd

   使用brew services list查看狀態。

songguojundeMBP:~ songguojun$ brew services list
Name       Status  User       Plist
consul     stopped            
etcd       started songguojun /usr/local/opt/etcd/homebrew.mxcl.etcd.plist   已經啟動了
mysql@5.7  stopped            
nginx      stopped            
openresty  stopped            
rabbitmq   stopped            
supervisor stopped 

   etcd默認在2379端口監聽客戶端通信,默認在2380端口監聽節點之間的通信。

 

 

etcd集群

  etcd作為一個高可用分布式鍵值存儲系統,本身就是為集群而設計的。Raft算法在決策的時候需要多數節點的投票,所以etcd部署集群的節點一般推薦奇數個。

 

 

參考資料

  https://www.kubernetes.org.cn/6226.html

 


免責聲明!

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



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