Etcd 簡介
etcd 是一個高可用的鍵值存儲系統(tǒng),主要用于共享配置和服務發(fā)現(xiàn)。etcd是由CoreOS開發(fā)并維護的,靈感來自于 ZooKeeper 和 Doozer芒帕,它使用Go語言編寫,并通過Raft一致性算法處理日志復制以保證強一致性丰介。Raft是一個來自Stanford的新的一致性算法背蟆,適用于分布式系統(tǒng)的日志復制,Raft通過選舉的方式來實現(xiàn)一致性哮幢,在Raft中带膀,任何一個節(jié)點都可能成為Leader。Google的容器集群管理系統(tǒng)Kubernetes橙垢、開源PaaS平臺Cloud Foundry和CoreOS的Fleet都廣泛使用了etcd本砰。
etcd 集群的工作原理基于 raft 共識算法 (The Raft Consensus Algorithm)。
etcd 在 0.5.0 版本中重新實現(xiàn)了 raft 算法钢悲,而非像之前那樣依賴于第三方庫 go-raft 点额。
raft 共識算法的優(yōu)點在于可以在高效的解決分布式系統(tǒng)中各個節(jié)點日志內容一致性問題的同時,也使得集群具備一定的容錯能力莺琳。即使集群中出現(xiàn)部分節(jié)點故障还棱、網絡故障等問題,仍可保證其余大多數(shù)節(jié)點正確的步進惭等。甚至當更多的節(jié)點(一般來說超過集群節(jié)點總數(shù)的一半)出現(xiàn)故障而導致集群不可用時珍手,依然可以保證節(jié)點中的數(shù)據不會出現(xiàn)錯誤的結果。
1. Getting etcd
從 Release 頁面(https://github.com/coreos/etcd/releases/ )下載二進制辞做,或者拉最新 master 代碼進行編譯琳要。
$ git clone https://github.com/coreos/etcd.git
$ cd etcd
$ ./build
還有一種辦法,直接獲取一個 vendor 編譯好的 etcd秤茅,如下:
$ go get github.com/coreos/etcd/cmd/etcd
2. Starting etcd
直接執(zhí)行
$ etcd
或者指定 data-dir
$ etcd -data-dir=/var/edata
更加詳細的配置選項稚补,請查看:https://coreos.com/etcd/docs/latest/op-guide/configuration.html
一個簡單例子 human readable:
# This config is meant to be consumed by the config transpiler, which will
# generate the corresponding Ignition config. Do not pass this config directly
# to instances of Container Linux.
etcd:
name: my-etcd-1
listen_client_urls: https://10.240.0.1:2379
advertise_client_urls: https://10.240.0.1:2379
listen_peer_urls: https://10.240.0.1:2380
initial_advertise_peer_urls: https://10.240.0.1:2380
initial_cluster: my-1=https://10.240.0.1:2380,my-2=https://10.240.0.2:2380,my-3=https://10.240.0.3:2380
initial_cluster_token: my-etcd-token
initial_cluster_state: new
參考:
https://coreos.com/etcd/docs/latest/getting-started-with-etcd.html
https://docs.portworx.com/run-etcd.html
3. etcd cluster
etcd --name infra0 --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 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
參考:
https://coreos.com/etcd/docs/latest/v2/docker_guide.html#running-etcd-in-standalone-mode
https://coreos.com/etcd/docs/latest/op-guide/clustering.html
4. etcdctl 查看幫助
上述啟動的 etcd 是服務器,官方還提供了一個 commandline 客戶端框喳,即 etcdctl课幕,所有的命令都通過這個客戶端去請求。
執(zhí)行下列命令來查看幫助信息:
$ ETCDCTL_API=3 etcdctl help
想要查看某個具體 command 的幫助五垮,比如查看 get 命令的幫助:
$ ETCDCTL_API=3 etcdctl help get
NAME:
get - Gets the key or a range of keys
USAGE:
etcdctl get [options] <key> [range_end]
OPTIONS:
--consistency="l" Linearizable(l) or Serializable(s)
--from-key[=false] Get keys that are greater than or equal to the given key using byte compare
--keys-only[=false] Get only the keys
--limit=0 Maximum number of results
--order="" Order of results; ASCEND or DESCEND (ASCEND by default)
--prefix[=false] Get keys with matching prefix
--print-value-only[=false] Only write values when using the "simple" output format
--rev=0 Specify the kv revision
--sort-by="" Sort target; CREATE, KEY, MODIFY, VALUE, or VERSION
GLOBAL OPTIONS:
--cacert="" verify certificates of TLS-enabled secure servers using this CA bundle
--cert="" identify secure client using this TLS certificate file
--command-timeout=5s timeout for short running command (excluding dial timeout)
--debug[=false] enable client-side debug logging
--dial-timeout=2s dial timeout for client connections
--endpoints=[127.0.0.1:2379] gRPC endpoints
--hex[=false] print byte strings as hex encoded strings
--insecure-skip-tls-verify[=false] skip server certificate verification
--insecure-transport[=true] disable transport security for client connections
--key="" identify secure client using this TLS key file
--user="" username[:password] for authentication (prompt if password is not supplied)
-w, --write-out="simple" set the output format (fields, json, protobuf, simple, table)
5. Command examples
假設已有如下 keys
foo = bar
foo1 = bar1
foo2 = bar2
foo3 = bar3
默認 etcdctl 會key 和 value 都打印乍惊,想要只打印 value 的值:
$ etcdctl get foo --print-value-only
bar
獲取所有 prefix 為 foo 的 key 所對應的 value
$ etcdctl get --prefix foo
foo
bar
foo1
bar1
foo2
bar2
foo3
bar3
更多命令:
https://coreos.com/etcd/docs/latest/dev-guide/interacting_v3.html