etcd工作原理和部署指南

etcd-logo.png

? etcd是由CoreOS團隊發(fā)的一個分布式一致性的KV存儲系統(tǒng)鼎文,可用于服務注冊發(fā)現(xiàn)和共享配置膳凝,隨著CoreOS和Kubernetes等項目在開源社區(qū)日益火熱,它們項目中都用到的etcd組件作為一個高可用強一致性的服務發(fā)現(xiàn)存儲倉庫震束,漸漸為開發(fā)人員所關注对雪。在云計算時代河狐,如何讓服務快速透明地接入到計算集群中,如何讓共享配置信息快速被集群中的所有機器發(fā)現(xiàn),更為重要的是甚牲,如何構建這樣一套高可用义郑、安全蝶柿、易于部署以及響應快速的服務集群丈钙,已經(jīng)成為了迫切需要解決的問題。etcd為解決這類問題帶來了福音交汤,本文將從etcd的應用場景開始雏赦,深入解讀etcd的實現(xiàn)方式,以供開發(fā)者們更為充分地享用etcd所帶來的便利芙扎。

特點:

使用場景

  • 配置管理
  • 服務注冊于發(fā)現(xiàn)
  • 選主
  • 應用調(diào)度
  • 分布式隊列
  • 分布式鎖

原理:

? etcd推薦使用奇數(shù)作為集群節(jié)點個數(shù)星岗。因為奇數(shù)個節(jié)點和其配對的偶數(shù)個節(jié)點相比,容錯能力相同戒洼,卻可以少一個節(jié)點俏橘。綜合考慮性能和容錯能力,etcd官方文檔推薦的etcd集群大小是3,5,7圈浇。由于etcd使用是Raft算法寥掐,每次寫入數(shù)據(jù)需要有2N+1個節(jié)點同意可以寫入數(shù)據(jù),所以部分節(jié)點由于網(wǎng)絡或者其他不可靠因素延遲收到數(shù)據(jù)更新磷蜀,但是最終數(shù)據(jù)會保持一致召耘,高度可靠。隨著節(jié)點數(shù)目的增加褐隆,每次的寫入延遲會相應的線性遞增污它,除了節(jié)點數(shù)量會影響寫入數(shù)據(jù)的延遲,如果節(jié)點跟接節(jié)點之間的網(wǎng)絡延遲庶弃,也會導致數(shù)據(jù)的延遲寫入衫贬。
結(jié)論:
? 1.節(jié)點數(shù)并非越多越好,過多的節(jié)點將會導致數(shù)據(jù)延遲寫入歇攻。
? 2.節(jié)點跟節(jié)點之間的跨機房固惯,專線之間網(wǎng)絡延遲,也將會導致數(shù)據(jù)延遲寫入掉伏。
? 3.受網(wǎng)絡IO和磁盤IO的延遲
? 4.為了提高吞吐量缝呕,etcd通常將多個請求一次批量處理并提交Raft,
? 5.增加節(jié)點斧散,讀性能會提升供常,寫性能會下降,減少節(jié)點鸡捐,寫性能會提升栈暇。

部署

單機節(jié)點(CentOS 7)

$ yum install etcd -y 
修改配置文件,通過yum 安裝的etcd箍镜,以下是etcd的配置文件:

$ vim /etc/etcd/etcd.conf 
#[Member]
#ETC D_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.109:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="default"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.109:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[Security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_AUTO_TLS="false"
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#ETCD_PEER_AUTO_TLS="false"
#
#[Logging]
#ETCD_DEBUG="false"
#ETCD_LOG_PACKAGE_LEVELS=""
#ETCD_LOG_OUTPUT="default"
#
#[Unsafe]
#ETCD_FORCE_NEW_CLUSTER="false"
#
#[Version]
#ETCD_VERSION="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"
#
#[Profiling]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"

參數(shù)說明:

  • –data-dir:指定節(jié)點的數(shù)據(jù)存儲目錄源祈,若不指定煎源,則默認是當前目錄。這些數(shù)據(jù)包括節(jié)點ID香缺,集群ID手销,集群初始化配置,Snapshot文件图张,若未指 定–wal-dir锋拖,還會存儲WAL文件
  • –wal-dir:指定節(jié)點的was文件存儲目錄,若指定了該參數(shù)祸轮,wal文件會和其他數(shù)據(jù)文件分開存儲
  • –name:節(jié)點名稱
  • –initial-advertise-peer-urls:告知集群其他節(jié)點的URL兽埃,tcp2380端口用于集群通信
  • –listen-peer-urls:監(jiān)聽URL,用于與其他節(jié)點通訊
  • –advertise-client-urls:告知客戶端的URL, 也就是服務的URL适袜,tcp2379端口用于監(jiān)聽客戶端請求
  • –initial-cluster-token:集群的ID
  • –initial-cluster:集群中所有節(jié)點
  • –initial-cluster-state:集群狀態(tài)柄错,new為新創(chuàng)建集群,existing為已存在的集群
  • etcd 默認存儲大小限制是 2GB, 可以通過 --quota-backend-bytes 標記配置苦酱,最大支持 8GB.

啟動etcd服務

$ systemctl start etcd.service
$ systemctl status etcd.service
● etcd.service - Etcd Server
   Loaded: loaded (/usr/lib/systemd/system/etcd.service; disabled; vendor preset: disabled)
   Active: active (running) since 六 2018-06-02 22:17:34 CST; 9s ago
 Main PID: 2876 (etcd)
   CGroup: /system.slice/etcd.service
           └─2876 /usr/bin/etcd --name=default --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://192.168.1.109:2379

多節(jié)點部署

自定義的 etcd discovery 服務

這種方式就是利用一個已有的 etcd 集群來提供 discovery 服務售貌,從而搭建一個新的 etcd 集群。

假設已有的 etcd 集群的一個訪問地址是:myetcd.local躏啰,那么我們首先需要在已有 etcd 中創(chuàng)建一個特殊的 key趁矾,方法如下:

$ curl -X PUT https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3

其中 value=3 表示本集群的大小,即: 有多少集群節(jié)點给僵。而 6c007a14875d53d9bf0ef5a6fc0257c817f0fb83 就是用來做 discovery 的 token毫捣。

接下來你在 3 個節(jié)點上分別啟動 etcd 程序,并加上剛剛的 token帝际。
加 token 的方式同樣也有 命令行參數(shù)環(huán)境變量 兩種蔓同。

命令行參數(shù):

-discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

環(huán)境變量

ETCD_DISCOVERY=https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

命令行參數(shù)啟動方式為例:

$ etcd -name etcd0 -initial-advertise-peer-urls http://10.0.1.10:2380 \
  -listen-peer-urls http://10.0.1.10:2380 \
  -listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.10:2379 \
  -discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd -name etcd1 -initial-advertise-peer-urls http://10.0.1.11:2380 \
  -listen-peer-urls http://10.0.1.11:2380 \
  -listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.11:2379 \
  -discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd -name etcd2 -initial-advertise-peer-urls http://10.0.1.12:2380 \
  -listen-peer-urls http://10.0.1.12:2380 \
  -listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
  -advertise-client-urls http://10.0.1.12:2379 \
  -discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83

測試

可以使用etcd附帶的基準 CLI工具完成基準測試etcd性能。

對于一些基準性能數(shù)字蹲诀,我們考慮具有以下硬件配置的三個成員的etcd集群:

  • Google云計算引擎
  • 3臺8個vCPU + 16GB內(nèi)存+ 50GB固態(tài)硬盤
  • 1臺機器(客戶端)斑粱,16個vCPU + 30GB內(nèi)存+ 50GB SSD
  • Ubuntu 17.04
  • etcd 3.2.0,去1.8.3

有了這個配置脯爪,etcd可以大致寫出:

密鑰數(shù)量 密鑰大性虮薄(字節(jié)) 值大小以字節(jié)為單位 連接數(shù) 客戶數(shù)量 目標ETCD服務器 平均寫入QPS 每個請求的平均延遲 平均服務器RSS
8 256 1 1 只有領導者 583 1.6毫秒 48 MB
100000 8 256 100 1000 只有領導者 44341 22毫秒 124MB
100000 8 256 100 1000 所有成員 50104 20ms的 126MB

示例命令是:

# write to leader
benchmark --endpoints=${HOST_1} --target-leader --conns=1 --clients=1 \
    put --key-size=8 --sequential-keys --total=10000 --val-size=256
benchmark --endpoints=${HOST_1} --target-leader  --conns=100 --clients=1000 \
    put --key-size=8 --sequential-keys --total=100000 --val-size=256

# write to all members
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=100 --clients=1000 \
    put --key-size=8 --sequential-keys --total=100000 --val-size=256

可線性讀取請求通過集群成員的法定人數(shù)達成一致以獲取最新數(shù)據(jù)『勐可序列化的讀取請求比線性讀取要便宜尚揣,因為它們由任何單個etcd成員提供,而不是成員法定人數(shù)掖举,以換取可能的陳舊數(shù)據(jù)快骗。etcd可以閱讀:

請求數(shù) 密鑰大小(字節(jié)) 值大小以字節(jié)為單位 連接數(shù) 客戶數(shù)量 一致性 平均讀取QPS 每個請求的平均延遲
8 256 1 1 線性化 1,353 為0.7ms
8 256 1 1 序列化 2909 0.3ms的
100000 8 256 100 1000 線性化 141578 5.5ms
100000 8 256 100 1000 序列化 185758 時間為2.2ms

示例命令是:

# Single connection read requests
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=1 --clients=1 \
    range YOUR_KEY --consistency=l --total=10000
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=1 --clients=1 \
    range YOUR_KEY --consistency=s --total=10000

# Many concurrent read requests
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=100 --clients=1000 \
    range YOUR_KEY --consistency=l --total=100000
benchmark --endpoints=${HOST_1},${HOST_2},${HOST_3} --conns=100 --clients=1000 \
    range YOUR_KEY --consistency=s --total=100000

我們鼓勵在新環(huán)境中首次安裝etcd集群時運行基準測試,以確保集群達到足夠的性能; 群集延遲和吞吐量可能會對較小的環(huán)境差異敏感方篮。

以上測試部分翻譯自官方文檔(https://coreos.com/etcd/docs/latest/op-guide/performance.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藕溅,一起剝皮案震驚了整個濱河市匕得,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜈垮,老刑警劉巖耗跛,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裕照,死亡現(xiàn)場離奇詭異攒发,居然都是意外死亡,警方通過查閱死者的電腦和手機晋南,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門惠猿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人负间,你說我怎么就攤上這事偶妖。” “怎么了政溃?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵趾访,是天一觀的道長。 經(jīng)常有香客問我董虱,道長扼鞋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任愤诱,我火速辦了婚禮,結(jié)果婚禮上淫半,老公的妹妹穿的比我還像新娘溃槐。我一直安慰自己,他們只是感情好科吭,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲜棠,像睡著了一般肌厨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豁陆,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天柑爸,我揣著相機與錄音,去河邊找鬼盒音。 笑死表鳍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的祥诽。 我是一名探鬼主播譬圣,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雄坪!你這毒婦竟也來了厘熟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤维哈,失蹤者是張志新(化名)和其女友劉穎绳姨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阔挠,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡飘庄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了购撼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跪削。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖份招,靈堂內(nèi)的尸體忽然破棺而出切揭,到底是詐尸還是另有隱情,我是刑警寧澤锁摔,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布廓旬,位于F島的核電站,受9級特大地震影響谐腰,放射性物質(zhì)發(fā)生泄漏孕豹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一十气、第九天 我趴在偏房一處隱蔽的房頂上張望励背。 院中可真熱鬧,春花似錦砸西、人聲如沸叶眉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衅疙。三九已至莲趣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饱溢,已是汗流浹背喧伞。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绩郎,地道東北人潘鲫。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像肋杖,于是被迫代替她去往敵國和親溉仑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • from http://www.infoq.com/cn/articles/etcd-interpretation...
    小樹苗苗閱讀 13,941評論 3 38
  • 尋找一種易于理解的一致性算法(擴展版) 摘要 Raft 是一種為了管理復制日志的一致性算法兽愤。它提供了和 Paxos...
    yflau閱讀 979評論 0 1
  • 提到etcd很多人第一反應就是一個鍵值存儲倉庫彼念。不過etcd官方文檔的定義卻是這樣的: A highly-avai...
    神奇的考拉閱讀 6,279評論 1 19
  • 尋找一種易于理解的一致性算法(擴展版) 摘要 Raft 是一種為了管理復制日志的一致性算法。它提供了和 Paxos...
    枝葉君閱讀 2,647評論 0 15
  • 花都是澆死的浅萧,這話聽起來有點絕對,但多數(shù)花農(nóng)都承認這個事實哲思。 因為養(yǎng)花中離不開澆水洼畅,但澆水一定有技巧,一要...
    平平庸庸閱讀 224評論 0 1