一、Etcd簡介
一個由coreos 開發的分佈式服務系統,內部採用 raft 協議作爲一致性算法。作爲服務發現系統,有以下的特點:
- 簡單:安裝配置簡單,而且提供了 HTTP API 進行交互,使用也很簡單
- 安全:支持 SSL 證書驗證
- 快速:根據官方提供的 benchmark 數據,單實例支持每秒 2k+ 讀操作
- 可靠:採用 raft 算法,實現分佈式系統數據的可用性和一致性
在這篇文章編寫的時候,etcd 已經發布了 3.3.13
版本,被被用在 CoreOS、kubernetes、Cloud Foundry 等項目中。
etcd 目前默認使用 2379
端口提供 HTTP API 服務,2380
端口和 peer 通信(這兩個端口已經被 IANA 官方預留給 etcd)。在之前的版本中,可能會分別使用 4001
和 7001
,在使用的過程中需要注意這個區別。
雖然 etcd 也支持單點部署,但是在生產環境中推薦集羣方式部署。由於etcd內部使用投票機制,一般 etcd 節點數會選擇 3、5、7等奇數。etcd 會保證所有的節點都會保存數據,並保證數據的一致性和正確性。
二、Mac下安裝Etcd
使用brew工具進行安裝。
2.1 查看候選安裝包,執行命令brew search etcd
$ brew search etcd
執行結果如下所示:
==> Formulae
etcd ✔ netcdf
==> Casks
qlnetcdf
2.2 安裝etcd,執行命令brew install etcd
$ brew install etcd
執行結果如下所示:
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 5 taps (openresty/brew, homebrew/cask-versions, homebrew/core, homebrew/cask and homebrew/services).
==> New Formulae
allureofthestars contentful-cli dust k3d newman spirv-tools
anime-downloader cpp-gsl erlang@21 k6 openkim-models swig@3
antibody csvq gatsby-cli kim-api otf2 termshark
appstream-glib cubelib gcc@8 ktlint pipx [email protected]
atlantis cxxopts heatshrink leela-zero pprint terraformer
boringtun cypher-shell helmsman libevhtp procs virgil
catch2 dbmate hey libzt proteinortho yapf
cfn-lint deno include-what-you-use lizard [email protected]
cjson devspace ipopt [email protected] scdoc
clojure-lsp docker-machine-driver-vmware itk molten-vk scws
clzip drone-cli janet netlify-cli spice-gtk
==> Updated Formulae
argon2 ✔ eccodes imageoptim-cli minizinc rpm
boost ✔ efl imake mk-configure rrdtool
cmake ✔ eiffelstudio imapsync mkl-dnn rsyslog
composer ✔ elasticsearch influxdb mksh rt-audio
dep ✔ [email protected] inlets mkvtoolnix rtags
freetds ✔ elixir interactive-rebase-tool mlt rtmidi
gettext ✔ embree ios-sim mmark rtv
git ✔ emscripten ios-webkit-debug-proxy mmseqs2 ruby-build
glib ✔ encfs iperf3 molecule rust
go ✔ enchant ipfs monero rustup-init
imagemagick ✔ enigma ipython monetdb s-search
kafka ✔ enscript ircii mongo-c-driver salt
kubernetes-cli ✔ envconsul irssi mongoose sassc
libevent ✔ epubcheck isl mono-libgdiplus saxon
libidn2 ✔ erlang ispc mosquitto sbcl
libpq ✔ erlang@19 istioctl mp3splt scala
mysql ✔ erlang@20 itstool mpck scalapack
nginx ✔ eslint ivykis mpd scalariform
node ✔ etcd jadx mpdscribble sccache
openresty/brew/openresty ✔ ethereum jailkit mpich sceptre
openresty/brew/openresty-openssl ✔ etl jbig2dec mplayer schismtracker
openssl ✔ ettercap jboss-forge mpop scipy
[email protected] ✔ evince jdnssec-tools mps-youtube scmpuff
[email protected] ✔ exiftool jdupes mruby scrcpy
pyenv ✔ exiv2 jena msgpack scrollkeeper
readline ✔ expat jenkins msitools sd
redis ✔ exploitdb jenkins-job-builder msktutil sdb
scons ✔ eye-d3 jenkins-lts msmtp sdcc
source-highlight ✔ f3 jfrog-cli-go mtools sdcv
tmux ✔ faas-cli jhiccup mu sdl2_ttf
wget ✔ fastme jhipster mujs sec
abyss faudio jigdo mupdf serd
ack fceux jmxterm mupdf-tools serf
acpica ffmpeg jnettop mutt serve
agda ffsend john mvnvm serverless
aide fftw joplin [email protected] sfcgal
akamai fibjs jp2a mysqltuner shadowsocks-libev
akka file-formula jruby n shared-mime-info
aliyun-cli fio jsdoc3 nagios shc
allure firebase-cli json-fortran nano shfmt
alot flatbuffers json-glib nanopb-generator ship
amazon-ecs-cli flex json_spirit nativefier shogun
ammonite-repl flintrock jsonnet nats-streaming-server shpotify
amqp-cpp flow jsonschema2pojo nave shyaml
amtk fluid-synth juju ncdc silk
angle-grinder fluxctl jump ncmpc simple-scan
angular-cli fn just ncmpcpp simple-tiles
anjuta fobis jvgrep nco sipp
annie folly kahip ndpi sipsak
ansible fontforge kallisto needle siril
ansifilter fonttools kapacitor neo4j sk
ant fourstore khal neomutt skaffold
[email protected] fq khard neovim skktools
anyenv freeciv kibana netcdf skopeo
apache-archiva freedink kitchen-sync netdata sleepwatcher
apache-arrow-glib freeradius-server klavaro nethack sleuthkit
apache-drill frpc knot netpbm smali
apache-geode frps knot-resolver newsboat smimesign
apache-spark frugal kobalt newt sn0int
app-engine-python fs-uae kops nexus snownews
apt-dater fselect kore nghttp2 socat
aqbanking fuse-emulator kotlin nifi-registry sofia-sip
arangodb fuseki krb5 nim solr
aravis futhark kubecfg nlopt [email protected]
argyll-cms gabedit kubeless nnn sonobuoy
armadillo galen kubeprod node-build sops
arpack gammu kubernetes-helm node@10 source-to-image
artifactory gandi.cli kubernetes-service-catalog-client node@8 sourcekitten
asciidoctor gauge kustomize node_exporter sourcery
asciidoctorj gawk kyoto-cabinet nodenv spades
asdf gbdfed kyoto-tycoon nomad sparse
ask-cli gcab lablgtk nordugrid-arc sphinx-doc
aspectj gcc lammps noti spice-protocol
astrometry-net gcc@5 landscaper notmuch spin
atari800 gcc@6 lapack nss spirv-cross
atk gcc@7 lasi ntfs-3g sqlcipher
atkmm gcsfuse lasso ntl sqlmap
atlassian-cli gdal laszip numpy sratom
atomist-cli gdb latex2html nwchem srt
audacious gdcm latexml nzbget sshfs
auditbeat gdk-pixbuf lazygit ocaml-num sshtrix
augeas gdl lbdb ocrmypdf sslh
autorest gdmap lcdf-typetools octave sslscan
avra gearsystem ldapvi odpi sslsplit
avro-c gecode ldc ola stellar-core
avro-cpp geeqie ledger ompl step
avro-tools gegl lego oniguruma stk
awf gel lensfun opa stout
aws-iam-authenticator genact leveldb open-mpi streamripper
aws-okta gengetopt lf openapi-generator strongswan
aws-sdk-cpp genometools lgogdownloader openblas stunnel
awscli geoipupdate libb2 opencascade subversion
axel geos libbitcoin opencc suil
azure-cli gerbv libbitcoin-blockchain opencoarrays suite-sparse
azure-storage-cpp getdns libbitcoin-client openconnect sundials
b2-tools gexiv2 libbitcoin-database opencv superlu
babel ghc libbitcoin-explorer opencv@3 supervisor
babl ghex libbitcoin-network openfortivpn swagger-codegen
badtouch ghostscript libbitcoin-node openh264 swagger-codegen@2
balena-cli ghq libbitcoin-protocol openimageio swi-prolog
ballerina ghr libbitcoin-server openresty/brew/openresty-debug swift-protobuf
baobab gibo libbluray openshift-cli swiftformat
bartycrouch gifsicle libcddb openslide swiftlint
basex git-cinnabar libcdio opensubdiv swig
bash git-cola libcdr openvdb swimat
bat git-flow-avh libchamplain operator-sdk sylpheed
bazel git-fresh libcoap orbit sync_gateway
beanstalkd git-ftp libcroco orc-tools syncthing
bear git-lfs libdap osc synfig
bedops git-quick-stats libdazzle oscats sysbench
bee git-recent libdc1394 osm-gps-map talloc
bettercap git-remote-hg libebml osm2pgrouting taskell
bgpstream git-review libedit osmosis tass64
binaryen git-secret liberasurecode ospray tbb
bind git-town libestr osquery tcpreplay
binwalk gitfs libetonyek osrm-backend tcsh
bison gitg libev owfs tdlib
bit gitlab-runner libfabric p11-kit teleconsole
bitcoin gitleaks libfixbuf packer telegraf
bitlbee gitless libgaiagraphics packmol teleport
bitrise gjs libgda paket template-glib
bitwarden-cli gkrellm libgdata pam-u2f tepl
blast glade libgee pandoc terraform
bluepill glances libgeotiff pandoc-crossref terraforming
bookloupe glib-networking libgit2 pango terragrunt
boost-bcp glibmm libgit2-glib pangomm terrahub
boost-build glooctl libglade paperkey testssl
boost-mpi glslang libglademm paps texmath
boost-python glyr libgnomecanvas parallel tfenv
boost-python3 gmic libgnomecanvasmm parallelstl thefuck
botan gmime libgsf pari tiger-vnc
bowtie2 gmsh libgtop passenger tika
braid gmt libgweather patchelf tile38
buildifier gnome-autoar libhttpseverywhere payara tippecanoe
buildkit gnome-builder libical pcapplusplus tkdiff
buku gnome-latex libiconv pcb tmux-xpanes
bundletool gnome-recipes libidl pcb2gcode tmuxinator-completion
bwfmetaedit gnome-themes-standard libimagequant pcl tokei
byobu gnu-getopt libinfinity pdal tomcat
byteman gnu-indent libiptcdata pdf2htmlex tomcat@7
bzt gnu-typist libjson-rpc-cpp pdf2svg tomcat@8
cadaver gnu-units libjwt pdfgrep tomee-plus
caffe gnumeric liblas pdfpc tomee-webprofile
cairo gnunet liblinear pdftoipe topgrade
calcurse gnupg liblqr pdns tor
calicoctl gnuplot libltc pdnsrec torsocks
camlp4 gnuradio liblunar peg-markdown tox
cargo-completion gnutls libmagic percona-xtrabackup traefik
carla goaccess libmatroska perl trafficserver
cataclysm gobby libmp3splt peru translate-shell
catimg gobject-introspection libmpd petsc travis
cattle gobuster libmpdclient petsc-complex treefrog
cc65 godep libmtp pgbadger trezor-agent
ccache goffice libmwaw pgcli triton
ccextractor golang-migrate libmypaint pgformatter ttyd
ccls gollum libnfs pgplot tundra
center-im golo libnice pgrouting txr
certbot gom libnids phoronix-test-suite typescript
cf4ocl gomplate libnotify php u-boot-tools
cfengine goocanvas libntlm php-cs-fixer ucloud
cfr-decompiler goofys libodfgen [email protected] ufraw
cgal google-authenticator-libpam libofx phpmyadmin uhd
cgit google-benchmark libomp phpstan ultralist
cglm googler libopenmpt phpunit unbound
cgrep gopass libosinfo physfs uncrustify
chafa gor libpeas picard-tools ungit
chakra goreleaser libphonenumber picat unp64
chamber gosu libpqxx pick unrar
charm gpa libprotoident pidgin unzip
checkbashisms gpac libpsl pijul upscaledb
checkstyle gpgme libpst pilosa urdfdom_headers
chicken gpredict libpulsar pinboard-notes-backup userspace-rcu
chrome-export gpsbabel libqalculate pinfo utf8proc
chronograf gpsim libquicktime pioneers util-linux
circleci gqview librasterlite planck utimer
citus gr-osmosdr librdkafka plantuml uwsgi
clang-format gradio libre platformio v8
cloc gradle librealsense plplot vagrant-completion
clojure grafana librem plzip vala
clozure-cl grails libressl pmd valabind
clutter grakn librest pms vamp-plugin-sdk
clutter-gst graph-tool librsvg pngquant varnish
clutter-gtk graphviz libsass pod2man vault
cmark-gfm grib-api libsecret ponyc vault-cli
cmocka gromacs libshout poppler vcdimager
cockroach groovy libsigc++ postgresql vegeta
cocoapods groovysdk libsmf postgresql@10 velero
cogl grpc libsodium [email protected] verilator
cointop grpcurl libsoup [email protected] vert.x
collectd grsync libspectre [email protected] vfuse
commandbox gsmartcontrol libspectrum postgrest vice
conan gspell libssh2 pqiv viewvc
conserver gssdp libsvm pre-commit vim
consul gst-editing-services libswiften prefixsuffix [email protected]
convox gst-libav libtorrent-rasterbar presto vips
coq gst-plugins-bad libtrace prettier visp
corectl gst-plugins-base libuninameslist profanity volt
corsixth gst-plugins-good libuv proguard vowpal-wabbit
cp2k gst-plugins-ugly libvirt proj vte
cpansearch gst-python libvirt-glib prometheus vte3
cppad gst-rtsp-server libwpd protobuf-c vtk
cppcheck gst-validate libwpg protoc-gen-go vulkan-headers
cpprestsdk gstreamer libxc prototool vultr
cql gstreamermm libxlsxwriter pspg wabt
cracklib gtk+ libxml++ psql2csv wandio
crc32c gtk+3 libxml++3 pstoedit wartremover
cromwell gtk-chtheme libxo pulumi watchexec
crosstool-ng gtk-doc libzdb pumba wdfs
crowdin gtk-gnutella lighttpd pure-ftpd wdiff
cryfs gtk-mac-integration lilv purescript webdis
cryptol gtk-vnc linkerd pushpin webpack
crystal gtkdatabox lldpd py2cairo websocat
crystal-icr gtkextra llvm py3cairo websocketd
csound gtkglext lmod pybind11 webtorrent-cli
cucumber-cpp gtkmm logstash pygobject weechat
curl gtkmm3 logtalk pygobject3 wesnoth
curl-openssl gtksourceview loudmouth pygtk whois
curlftpfs gtksourceview3 lsd pygtkglext widelands
cutter gtksourceview4 luarocks pygtksourceview wildfly-as
cython gtksourceviewmm lv2 pypy wimlib
dartsim gtksourceviewmm3 lwtools pypy3 wine
datetime-fortran gtkspell3 lxc pyside winetricks
dav1d gtranslator lynis qalculate-gtk wiredtiger
davix gts lysp qbs wireguard-go
dbus-glib gucharmap lz4 qca wireguard-tools
dc3dd guile lzip qd wiremock-standalone
dcd gupnp mackup qemu wireshark
dcm2niix gupnp-av macvim qmmp wla-dx
dehydrated gupnp-tools mafft qpdf wmctrl
dependency-check gwenhywfar magic-wormhole qrupdate wp-cli
desktop-file-utils gwyddion mailutils qt wp-cli-completion
dfc gx mame quantlib wtf
dfmt gxml mariadb quazip wv
dhall h3 mariadb-connector-c quicktype wxmaxima
dhall-json hadolint [email protected] quilt wxpython
diff-pdf hana [email protected] qwt xboard
diff-so-fancy hapi-fhir-cli mat2 r xcodegen
diffoscope harfbuzz math-comp rabbitmq xctool
digdag haskell-stack maxima radare2 xmake
dita-ot hbase maxwell rancid xmrig
django-completion hdf5 mbedtls range-v3 xonsh
dmd [email protected] mcabber raylib xpdf
dnscontrol hebcal mdbook rbspy xplanet
dnscrypt-proxy heimdal mdbtools rclone xsane
dnstwist helmfile mdds rdesktop xsimd
docfx herrie mdk rdup yaf
docker hexyl media-info re2 yamllint
docker-completion hfstospell mednafen reattach-to-user-namespace yara
docker-compose highlight megatools rebar3 yarn
docker-compose-completion hledger memcached recode yash
docker-credential-helper hlint mercurial recon-ng yelp-tools
docker-machine-driver-xhyve homeassistant-cli mesa recoverjpeg ykman
doctl homebank meson redo yle-dl
dopewars http-parser mesos redshift you-get
double-conversion httpd metaproxy remind youtube-dl
dovecot httping metricbeat reposurgeon yq
druid hub mgba reprepro yubico-piv-tool
dscanner hugo micronaut restic z3
dspdfviewer hunspell micropython restview zenity
dub hydra midgard2 rhino zim
duc hyperfine midnight-commander riemann zimg
duck hyperkit mighttpd2 riff zlog
dungeon hypre mikutter rke zola
duo_unix i2p mill rmlint zsh-autosuggestions
dwdiff i2pd minbif rocksdb zshdb
dynare iamy mingw-w64 roll
e2fsprogs ibex minimal-racket rom-tools
easy-tag icecream minio root
easyengine imagemagick@6 minio-mc roswell
==> Renamed Formulae
gnatsd -> nats-server
==> Deleted Formulae
compose2kube erlang@18 gtk-murrine-engine js-test-driver node@6 [email protected] tomcat@6 varnish@4 xmoto
dsd gtk-engines [email protected] minisat rlvm [email protected] typesafe-activator whirr
==> Downloading https://homebrew.bintray.com/bottles/etcd-3.3.13.mojave.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/17/1767fd0f8122f4d4b29b19fdec99bbf6c434afa900a616149b07540d8991cd9d?__gda__=exp=1562122526~hmac=31e01a89b759090f188af8482af90ed9fa14b2940bb0651b1ac8b7
######################################################################## 100.0%
==> Pouring etcd-3.3.13.mojave.bottle.tar.gz
==> Caveats
To have launchd start etcd now and restart at login:
brew services start etcd
Or, if you don't want/need a background service you can just run:
etcd
==> Summary
🍺 /usr/local/Cellar/etcd/3.3.13: 9 files, 49MB
==> `brew cleanup` has not been run in 30 days, running now...
Removing: /Users/jack/Library/Logs/Homebrew/automake... (64B)
如果需要開機啓動etcd,那麼可以執行命令brew services start etcd。
如果不需要開機啓動,只是簡單使用,那麼直接執行命令etcd:
$ etcd
執行結果如下所示:
2019-07-03 17:00:50.443272 I | etcdmain: etcd Version: 3.3.13
2019-07-03 17:00:50.443414 I | etcdmain: Git SHA: GitNotFound
2019-07-03 17:00:50.443422 I | etcdmain: Go Version: go1.12.4
2019-07-03 17:00:50.443437 I | etcdmain: Go OS/Arch: darwin/amd64
2019-07-03 17:00:50.443447 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2019-07-03 17:00:50.443460 N | etcdmain: failed to detect default host (default host not supported on darwin_amd64)
2019-07-03 17:00:50.443474 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2019-07-03 17:00:50.445897 I | embed: listening for peers on http://localhost:2380
2019-07-03 17:00:50.446235 I | embed: listening for client requests on localhost:2379
2019-07-03 17:00:50.455582 I | etcdserver: name = default
2019-07-03 17:00:50.455622 I | etcdserver: data dir = default.etcd
2019-07-03 17:00:50.455640 I | etcdserver: member dir = default.etcd/member
2019-07-03 17:00:50.455664 I | etcdserver: heartbeat = 100ms
2019-07-03 17:00:50.455676 I | etcdserver: election = 1000ms
2019-07-03 17:00:50.455691 I | etcdserver: snapshot count = 100000
2019-07-03 17:00:50.455725 I | etcdserver: advertise client URLs = http://localhost:2379
2019-07-03 17:00:50.455793 I | etcdserver: initial advertise peer URLs = http://localhost:2380
2019-07-03 17:00:50.455853 I | etcdserver: initial cluster = default=http://localhost:2380
2019-07-03 17:00:50.549110 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32
2019-07-03 17:00:50.549334 I | raft: 8e9e05c52164694d became follower at term 0
2019-07-03 17:00:50.549380 I | raft: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2019-07-03 17:00:50.549393 I | raft: 8e9e05c52164694d became follower at term 1
2019-07-03 17:00:50.583394 W | auth: simple token is not cryptographically signed
2019-07-03 17:00:50.599580 I | etcdserver: starting server... [version: 3.3.13, cluster version: to_be_decided]
2019-07-03 17:00:50.599843 I | etcdserver: 8e9e05c52164694d as single-node; fast-forwarding 9 ticks (election ticks 10)
2019-07-03 17:00:50.599884 E | etcdserver: cannot monitor file descriptor usage (cannot get FDUsage on darwin)
2019-07-03 17:00:50.601119 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32
2019-07-03 17:00:51.354949 I | raft: 8e9e05c52164694d is starting a new election at term 1
2019-07-03 17:00:51.356658 I | raft: 8e9e05c52164694d became candidate at term 2
2019-07-03 17:00:51.356929 I | raft: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2
2019-07-03 17:00:51.356957 I | raft: 8e9e05c52164694d became leader at term 2
2019-07-03 17:00:51.356967 I | raft: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2
2019-07-03 17:00:51.357503 I | etcdserver: setting up the initial cluster version to 3.3
2019-07-03 17:00:51.362463 N | etcdserver/membership: set the initial cluster version to 3.3
2019-07-03 17:00:51.362787 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c32
2019-07-03 17:00:51.362879 I | embed: ready to serve client requests
2019-07-03 17:00:51.362938 I | etcdserver/api: enabled capabilities for version 3.3
2019-07-03 17:00:51.367846 N | embed: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!
從執行結果中可以看出:
- etcdserver: name = default, name表示節點名稱,默認爲default。
- etcdserver: data dir = default.etcd,data-dir保存日誌和快照的目錄,默認爲當前工作目錄“./default.etcd/”。
- etcdserver: initial advertise peer URLs = http://localhost:2380,通過http://localhost:2380,和集羣中其他節點通信。
- etcdserver: advertise client URLs = http://localhost:2379,通過http://localhost:2379,對外提供HTTP API服務,供客戶端交互。如果配置webui,就使用這個地址。
- etcdserver: heartbeat = 100ms leader發送心跳到followers的間隔時間。
- etcdserver: election = 1000ms 重新投票的超時時間,如果follow在該時間間隔沒有收到心跳包,會觸發重新投票,默認爲1000ms
- 集羣和每個節點都會生成一個 uuid。
- 啓動的時候,會運行 raft協議,選舉出 leader。
三、安裝etcd webui
在安裝etcd webui之前,請確保已安裝node工具。使用brew search node命令,可以查看候選安裝包;使用brew install node命令,即可安裝node工具。
使用git命令下載etcd webui代碼,並修改配置文件:
$ git clone https://github.com/henszey/etcd-browser.git
$ cd etcd-browser/
$ vim server.js
編輯server.js,修改內容如下:
var etcdHost = process.env.ETCD_HOST || '127.0.0.1'; // || '172.17.42.1';
var etcdPort = process.env.ETCD_PORT || 2379; // 4001
var serverPort = process.env.SERVER_PORT || 8000;
將etcd host修改爲本機,將etcd port修改爲2379(對於舊版etcd,修改爲4001)。
在安裝etcd webui之前,務必先啓動etcd。
啓動etcd webui,執行命令:
node server.js
執行結果如下所示:
proxy /api requests to etcd on 127.0.0.1:2379
etc-browser listening on port 8000
在瀏覽器中,直接訪問:http://127.0.0.1:8000/,響應頁面如下:
至此,mac下安裝etcd成功,配置etcd可視化頁面etcd webui成功。
參考資料:
https://www.infoq.cn/article/etcd-interpretation-application-scenario-implement-principle