etcd 集群安装

1.前提条件

  1. 本次安装基于内部修改后的 etcd 二进制包进行安装,可能过程和标准安装存在不同。
  2. 安装前确保集群已经完成大数据部分的 基础环境配置
  3. 本次安装的 etcd 软件版本为:3.5.9,当前服务器芯片为 x86,安装包为:etcd-3.5.9-amd64.tar.gz,对于 ARM64 环境请安装带 aarch64 标识的版本。

注意 etcd 服务个数应该为奇数个,每个服务都对应不同的节点,为了保证高可用性最少为3个(允许1个节点故障),在大型的生产环境通常会配置5个节点(允许2个节点故障),例如在停掉其中1个节点维护的同时,还可以允许再有1个节点故障。

2.环境和参数准备

  1. 本次安装过程中集群中共有3个节点,其 hosts 文件定义如下:
    10.0.1.21 ec1
    10.0.1.22 ec2
    10.0.1.23 ec3
    
  2. etcd 的数据目录约定为:/data/etcd

3.安装配置

3.1.二进制包安装

我们首先需要在每个机器上进行安装,然后再修改配置,最后修改完成后启动服务。

# 在所有节点上执行安装
tar -xvzf etcd-3.5.9-amd64.tar.gz
cd etcd-3.5.9-amd64
./install.sh

安装好之后我们需要为所有的节点都创建数据目录:

mkdir -p /data/etcd

查看 etcd 版本:

etcd --version

这样 etcd 就安装到所有节点的系统上了,接下来我们开始配置。

3.2.修改配置

我们挨个节点对配置进行修改,因为每个节点的配置都需要和当前的节点 IP 相关,所以配置不能直接同步。

我们首先生成一个集群 UUID 用于集群的初始化隔离:

uuidgen
# 没有上面命令也可以使用内核提供的 UUID 生成器
cat /proc/sys/kernel/random/uuid

假如现在生成的 UUID 是:fba89b9c-52c9-48d2-a9a8-9a12c975d32c,这个 UUID 我们待会要填写到配置文件中,并且整个集群都要保持一致。

执行完上面的安装后会自动生成配置文件 /etc/etcd/etcd.yml,然后我们编辑配置文件内容如下:

# This is the configuration file for the etcd server.

# Human-readable name for this member.
name: 'ec1'

# Path to the data directory.
data-dir: /data/etcd

# List of comma separated URLs to listen on for peer traffic.
listen-peer-urls: http://10.0.1.21:2380

# List of comma separated URLs to listen on for client traffic.
listen-client-urls: http://10.0.1.21:2379

# List of this member's peer URLs to advertise to the rest of the cluster.
# The URLs needed to be a comma-separated list.
initial-advertise-peer-urls: http://10.0.1.21:2380

# List of this member's client URLs to advertise to the public.
# The URLs needed to be a comma-separated list.
advertise-client-urls: http://10.0.1.21:2379

# Comma separated string of initial cluster configuration for bootstrapping.
# Example: initial-cluster: "infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380"
initial-cluster: "ec1=http://10.0.1.21:2380,ec2=http://10.0.1.22:2380,ec3=http://10.0.1.23:2380"

# Initial cluster token for the etcd cluster during bootstrap.
initial-cluster-token: 'fba89b9c-52c9-48d2-a9a8-9a12c975d32c'

# Initial cluster state ('new' or 'existing').
initial-cluster-state: 'new'

# Enable debug-level logging for etcd.
#log-level: debug

简单解释下配置项的内容:

  1. name 是当前成员的名称,直接使用当前节点的主机名即可
  2. data-dir 配置数据目录位置
  3. listen-peer-urls 监听用于节点间通信的地址和端口,默认端口是 2380
  4. listen-client-urls 监听客户端服务的地址和端口,默认端口是 2379
  5. initial-advertise-peer-urls 表示提供给对端用于节点间访问的 URL,通常和上面的一样,但是在跨网络的复杂环境下配置可能不同
  6. advertise-client-urls 表示提供给客户端来访问 etcd 服务的 URL,通常和监听的一致,但是在跨网络的复杂环境下配置可能会不同
  7. initial-cluster 这个是固定格式,用于引导集群进行初始化,这个配置值所有节点都需要一致
  8. initial-cluster-token 这个填写我们刚才生成的 UUID 即可,所有的节点都需要保持一致
  9. initial-cluster-state 配置初始化状态,由于我们是新的集群所以都填写 new,如果是加入已经存在的集群需要填写 existing

修改无误后保存配置,然后剩余的节点也都修改一下,主要是修改主机名和 IP 的值,配置比较简单,具体就不再详细叙述了,所有节点修改完就配置完毕了。

3.3.启动服务

在所有节点上依次启动 etcd 服务:

# 所有节点都需要执行
systemctl start etcd.service
# 查看运行状态
systemctl status etcd.service

启动之后可以查看集群节点的状态:

etcdctl --write-out=table --endpoints=ec1:2379,ec2:2379,ec3:2379 endpoint status

可以看到每个节点的情况,比如 ID、数据库大小等,比如 IS_LEADER 这一栏表示领导者,我们这里有一个是领导者值为 true,其余的都是 false。

还可以查看集群健康情况:

etcdctl --endpoints=ec1:2379,ec2:2379,ec3:2379 endpoint health

查看成员列表:

etcdctl --write-out=table --endpoints=ec1:2379,ec2:2379,ec3:2379 member list

这样可以看到每个节点成员的访问地址、状态等信息。

Reference:

  1. https://etcd.io/docs/v3.5/tutorials/how-to-setup-cluster/