关于程序员:彻底搞懂-etcd-系列文章二etcd-的多种安装姿势

38次阅读

共计 6622 个字符,预计需要花费 17 分钟才能阅读完成。

0 专辑概述
etcd 是云原生架构中重要的根底组件,由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅能够作为服务注册与发现,还能够作为 key-value 存储的中间件。

《彻底搞懂 etcd 系列文章》将会从 etcd 的基本功能实际、API 接口、实现原理、源码剖析,以及实现中的踩坑教训等几方面具体开展介绍 etcd。预计会有 20 篇左右的文章,笔者将会每周继续更新,欢送关注。

1 etcd 装置与应用
在上一篇次要介绍了 etcd 的相干概念和应用场景,本篇次要介绍 etcd 的多种装置应用形式。

1.1 etcd 概念词汇表
在开始 etcd 的装置应用之前,咱们先理解下 etcd 的概念词汇表,以便于下文的了解。

Raft:etcd 所采纳的保障分布式系统强一致性的算法。
Node:一个 Raft 状态机实例。
Member:一个 etcd 实例。它治理着一个 Node,并且能够为客户端申请提供服务。
Cluster:由多个 Member 形成能够协同工作的 etcd 集群。
Peer:对同一个 etcd 集群中另外一个 Member 的称说。
Client:向 etcd 集群发送 HTTP 申请的客户端。
WAL:预写式日志,etcd 用于长久化存储的日志格局。
snapshot:etcd 避免 WAL 文件过多而设置的快照,存储 etcd 数据状态。
Proxy:etcd 的一种模式,为 etcd 集群提供反向代理服务。
Leader:Raft 算法中通过竞选而产生的解决所有数据提交的节点。
Follower:竞选失败的节点作为 Raft 中的隶属节点,为算法提供强一致性保障。
Candidate:当 Follower 超过肯定工夫接管不到 Leader 的心跳时转变为 Candidate 开始竞选。
Term:某个节点成为 Leader 到下一次竞选工夫,称为一个 Term。
Index:数据项编号。Raft 中通过 Term 和 Index 来定位数据。
2 etcd 单机装置部署
etcd 的装置有多种形式,笔者以 Centos 7 和 MacOS 10.15 为例,能够通过 yum install etcd 和 brew install etcd 进行装置。

然而通过零碎工具装置的 etcd 版本比拟滞后,如果须要装置最新版本的 etcd,咱们能够通过二进制包、源码编译以及 docker 容器装置。

2.1 二进制装置
目前最新的 etcd 版本为 3.4.4。在 macOS 下,执行如下的脚本:

ETCD_VER=v3.4.4
GITHUB_URL=https://github.com/etcd-io/et…
DOWNLOAD_URL=${GITHUB_URL}

rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test

curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64

/tmp/etcd-download-test/etcd –version
/tmp/etcd-download-test/etcdctl version
即可输入如下的后果:

etcd Version: 3.4.4
Git SHA: c65a9e2dd
Go Version: go1.12.12
Go OS/Arch: darwin/amd64
能够看到,咱们曾经胜利包装了 etcd 3.4.4,且该版本基于的 Go 版本为 1.12.12。

同样,咱们在 Centos 7 下面应用如下的脚本进行装置:

ETCD_VER=v3.4.4

GITHUB_URL=https://github.com/etcd-io/et…
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 Version: 3.4.4
Git SHA: e784ba73c
Go Version: go1.12.12
Go OS/Arch: linux/amd64
这样咱们在 macOS 和 Linux 都已装置胜利,对于 Windows 零碎的装置比较简单,下载好安装包后,间接执行。其中 etcd.exe 是服务端,etcdctl.exe 是客户端。

2.2 源码装置
应用源码装置,首先须要确保本地的 Go 语言环境。如未装置,请参考 https://golang.org/doc/install。

对于那些想尝试最新版本的人,能够从 master 分支构建 etcd。须要 Go 版本为 1.13+,来构建最新版本的 etcd。本地的 Go 版本为:

$ go version
$ go version go1.13.6 linux/amd64
基于 master 分支构建 etcd,脚本如下:

git clone https://github.com/etcd-io/et…
cd etcd
./build
执行测试命令,确保 etcd 编译装置胜利:

$ ./etcdctl version

etcdctl version: 3.4.4
API version: 3.4
通过如上的步骤,曾经通过源码编译装置胜利 etcd。

2.3 docker 容器装置
etcd 应用 gcr.io/etcd-development/etcd 作为容器仓库源,而 quay.io/coreos/etcd 作为辅助容器注册表。

REGISTRY=quay.io/coreos/etcd

available from v3.2.5

REGISTRY=gcr.io/etcd-development/etcd
rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
docker rmi gcr.io/etcd-development/etcd:v3.4.7 || true && \
docker run \
-p 2379:2379 \
-p 2380:2380 \
–mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
–name etcd-gcr-v3.4.7 \
gcr.io/etcd-development/etcd:v3.4.7 \
/usr/local/bin/etcd \
–name s1 \
–data-dir /etcd-data \
–listen-client-urls http://0.0.0.0:2379 \
–advertise-client-urls http://0.0.0.0:2379 \
–listen-peer-urls http://0.0.0.0:2380 \
–initial-advertise-peer-urls http://0.0.0.0:2380 \
–initial-cluster s1=http://0.0.0.0:2380 \
–initial-cluster-token tkn \
–initial-cluster-state new \
–log-level info \
–logger zap \
–log-outputs stderr

docker exec etcd-gcr-v3.4.7 /bin/sh -c “/usr/local/bin/etcd –version”
docker exec etcd-gcr-v3.4.7 /bin/sh -c “/usr/local/bin/etcdctl version”
docker exec etcd-gcr-v3.4.7 /bin/sh -c “/usr/local/bin/etcdctl endpoint health”
docker exec etcd-gcr-v3.4.7 /bin/sh -c “/usr/local/bin/etcdctl put foo bar”
docker exec etcd-gcr-v3.4.7 /bin/sh -c “/usr/local/bin/etcdctl get foo”
执行如下命令,确认容器装置的 etcd 的状态:

$ etcdctl –endpoints=http://localhost:2379 version

etcdctl version: 3.4.4
API version: 3.4

  1. etcd 集群部署
    在生产环境中,为了整个集群的高可用,etcd 失常都会集群部署,防止单点故障。本节将会介绍如何进行 etcd 集群部署。

3.1 本地运行一个 etcd 集群
如果想要在一台机器上实际 etcd 集群的搭建,能够通过 goreman 工具。

goreman 是一个 Go 语言编写的多过程管理工具,是对 Ruby 下宽泛应用的 foreman 的重写(foreman 原作者也实现了一个 Go 版本:forego,不过没有 goreman 好用)。

咱们后面曾经确认过 Go 装置环境,间接执行:

go get github.com/mattn/goreman
编译后的文件放在 $GOPATH/bin 中,$GOPATH/bin 目录曾经增加到了零碎 $PATH 中,所以咱们能够不便执行命令 goreman 命令。上面就是编写 Procfile 脚本,咱们启动三个 etcd,具体对应如下:

HostName ip 客户端交互端口 peer 通信端口
infra1 127.0.0.1 12379 12380
infra2 127.0.0.1 22379 22380
infra3 127.0.0.1 32379 32380
Procfile 脚本如下:

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… –initial-cluster-state new –enable-pprof –logger=zap –log-outputs=stderr
etcd2: etcd –name infra2 –listen-client-urls http://127.0.0.1:22379 –advertise-client-urls http://127.0.0.1:22379 –listen-peer-urls http://127.0.0.1:22380 –initial-advertise-peer-urls http://127.0.0.1:22380 –initial-cluster-token etcd-cluster-1 –initial-cluster ‘infra1=http://127.0.0.1:12380,infra2… –initial-cluster-state new –enable-pprof –logger=zap –log-outputs=stderr
etcd3: etcd –name infra3 –listen-client-urls http://127.0.0.1:32379 –advertise-client-urls http://127.0.0.1:32379 –listen-peer-urls http://127.0.0.1:32380 –initial-advertise-peer-urls http://127.0.0.1:32380 –initial-cluster-token etcd-cluster-1 –initial-cluster ‘infra1=http://127.0.0.1:12380,infra2… –initial-cluster-state new –enable-pprof –logger=zap –log-outputs=stderr
配置项阐明:

–name:etcd 集群中的节点名,这里能够随便,可辨别且不反复就行
–listen-peer-urls:监听的用于节点之间通信的 url,可监听多个,集群外部将通过这些 url 进行数据交互(如选举,数据同步等)
–initial-advertise-peer-urls:倡议用于节点之间通信的 url,节点间将以该值进行通信。
–listen-client-urls:监听的用于客户端通信的 url,同样能够监听多个。
–advertise-client-urls:倡议应用的客户端通信 url,该值用于 etcd 代理或 etcd 成员与 etcd 节点通信。
–initial-cluster-token:etcd-cluster-1,节点的 token 值,设置该值后集群将生成惟一 id,并为每个节点也生成惟一 id,当应用雷同配置文件再启动一个集群时,只有该 token 值不一样,etcd 集群就不会相互影响。
–initial-cluster:也就是集群中所有的 initial-advertise-peer-urls 的合集。
–initial-cluster-state:new,新建集群的标记
留神下面的脚本,etcd 命令执行时须要依据本地理论的装置地址进行配置。上面咱们启动 etcd 集群。

goreman -f /opt/procfile start
应用如上的命令启动启动 etcd 集群,启动实现之后查看集群内的成员。

$ 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
咱们在单机搭建的伪集群胜利,须要留神的是在集群启动时,咱们是通过动态的形式指定集群的成员,在理论环境中,集群成员的 ip 可能不会提前晓得。这时候就须要采纳动静发现的机制。

  1. 小结
    本章较为简单,偏差实际,读者最好可能本人入手实际一遍。本文次要介绍了 etcd 的多种装置形式:etcd 单机和 etcd 集群的形式。etcd 集群的装置,还须要配合服务发现的动静机制,将会在下一篇具体解说,欢送关注点赞。
正文完
 0