Etcd 簡介
Etcd CoreOS 團隊於 2013 年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值( key-value )倉庫,遵循 Apache v2許可,基於 Go 語言實現,接觸過分布式系統的讀者應該知道,分布式系統中最基本的問題之一就是實現信息的共識,在此基礎上才能實現對服務配置信息的管理、服務的發現、更新、同步,等等 而要解決這些問題,往往需要利用一套能保證一致性的分布式數據庫系統,比如經典的 Apache ZooKeeper 項目 ,采用了 Paxos 算法來實現數據的強一致性。
Etcd 專門為集群環境設計,采用了更為簡潔的 Raft 共識算法,Raft 是一套通過選舉主節點來實現分布式系統一致性的算法,同樣可以實現數據強一致性,並支持集群節點狀態管理和服務自動發現等
Etcd 在進行設計的時候重點考慮了下面四個要素:
口簡單:支持 RESTfulAPI和gRPCAPI;
口安全: 基於 TLS 式實 安全連接訪
口快速: 支持每 一萬次 並發寫操作,超時控制在毫秒量級
口可靠: 支持分布式結構 基於 Raft 算法實現一致性
通常情況下,用戶使用 Etcd 可以在多個節點上啟動多個實例,並將它們添加為 個集群。同一個集群中的 Etcd 實例將會自動保持彼此信息的一致性,這意味着分布在各個節點上的應用也將獲取到一致的信息。
安裝和使用 Etcd
第一步:下載
https://github.com/etcd-io/etcd/releases
第二步:解壓
[root@ken2 ~]# tar xf etcd-v3.3.1-linux-amd64.tar.gz [root@ken2 ~]# cp etcd-v3.3.1-linux-amd64/etcd* /usr/local/bin
其中 etcd 是服務主文件, etcdctl 是提供給用戶的命令客戶端,其他都是文檔文件
使用etcd
下面將先以單節點 式為例講解 Etcd 支持的功能和操作
1.可通過如下命令查看 etcd 的版本信息:
[root@ken2 ~]# etcdctl --version etcdctl version: 3.3.1 API version: 2
2.接下來,直接執行 Etcd 命令,將啟動 個服務節點,監昕在本地的 2379 (客戶端端口)和 2380 (其他節點連 端口
顯示類似如下的信息:
[root@ken2 ~]# etcd [WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead 2019-09-10 14:24:00.393171 I | etcdmain: etcd Version: 3.4.0 2019-09-10 14:24:00.393235 I | etcdmain: Git SHA: 898bd1351 2019-09-10 14:24:00.393242 I | etcdmain: Go Version: go1.12.9 2019-09-10 14:24:00.393253 I | etcdmain: Go OS/Arch: linux/amd64 2019-09-10 14:24:00.393262 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4 2019-09-10 14:24:00.393273 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd [WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead 2019-09-10 14:24:00.492487 I | embed: name = default 2019-09-10 14:24:00.492507 I | embed: data dir = default.etcd 2019-09-10 14:24:00.492513 I | embed: member dir = default.etcd/member 2019-09-10 14:24:00.492518 I | embed: heartbeat = 100ms 2019-09-10 14:24:00.492522 I | embed: election = 1000ms 2019-09-10 14:24:00.492526 I | embed: snapshot count = 100000 2019-09-10 14:24:00.492540 I | embed: advertise client URLs = http://localhost:2379 2019-09-10 14:24:00.500959 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32 raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=() raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d became follower at term 0 raft2019/09/10 14:24:00 INFO: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0] raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d became follower at term 1 raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=(10276657743932975437) 2019-09-10 14:24:00.512116 W | auth: simple token is not cryptographically signed 2019-09-10 14:24:00.514290 I | etcdserver: starting server... [version: 3.4.0, cluster version: to_be_decided] 2019-09-10 14:24:00.516603 I | etcdserver: 8e9e05c52164694d as single-node; fast-forwarding 9 ticks (election ticks 10) raft2019/09/10 14:24:00 INFO: 8e9e05c52164694d switched to configuration voters=(10276657743932975437) 2019-09-10 14:24:00.524693 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32 2019-09-10 14:24:00.529322 I | embed: listening for peers on 127.0.0.1:2380 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d is starting a new election at term 1 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d became candidate at term 2 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2 raft2019/09/10 14:24:01 INFO: 8e9e05c52164694d became leader at term 2 raft2019/09/10 14:24:01 INFO: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2 2019-09-10 14:24: