在CentOS 7/8/Ubuntu 18.04/16.04/Debian 10/9上设置Etcd群集
欢迎来到我们的教程,了解如何在CentOS 7/8/Ubuntu 18.04/16.04/Debian 10/9/Fedora 30/29 Linux机器上设置etcd集群。
本教程将详细讨论在Linux机器上设置三节点etcd群集的理想设置–可以是Ubuntu/Debian/CentOS/Fedora/Arch/Linux Mint或者其他现代Linux发行版上的Etcd群集。
etcd是用于分布式系统最关键数据的分布式可靠键值存储。
它是用Go语言编写的,并使用Raft共识算法来管理高可用性的复制日志。
Etcd设计为:
简单:定义明确的,面向用户的API(gRPC)安全:具有可选客户端证书身份验证的自动TLS快速:基准10,000次写入/秒可靠:使用Raft正确分发
Linux上的Etcd群集设置– CentOS/Ubuntu/Debian/Fedora
此设置应可在所有使用systemd服务管理器的Linux发行版上使用。
此设置基于以下服务器网络信息和详细信息。
|||
| --- - | --- |
| etcd1 | 192.168.18.9 |
| etcd2 | 192.168.18.10 |
| etcd3 | 192.168.18.11 |
由于我所有的服务器都使用Systemd服务管理器,因此可以使用命令设置主机名。
# Node 1 sudo hostnamectl set-hostname etcd1.mydomain.com --static sudo hostname etcd1.mydomain.com # Node 2 sudo hostnamectl set-hostname etcd2.mydomain.com --static sudo hostname etcd2.mydomain.com # Node 3 sudo hostnamectl set-hostname etcd3.mydomain.com --static sudo hostname etcd3.mydomain.com
代替 mydomain.com
与我们服务器的域名。
可以将服务器名称映射到本地DNS上的正确IP地址,或者通过将记录直接添加到每台服务器上的/etc/hosts文件中。
sudo tee -a /etc/hosts<<EOF 192.168.18.9 etcd1.mydomain.com etcd1 192.168.18.10 etcd2.mydomain.com etcd2 192.168.18.11 etcd3.mydomain.com etcd3 EOF
步骤1:下载并安装etcd Binaries(所有节点)
登录到每个要使用的etcd群集节点,然后下载etcd二进制文件。
这是在所有节点上完成的。
创建临时目录。
mkdir /tmp/etcd && cd /tmp/etcd
安装wget。
# RHEL family sudo yum -y install wget # Debian family sudo apt-get -y install wget # Arch/Manjaro sudo pacman -S wget
下载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 -qi
取消存档文件,然后将二进制文件移至/usr/local/bin目录。
tar xvf *.tar.gz cd etcd-*/ sudo mv etcd* /usr/local/bin/ cd ~ rm -rf /tmp/etcd
检查etcd和etcdctl版本。
$etcd --version etcd Version: 3.3.13 Git SHA: 98d3084 Go Version: go1.10.8 Go OS/Arch: linux/amd64 $etcdctl --version etcdctl version: 3.3.13 API version: 2
步骤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/
步骤3:在所有节点上配置etcd
我们需要在所有三个服务器上填充系统服务单元文件。
但是首先,需要一些环境变量才能继续进行操作。
在每台服务器上,通过运行以下命令来保存这些变量。
INT_NAME="eth0" ETCD_HOST_IP=$(ip addr show $INT_NAME | grep "inet\b" | awk '{print }' | cut -d/-f1) ETCD_NAME=$(hostname -s)
其中:INT_NAME是用于群集通信的网络接口的名称。
更改它以匹配服务器配置。
ETCD_HOST_IP是指定网络接口的内部IP地址。
这用于服务客户机请求并与etcd集群对等方通信。
ETCD_NAME–每个etcd成员在etcd集群中必须具有唯一的名称。
使用的命令将设置etcd名称以匹配当前计算实例的主机名。
一旦设置了所有变量,请创建 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文件中添加有效的名称解析或者映射,请用节点IP地址替换etcd1,etcd2和etcd3.
对于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
步骤4:启动etcd服务器
通过在每个群集节点上运行以下命令来启动etcd服务。
sudo systemctl daemon-reload sudo systemctl enable etcd sudo systemctl start etcd
确认etcd服务正在所有节点上运行。
[Hyman@theitroad ~]$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 .................................................................................... [Hyman@theitroad ~]$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 .................................................................................... [Hyman@theitroad ~]$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 cluster-health member 152d6f8123c6ac97 is healthy: got healthy result from http://192.168.18.11:2379 member 332a8a315e569778 is healthy: got healthy result from http://192.168.18.10:2379 member aebb404b9385ccd4 is healthy: got healthy result from http://192.168.18.9:2379 cluster is healthy
我们还要尝试写入etcd。
$etcdctl set /message "Hello World" Hello World
读取的值 message
back –应该在所有节点上都可以工作。
$etcdctl get /message Hello World
创建目录。
$etcdctl mkdir /myservice $etcdctl set /myservice/container1 localhost:8080 localhost:8080 $etcdctl ls /myservice /myservice/container1
步骤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
让我们把它记下来。
[Hyman@theitroad ~]$sudo systemctl stop etcd
检查新的Leader – Now 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服务,除非leader掉线,否则leader将保留etcd2.