尝试驯服etcd

Etcd

参考文档

https://www.baeldung.com/java-etcd-guide

基于 Raft协议的服务发现程序

安装

使用ubuntu22可以直接安装

1
apt install etcd

你也可以单独安装部分模块

1
2
apt install etcd-server
apt install etcd-client

如果只使用单服务, 一台机器是server即可, 其他机器使用client进行通报

需要高可用集群, 每个机器都安装两个模块

安装完成后server会自动启用, 或者手动启动

1
etcd

其中, 端口 2379 用于服务器通信, 2380 用与伙伴通信

安装好后是单机模式, 可以使用client的指令查看当前集群都有哪些成员

1
etcdctl member list

配置

参考 https://etcd.io/docs/v3.5/op-guide/configuration/

配置文件向导参考文件 https://github.com/etcd-io/etcd/blob/main/etcd.conf.yml.sample

有多种方式进行配置, 参见参考文件 , 这里以配置文件进行设置

配置文件很可能没有创建, 你需要自己创建文件夹 /etc/etcd/config.yaml 并使用 --config-file '...' 指定配置文件地址或者使用系统变量(优先级比配置参数低) ETCD_CONFIG_FILE ... 指定

参见 https://etcd.io/docs/v3.4/op-guide/configuration/

由于是使用APT安装的etcd, 需要对配置文件进行修剪, 查询当前etcd的service配置目录

1
systemctl status etcd

默认一般在该目录下, 删除掉 ( 你也可以根据自己的需求直接修改 )

1
rm /lib/systemd/system/etcd.service

创建新的, 并复制新的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=etcd
Documentation=https://etcd.io/docs
Documentation=man:etcd
After=network.target
Wants=network-online.target

[Service]
Type=notify
User=etcd
PermissionsStartOnly=true
# 这里指定启动指令使用配置文件
ExecStart=/usr/bin/etcd --config-file '/etc/etcd/config.yaml'
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
Alias=etcd2.service

注意, 这个配置文件一般没有创建, 需要先创建

1
mkdir /etc/etcd

然后使用新的配置文件

  • 这是一个基本配置, 后续根据集群发现的方式不同会追加新的字段
1
2
3
4
5
6
7
8
9
10
name: '你的机器名称'
data-dir: '/etc/etcd/data'
wal-dir: '/etc/etcd/wal'
listen-peer-urls: 'http://机器可被访问的IP:2380'
listen-client-urls: 'http://127.0.0.1:2379,http://机器可被外网访问的IP:2379'
advertise-client-urls: 'http://机器可被访问的IP:2379'
initial-advertise-peer-urls: 'http://机器可被访问的IP:2380'

tls-min-version: 'TLS1.2'
tls-max-version: 'TLS1.3'

然后刷新配置并启动

1
2
3
4
systemctl daemon-reload
systemctl start etcd
# 验证
etcd member list

启动配置

上面介绍的配置会默认按照 single node 独立集群启动, 即一个etcd就是一个新集群

你可以使用以下字段对新集群进行控制

1
2
3
4
initial-cluster-state: 'new'
initial-cluster: '<跟配置文件的name字段保持一致, 区分大小写>=http://机器可被访问的IP:2380'
# 集群会按照token进行区分, 避免意外的夸集群
initial-cluster-token: '6df85095-0b8f-4aa2-bc08-381b414944b9'

集群初始化&集群发现

假设现在我们有三条服务器需要组成一个etcd的可用 , 配置如下

1
2
3
MachineA : 1.1.1.1
MachineB : 1.1.1.2
MachineC : 1.1.1.3

那么首先需要一个 Leader , 也就是主机器, 主机器的配置就是上面的配置, 其中 stat: 'new'

需要注意, 添加集群时额外将他们的信息写在 inital-cluster

1
2
3
4
initial-cluster-state: 'new'
# initial启动方式要求主机器必须在启动时就进行集群机器信息的初始化
initial-cluster: 'MachineA=http://1.1.1.1:2380,MachineB=http://1.1.1.2:2380,MachineC=http://1.1.1.3:2380'
initial-cluster-token: '6df85095-0b8f-4aa2-bc08-381b414944b9'

追加这三个字段到基础的配置参数中并启动集群

然后另外两台机器也使用这三个字段进行启动, 但是使用 initial-cluster-state: 'existing' 进行启动即可

还有另外一个集群的启动方式, 因为我们不总是知道这些个集群的IP地址, 或者当集群机器数量较多时一个一个写非常麻烦, 还支持一个 discoverURL 进行集群发现

他依赖一个已经启用的集群进行发现 , 本质上就是有一个集群提供一个特殊的API地址, 当有一个成员加入集群时, 成员向这个API注册自己的信息(包括交互IP地址和端口)等

这意味着任意一个新加入的集群成员都能通过这个API立即发现其他集群成员, 并根据获取到的地址进行health探测

注意

提供发现API的etcd集群节点不能加入这个被发现的集群中, 否则会出现clusterID mismatch的问题

现在假设我们有一台使用 inital模式启动的单机集群( 就是依据第一种方法启动, 但是集群中只有一个节点) , 并对外提供公网访问(总之其他机器能访问到就行)

你可以使用ETCD官方已经准备好的高可用集群生成一个discoverURL,然后他会返回一个discoverURL

操作如下

1
2
curl https://discovery.etcd.io/new?size=3
>>> https://discovery.etcd.io/e6e9071eeb45829d8875500599108ad8
  • size 是预计的集群大小, 一般为 1 3 5 7 … 等奇数
    • 你的机器数量一定跟集群大小一样, 否则所有的机器会等待集群满员才会工作

然后API就已经创建好了, 填充配置

1
discovery: 'https://discovery.etcd.io/e6e9071eeb45829d8875500599108ad8'

是的, 三个预计要组成集群的机器都使用这个字段, 且只需要追加这个字段到基本配置中

之后 短时间内同时启动三个机器 , 因为他们必须要等到集群满员才开始工作, 且有超时设置, 如果你三台机器启动的时间间隔过大会导致集群建立失败且无法再次使用这个uuid组建集群!

如果你的机器无法访问外网, 只能在内网进行操作,或者你想知道怎么自建一个discoverURL, 我们继续

首先你得有一个充当集群发现服务的 已运行集群 , 这里我们假设有一台Zero机器

1
MachineZero : 2.2.2.2

对Zero集群进行操作

1
2
3
# 使用Linux自带的程序生成一个集群 uuid
uuidgen
>>> 29e2e85e-c289-4dc0-bd40-814e87d6765f

将这个集群uuid使用etcd的接口创建一个URL

1
curl -X PUT http://2.2.2.2:2379/v2/keys/_etcd/registry/29e2e85e-c289-4dc0-bd40-814e87d6765f/_config/size -d value=3
  • 实际上前导路径可以任意设置, 不一定按照我的(虽然他是官方推荐的标准) , 但是UUID及其后方的路径建议你保持一致

此时你的discoverURL就是

1
http://2.2.2.2:2379/v2/keys/_etcd/registry/29e2e85e-c289-4dc0-bd40-814e87d6765f

填充到 discovery 字段内即可

失败重建

如果你意外的失败了, 需要删除掉之前的数据文件才能以干净的etcd方式启动,当然,配置文件不需要动

1
2
3
systemctl stop etcd
rm /etc/etcd/wal -r
rm /etc/etcd/data -r

即可

如果你是自建discoverURL遭遇失败,要么更换uuid,要么按照上面的方法干净启动这个服务集群

当然,直接删掉这个键也是可以的,但是似乎还是会有问题, 你可以试试

1
curl -X DELETE http://2.2.2.2:2379/v2/keys/_etcd/registry/29e2e85e-c289-4dc0-bd40-814e87d6765f/_config/size

尝试驯服etcd
https://blog.sukiloli.com/2024/08/09/etcd 初见/
作者
QLozin
发布于
2024年8月9日
许可协议