etcd 单机安装部署
etcd 的安装有多种方式,这里我以 CentOS 7 为例,可以通过yum install etcd进行安装。然而通过系统工具安装的 etcd 版本比较滞后,如果需要安装最新版本的 etcd ,我们可以通过二进制包、源码编译以及 Docker 容器安装。
二进制安装
目前最新的 etcd API 版本为 v3.4,我们基于 3.4.4 版本进行实践,API 版本与最新版保持一致,在 CentOS 7 上面使用如下脚本进行安装:
ETCD_VER=v3.4.4
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GITHUB_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
下载可能比较慢,执行后,查看 etcd 版本的结果如下:
etcd Version: 3.4.4
Git SHA: e784ba73c
Go Version: go1.12.12
Go OS/Arch: linux/amd64
根据上面的执行结果可以看到,我们在 Linux 上安装成功,macOS 的二进制安装也类似,这里不重复演示了。关于 Windows 系统的安装比较简单,下载好安装包后,直接执行。其中 etcd.exe 是服务端,etcdctl.exe 是客户端,如下图所示:
源码安装
使用源码安装,首先你需要确保本地的 Go 语言环境。如未安装,请参考 https://golang.org/doc/install 安装 Go 语言环境。我们需要 Go 版本为 1.13+,来构建最新版本的 etcd。如果你想尝试最新版本,也可以从 master 分支构建 etcd。
首先查看一下我们本地的 Go 版本:
$ go version
Go version go1.13.6 linux/amd64
经检测,本地的 Go 版本满足要求。将制定版本的 etcd 项目 clone 到本地之后,在项目文件夹构建 etcd。构建好之后,执行测试命令,确保 etcd 编译安装成功:
$ ./etcdctl version
etcdctl version: 3.4.4
API version: 3.4
经过上述步骤,我们已经通过源码编译成功安装 etcd。
除此之外,还可以使用 Docker 容器安装,这种方式更为简单,但这种方式有一个弊端:启动时会将 etcd 的端口暴露出来。
etcd 集群安装部署
刚刚我们介绍了 etcd 的单机安装,但是在实际生产环境中,为了整个集群的高可用,etcd 通常都会以集群方式部署,以避免单点故障。下面我们看看如何进行 etcd 集群部署。
引导 etcd 集群的启动有以下三种方式:
- 静态启动
- etcd 动态发现
- DNS 发现
其中静态启动 etcd 集群的方式要求每个成员都知道集群中的其他成员。然而很多场景中,群集成员的 IP 可能未知。因此需要借助发现服务引导 etcd 群集启动。下面我们将会分别介绍这几种方式。
静态方式启动 etcd 集群
如果我们想在一台机器上实践 etcd 集群的搭建,可以通过 goreman 工具。
goreman 是一个 Go 语言编写的多进程管理工具,是对 Ruby 下广泛使用的 Foreman 的重写。下面我们使用 goreman 来演示在一台物理机上面以静态方式启动 etcd 集群。
前面我们已经确认过 Go 语言的安装环境,现在可以直接执行:
go get github.com/mattn/goreman
编译后的文件放在$GOPATH/bin
中,$GOPATH/bin
目录已经添加到了系统$PATH
中,所以我们可以方便地执行命令goreman
命令。
下面就是编写 Procfile 脚本,我们启动三个 etcd,具体如下:
Procfile 脚本中 infra1 启动命令如下:
etcd1: etcd --name infra1 --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
infra2 和 infra3 的启动命令类似。下面我们看一下其中各配置项的说明。
- --name:etcd 集群中的节点名,这里可以随意,方便区分且不重复即可。
- --listen-client-urls:监听用于客户端通信的 url,同样可以监听多个。
- --advertise-client-urls:建议使用的客户端通信 url,该值用于 etcd 代理或 etcd 成员与 etcd 节点通信。
- --listen-peer-urls:监听用于节点之间通信的 url,可监听多个,集群内部将通过这些 url 进行数据交互(如选举、数据同步等)。
- --initial-advertise-peer-urls:建议用于节点之间通信的 url,节点间将以该值进行通信。
- --initial-cluster-token: etcd-cluster-1,节点的 token 值,设置该值后集群将生成唯一 ID,并为每个节点也生成唯一 ID。当使用相同配置文件再启动一个集群时,只要该 token 值不一样,etcd 集群就不会相互影响。
- --initial-cluster:集群中所有的 initial-advertise-peer-urls 的合集。
- --initial-cluster-state:new,新建集群的标志。
注意上面的脚本,etcd 命令执行时需要根据本地实际的安装地址进行配置。下面我们使用goreman
命令启动 etcd 集群:
goreman -f /opt/procfile start
启动完成后查看集群内的成员:
$ etcdctl --endpoints=http://localhost:22379 member list
8211f1d0f64f3269, started, infra1, http://127.0.0.1:12380, http://127.0.0.1:12379, false
91bc3c398fb3c146, started, infra2, http://127.0.0.1:22380, http://127.0.0.1:22379, false
fd422379fda50e48, started, infra3, http://127.0.0.1:32380, http://127.0.0.1:32379, false
现在我们的 etcd 集群已经搭建成功。需要注意的是:在集群启动时,我们通过静态的方式指定集群的成员。但在实际环境中,集群成员的 IP 可能不会提前知道,此时需要采用动态发现的机制。