一、环境准备
1、节点个数的选择
1.1 推荐节点个数为奇数
etcd是基于Raft算法实现一致性,故强烈推荐集群节点数为奇数(如3、5、7),以避免选举平票问题并保证多数派机制的有效性。偶数节点虽理论上可行,但无法提升容错能力且增加写入延迟。
1.2 故障冗余能力和节点个数的关系
最多容忍(N-1)/2 个节点故障(N为etcd集群节点个数)
3节点:最多容忍1个节点故障,3节点部署是生产中最常使用的节点部署个数;
5节点:最多容忍2个节点故障,大中型生产集群环境推荐使用5节点;
7节点:最多容忍3个节点故障,适用于对高可用要求极高的大规模节点集群;
etcd集群超过7节点后,容错能力提升有限,但是集群内各节点间网络开销却显著增加,etcd性能也会成为瓶颈,故不推荐使用7节点以上的etcd集群。
1.3 节点个数对性能的影响
写性能:etcd集群节点个数越多,写入数据需要同步的节点就越多,性能会线性下降。
读性能:etcd集群任意节点均可进行数据的访问读取,因此节点数量增加会提升集群的数据读取能力。
总结:etcd在多节点部署时推荐 奇数个数,容忍(N-1)/2 节点故障。对于中小集群,3节点是平衡成本和性能的最佳选择;对于大规模高可用集群,5或7节点部署也是一种较好的选择,但是建议使用较好的网络带宽。
本文选择使用3节点部署etcd集群。
2、节点环境准备
2.1 操作系统的选择
Centos7 (以7.6.1810为例);
2.2 所有节点时间校准
在 etcd 集群中,节点间时间一致性是保障分布式一致性和稳定运行的核心要素。
在各个节点上均执行:
# 安装chrony(推荐的非常稳定的时间同步服务)
yum install -y chrony
systemctl enable chronyd && systemctl start chronyd
# 手动同步时间(可选)
timedatectl set-ntp true
chronyc tracking
2.3 节点情况
节点名称 | ip地址 |
---|---|
node11 | 192.168.0.11 |
node12 | 192.168.0.12 |
node13 | 192.168.0.13 |
2.4 etcd 3.3.11 下载和安装
2.4.1 yum安装
若centos配置好的yum源,可以直接执行
yum install -y etcd
2.4.2 二进制包安装
下载:
wget https://github.com/etcd-io/etcd/releases/download/v3.11.11/etcd-v3.11.11-linux-amd64.tar.gz
安装:
tar -xvf etcd-v3.11.11-linux-amd64.tar.gz
mv etcd-v3.11.11-linux-amd64 /usr/local/bin/
ln -s /usr/local/bin/etcd-v3.11.11-linux-amd64 /usr/local/bin/etcd
创建etcd数据及日志目录
mkdir -p /var/lib/etcd.data/{data,log} (目录自定义)
chown -R etcd:etcd /var/lib/etcd.data
3、etcd配置
3.1 配置node1节点
修改etcd自带的默认配置文件
vim /etc/etcd/etcd.conf(默认路径)
重点修改配置以下关键的参数内容:
ETCD_DATA_DIR="/var/lib/etcd/data.etcd" //etcd的数据目录,持久化etcd数据
ETCD_LISTEN_PEER_URLS="http://192.168.0.11:2380" //集群内部节点间通信监听地址及端口
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.11:2379,http://127.0.0.1:2379" //客户端连接的监听地址及端口
ETCD_NAME="node11" //集群内当前节点的唯一标识(可使用节点主机名)
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.11:2380" //集群中其他节点通过此地址及端口连接访问本节点
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.11:2379" //客户端通过本端口及地址访问本节点
ETCD_INITIAL_CLUSTER="node11=http://192.168.0.11:2380,node12=http://192.168.0.12:2380,node13=http://192.168.0.13:2380" //集群初始成员列表信息,新集群启动时通过该配置发现彼此
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" //集群的唯一标识符
ETCD_INITIAL_CLUSTER_STATE="new" //定义集群初始状态
3.2 配置node2节点和node3节点
为了方便配置,直接将node1的/etc/etcd/etcd.conf copy至node2和node3,再修改以上关键参数信息即可;
4、启动etcd
在三个节点同时执行
systemctl start etcd //启动etcd服务
systemctl enable etcd //设置etcd服务开机自启动(可选)
systemctl status etcd //检查etcd服务状态
5、验证etcd
5.1 etcd集群的状态及成员
检查etcd集群的健康状态 etcdctl cluster-health
检查etcd成员 etcdctl member list
示例中 isLeader代表了当前集群哪个节点是etcd的leader节点
5.2 etcd数据操作验证
6、etcd使用场景扩展
6.1 etcd数据定期备份
当需要定时备份etcd数据时,可以借用 crontab 的定时任务机制实现;
6.1.1 编辑crontab
crontab -e
0 1 * * * etcdctl snapshot save /backups/etcd-snapshot-$(date +%Y%m%d).db
crontab -l
6.1.2 etcd数据恢复
# 停止 etcd 服务
systemctl stop etcd //回复数据前一定stop etcd服务
# 备份当前数据(防止误操作)
mv /var/lib/etcd /var/lib/etcd.bak
# 创建新数据目录并恢复 (三个节点均恢复)
mkdir /var/lib/etcd
etcdctl restore \
--data-dir /var/lib/etcd \ # 恢复目标路径
--backup-dir /backups/etcd-20231010 # 备份源路径
# 启动 etcd
systemctl start etcd
避坑策略
坑1:网路通信可靠性
确保节点间 双向通信畅通(尤其端口 2379(客户端)、2380(节点间 Raft 协议)),防火墙/安全组规则需放行。
遇到etcd抛错网络相关问题,首先需要检查 网络及相关端口的连通性。
1.1 验证监听端口
ss -tulnp | grep etcd
正常应该看到:2379(客户端通信) 2380(节点间通信)
1.2 防火墙问题
firewall-cmd --list-ports --permanent
若未开发,则需要执行以下命令放开:
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --reload
1.3 telnet 检测ip及端口连通性
验证2379和2380 的连通性,正常情况下应该如下图所示:
坑2:节点间时间不同步
etcd集群内各个节点时间必须严格保证一致性,若不一致将导致集群出现各种问题;