在 CentOS/Ubuntu/Debian/Fedora 上设置 Etcd 集群
欢迎阅读我们关于如何在 CentOS/Ubuntu/Debian/Fedora Linux 机器上设置 etcd 集群的指南。本教程将详细讨论 Linux 机器上三节点 etcd 集群的理想设置 - 这可以是 Ubuntu/Debian/CentOS/Fedora/Arch/Linux Mint 或其他上的 Etcd 集群现代 Linux 发行版。
etcd 是分布式且可靠的键值存储,用于存储分布式系统中最关键的数据。它是用 Go 编写的,并使用 Raft 共识算法来管理高可用的复制日志。
Etcd 的设计是:
- 简单:定义明确、面向用户的 API (gRPC)
- 安全:带有可选客户端证书身份验证的自动 TLS
- 快速:基准测试速度为 10,000 次写入/秒
- 可靠:使用 Raft 正确分布
设置 Etcd 集群 CentOS/Ubuntu/Debian/Fedora Linux
此设置应该适用于所有使用 systemd 服务管理器的 Linux 发行版。
此设置基于以下服务器网络信息和详细信息。
由于我的所有服务器都使用 Systemd 服务管理器,因此可以使用命令设置主机名。
# Node 1
sudo hostnamectl set-hostname etcd1.mydomain.com --static
# Node 2
sudo hostnamectl set-hostname etcd2.mydomain.com --static
# Node 3
sudo hostnamectl set-hostname etcd3.mydomain.com --static
将 mydomain.com
替换为您服务器的域名。服务器名称可以映射到本地 DNS 上的正确 IP 地址,或者直接将记录添加到每台服务器上的 /etc/hosts 文件中。
$ sudo vim /etc/hosts
192.168.18.9 etcd1.mydomain.com etcd1
192.168.18.10 etcd2.mydomain.com etcd2
192.168.18.11 etcd3.mydomain.com etcd3
第 1 步:下载并安装 etcd 二进制文件(所有节点)
登录到要使用的每个 etcd 集群节点并下载 etcd 二进制文件。这是在所有节点上完成的。
创建临时目录。
mkdir /tmp/etcd && cd /tmp/etcd
安装 wget
和 curl
工具:
# RHEL family
sudo yum -y install wget curl
# Debian family
sudo apt -y install wget curl
# Arch/Manjaro
sudo pacman -S wget curl
删除所有旧版本的 etcd:
rm -rf etcd*
下载 etcd 二进制存档。
curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest \
| grep browser_download_url \
| grep linux-amd64 \
| cut -d '"' -f 4 \
| wget -i -
解压缩文件并将二进制文件移动到 /usr/local/bin 目录。
tar xvf etcd-v*.tar.gz
cd etcd-*/
sudo mv etcd* /usr/local/bin/
cd ..
rm -rf etcd*
检查 etcd 和 etcdctl 版本。
$ etcd --version
etcd Version: 3.5.2
Git SHA: 99018a77b
Go Version: go1.16.3
Go OS/Arch: linux/amd64
$ etcdctl version
etcdctl version: 3.5.2
API version: 3.5
$ etcdutl version
etcdutl version: 3.5.2
API version: 3.5
步骤2:创建etcd目录和用户(所有节点)
我们将 etcd 配置文件存储在 /etc/etcd 目录中,并将数据存储在 /var/lib/etcd 中。用于管理服务的用户和组称为etcd。
创建etcd
系统用户/组。
sudo groupadd --system etcd
sudo useradd -s /sbin/nologin --system -g etcd etcd
然后为etcd创建数据和配置目录。
sudo mkdir -p /var/lib/etcd/
sudo mkdir /etc/etcd
sudo chown -R etcd:etcd /var/lib/etcd/
sudo chmod -R 700 /var/lib/etcd/
步骤3:在所有节点上配置etcd
我们需要在所有三台服务器上填充 systemd 服务单元文件。但首先,我们需要一些环境变量才能继续。
确定您的活动网络接口名称:
$ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:d9:f8:f0 brd ff:ff:ff:ff:ff:ff
inet 192.168.18.9/24 brd 192.168.18.255 scope global dynamic ens3
valid_lft 56972sec preferred_lft 56972sec
inet6 fe80::f816:3eff:fed9:f8f0/64 scope link
valid_lft forever preferred_lft forever
从我的输出来看,具有 IP 地址的活动网络接口是 ens3。 Etcd 将配置为在其 IP 地址上运行。
在所有服务器上执行
在每台服务器上,通过运行以下命令保存这些变量。
#INT_NAME="eth0"
INT_NAME="ens3" #replace with your server interface name
ETCD_HOST_IP=$(ip addr show $INT_NAME | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
ETCD_NAME=$(hostname -s)
在哪里 :
- INT_NAME 是用于集群流量的网络接口的名称。更改它以匹配您的服务器配置。
- ETCD_HOST_IP 是指定网络接口的内部 IP 地址。这用于服务客户端请求并与 etcd 集群对等方进行通信。
- ETCD_NAME – 每个 etcd 成员在 etcd 集群中必须有唯一的名称。使用的命令将设置 etcd 名称以匹配当前计算实例的主机名。
检查变量以确认它们具有正确的值:
echo $INT_NAME
echo $ETCD_HOST_IP
echo $ETCD_NAME
设置所有变量后,创建 etcd.service
systemd 单元文件:
cat <<EOF | sudo tee /etc/systemd/system/etcd.service
[Unit]
Description=etcd service
Documentation=https://github.com/etcd-io/etcd
[Service]
Type=notify
User=etcd
ExecStart=/usr/local/bin/etcd \\
--name ${ETCD_NAME} \\
--data-dir=/var/lib/etcd \\
--initial-advertise-peer-urls http://${ETCD_HOST_IP}:2380 \\
--listen-peer-urls http://${ETCD_HOST_IP}:2380 \\
--listen-client-urls http://${ETCD_HOST_IP}:2379,http://127.0.0.1:2379 \\
--advertise-client-urls http://${ETCD_HOST_IP}:2379 \\
--initial-cluster-token etcd-cluster-0 \\
--initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 \\
--initial-cluster-state new \
[Install]
WantedBy=multi-user.target
EOF
如果您没有将工作名称解析或映射添加到 /etc/hosts 文件中,则替换 etcd1、etcd2 和 etcd3 与您的节点 IP 地址。
对于 CentOS/RHEL Linux 发行版,将 SELinux 模式设置为宽容。
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
如果您有活动的防火墙服务,请允许端口 2379 和 2380。
# RHEL / CentOS / Fedora firewalld
sudo firewall-cmd --add-port={2379,2380}/tcp --permanent
sudo firewall-cmd --reload
# Ubuntu/Debian
sudo ufw allow proto tcp from any to any port 2379,2380
第四步:启动etcd服务器
通过在每个集群节点上运行以下命令来启动 etcd 服务。
sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd
确认 etcd 服务正在所有节点上运行。
[computingforgeeks@etcd1 ~]$ systemctl status etcd -l
● etcd.service - etcd service
Loaded: loaded (/etc/systemd/system/etcd.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 30s ago
Docs: https://github.com/etcd-io/etcd
Main PID: 5931 (etcd)
CGroup: /system.slice/etcd.service
└─5931 /usr/local/bin/etcd --name etcd1 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.9:2380 --listen-peer-urls http://192.168.18.9:2380 --listen-client-urls http://192.168.18.9:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.9:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new
....................................................................................
[computingforgeeks@etcd2 ~]$ systemctl status etcd -l
● etcd.service - etcd service
Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 2min 17s ago
Docs: https://github.com/etcd-io/etcd
Main PID: 5949 (etcd)
CGroup: /system.slice/etcd.service
└─5949 /usr/local/bin/etcd --name etcd2 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.10:2380 --listen-peer-urls http://192.168.18.10:2380 --listen-client-urls http://192.168.18.10:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.10:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new
....................................................................................
[computingforgeeks@etcd3 ~]$ systemctl status etcd -l
● etcd.service - etcd service
Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 3min 20s ago
Docs: https://github.com/etcd-io/etcd
Main PID: 5974 (etcd)
CGroup: /system.slice/etcd.service
└─5974 /usr/local/bin/etcd --name etcd3 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.11:2380 --listen-peer-urls http://192.168.18.11:2380 --listen-client-urls http://192.168.18.11:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.11:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new
第5步:测试Etcd集群安装
通过列出 etcd 集群成员来测试您的设置:
$ etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=false
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=true
要使用etcd v3,您需要显式指定版本。
$ ETCDCTL_API=3 etcdctl member list
152d6f8123c6ac97, started, etcd3, http://etcd3:2380, http://192.168.18.11:2379
332a8a315e569778, started, etcd2, http://etcd2:2380, http://192.168.18.10:2379
aebb404b9385ccd4, started, etcd1, http://etcd1:2380, http://192.168.18.9:2379
还可以通过运行以下命令检查集群运行状况:
$ etcdctl endpoint health
我们也尝试写入 etcd。
$ etcdctl put /message "Hello World"
OK
$ etcdctl put foo "Hello World!"
OK
读取 message
的值 – 它应该适用于所有节点。
$ etcdctl get /message
/message
Hello World
$ etcdctl get foo
foo
Hello World!
第 6 步 – 测试领导者失败
当领导者失败时,etcd 集群会自动选举新的领导者。一旦领导者失败,选举不会立即发生。由于故障检测模型是基于超时的,因此大约需要一个选举超时才能选出新的领导者。
在领导者选举期间,集群无法处理任何写入操作。选举期间发送的写请求将排队等待处理,直到选举出新的领导者。
我们当前的领导者是 etcd1 – 节点 1。
$ etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=false
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=true
让我们把它拿下来。
[computingforgeeks@etcd1 ~]$ sudo systemctl stop etcd
检查新的 Leader – 现在是 etcd2 服务器。
$ etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=true
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=false
一旦 etcd1 服务启动,领导者将保持 etcd2 除非它宕机。
结论
现在,您已经在 CentOS/Ubuntu/Debian Linux 系统上安装了一个工作的三节点 Etcd 集群。请访问 Etcd 文档以获取详细的设置和使用指南。
类似的设置:
- 在 Ubuntu/Debian 上设置 Consul 集群
- 在 CentOS/RHEL 服务器上设置 Consul 集群
- 如何在 CentOS 上设置本地 OpenShift Origin (OKD) 集群
- 如何在Ubuntu上安装Ceph存储集群