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
如果版本过期了可以直接在官网查看安装教程 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,具体对应如下:
| HostName | IP | 客户端交互端口 | peer交互端口 |
|---|---|---|---|
| infra1 | 127.0.0.1 | 12379 | 12380 |
| infra2 | 127.0.0.1 | 22379 | 22380 |
| infra3 | 127.0.0.1 | 32379 | 32380 |
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
关闭某个节点
goreman run stop etcd2
重启某个节点
goreman run restart etcd2
向集群写入数据
etcdctl put user fox ‐‐endpoints http://localhost:22379
我们在单机搭建的伪集群成功,需要注意的是在集群启动时,我们是通过静态的方式指定集群的成员,在实际环境中,集群成员的 ip 可能不会提前知道。这时候就需要采用动态发现的机制。