在 CentOS/Ubuntu/Debian/Fedora 上设置 Etcd 集群在 CentOS/Ubuntu/Debian/Fedora 上设置 Etcd 集群在 CentOS/Ubuntu/Debian/Fedora 上设置 Etcd 集群在 CentOS/Ubuntu/Debian/Fedora 上设置 Etcd 集群
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

在 CentOS/Ubuntu/Debian/Fedora 上设置 Etcd 集群

发表 admin at 2025年2月28日
类别
  • 未分类
标签

欢迎阅读我们关于如何在 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存储集群
©2015-2025 Norria support@alaica.com