ETCD(2):安装与部署

139 阅读5分钟

0. 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来定位数据。

1. 单机安装

以centOS7为例

1.1 yum 安装

yum install -y etcd

1.2 二进制安装

ETCD_VER=v3.4.24

# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_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.24
Git SHA: e784ba73c
Go Version: go1.17.12
Go OS/Arch: linux/amd64

etcdctl version: 3.4.24
API version: 3.4

将etcd和etcdctl复制到/usr/local/bin目录,系统中可以直接调用etcd/etcdctl

cp etcd etcdctl /usr/local/bin

简单使用

# 开启本地etcd客户端
etcd

# 在etcd读写
etcdctl --endpoints=localhost:2379 put foo bar
etcdctl --endpoints=localhost:2379 get foo

image.png

如果版本过期了可以直接在官网查看安装教程 Releases · etcd-io/etcd (github.com)

1.3 docker 安装

docker run --rm --name etcd -p 2379:2379 -e ETCDCTL_API=3 quay.io/coreos/etcd /usr/local/bin/etcd -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379

配置项说明

  • --listen-client-urls:监听的用于客户端通信的url,可以监听多个。
  • --advertise-client-urls:建议使用的客户端通信 url,该值用于 etcd 代理或 etcd 成员与 etcd 节点通信。

新开一个终端,进入容器

 docker exec -it 容器id /bin/sh
 
 # 查看etcd版本
 etcdctl version

2. 集群部署

在本地演示伪集群

先调整下GO的环境变量

go env -w GO111MODULE=on

让后面的goreman工具的可执行文件生成在$GOPATH/bin

如果PATH里面没有$GOPATH/bin记得加上

# 打开 /etc/profile,在结尾加上 

export PATH=$PATH:你自己的GPATH的bin路径

# $PATH是前面之前设定的路径,相当于在之前的路径后添加新路径

# 最后
source /etc/profile

etcd server 默认使用 2380 端口监听集群中其他 server 的请求,但一台机器上多个 etcd server 监听同一个端口会导致端口冲突 。作为示例,分别让 3 个 etcd server 监听在 12380 、 22380 、 32380 端口上。

可以通过进程管理工具goreman,快速创建、停止本地的多节点etcd集群。

go get github.com/mattn/goreman

下面就是编写 Procfile 脚本,我们启动三个 etcd,具体对应如下:

HostNameIP客户端交互端口peer交互端口
infra1127.0.0.11237912380
infra2127.0.0.12237922380
infra3127.0.0.13237932380

local-cluster-profile文件(我们通过二进制安装的etcd进行集群搭建,把该文件写到/tmp/etcd-download-test目录下)

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
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=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --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=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr

配置项说明

  • --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:etcd启动的时候,通过这个配置找到其他ectd节点的地址列表,格式:'节点名字1=http://节点ip1:2380,节点名字1=http://节点 ip1:2380,.....'

  • --initial-cluster-state:new表示新建集群(existing表示加入已经存在的集群)

启动集群

goreman -f ./local-cluster-profile start

查看集群成员

etcdctl --endpoints=http://localhost:22379  member list

image.png

关闭某个节点

goreman run stop etcd2

重启某个节点

goreman run restart etcd2

向集群写入数据

etcdctl put user fox ‐‐endpoints http://localhost:22379

image.png

我们在单机搭建的伪集群成功,需要注意的是在集群启动时,我们是通过静态的方式指定集群的成员,在实际环境中,集群成员的 ip 可能不会提前知道。这时候就需要采用动态发现的机制。