介紹
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