总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》
一、功能简介
1、什么是etcd
etcd 是一个分布式、可靠的键值存储系统,用于分布式系统中存储关键核心数据。它由 CoreOS 开发,并且是开源的,授权协议为 Apache 许可证。etcd 内部采用了 Raft 一致性算法,可以实现配置共享和服务发现。 etcd中文文档可参考如下:Etcd 中文文档或者Etcd官方文档中文版。
2、etcd 的主要特性包括:
1、简单:安装配置简单,提供了 HTTP API 进行交互,使用也很简单。
2、键值对存储:将数据存储在分层组织的目录中,类似于标准文件系统。
3、监控变更:可以监视特定的键或目录以检测更改,并对值的更改作出反应。
4、 支持TLS客户端安全认证。
5、性能:单实例(V3)支持每秒10KQps。
6、可靠: 使用 Raft 算法充分保证了分布式系统数据的强一致性。
7、默认情况下,etcd 会将数据更新持久化到磁盘上。
8、使用 Go 语言编写,易于部署和维护。
3、典型应用场景:
1. 服务注册与发现:在微服务架构中,etcd 可以作为服务发现的服务注册中心。
2. 配置管理:存储和管理应用程序的配置信息。
3. 消息发布与订阅:使用 etcd 的 watch 机制来实现消息的发布与订阅模式。
4. 分布式通知与协调:用于在分布式系统中实现通知和协调逻辑。
5. 分布式锁:利用 etcd 实现分布式锁,确保分布式系统中资源的互斥访问。
4、有2个著名开源项目使用etcd
1、Kubernetes (K8s):Kubernetes 使用 etcd 作为其核心存储系统,用于存储集群的状态信息,如节点、Pods、Services、Volumes 等。Kubernetes 依赖 etcd 来保证其状态的一致性和高可用性。
2、CoreDNS: CoreDNS 是一个灵活且可扩展的 DNS 服务器,它使用 etcd 作为数据存储后端之一。CoreDNS 可以通过 etcd 插件来实现动态的 DNS 记录更新。
5、etcd、Zookeeper 和 Consul对比
特性/工具 | etcd | zookeeper | Consul |
---|---|---|---|
一致性模型 | 强一致性 (Raft) | 强一致性 (ZAB) | 最终一致性 (可配置为强一致性) |
扩展性 | 良好,适合大量键值对 | 良好,但在大量数据时可能遇到性能瓶颈 | 可能遭受高延迟和内存压力 |
功能和易用性 | API 简洁,易于使用 | 功能强大,支持多种高级特性 | API 设计友好,易于集成 |
服务发现 | 支持服务发现 | 支持服务发现 | 专门设计用于服务发现 |
健康检查 | 不直接支持 | 不直接支持 | 支持健康检查 |
安全性 | 支持客户端证书验证 | 支持安全配置 | 支持 TLS 和 ACLs |
多数据中心 | 支持多数据中心配置 | 支持多数据中心配置 | 原生支持多数据中心配置 |
语言和生态 | 使用 Go 语言,广泛的客户端库支持 | 使用 Java 编写,适合 Java 应用程序 | 使用 Go 语言,支持多种语言的客户端库 |
社区和生态 | 活跃的社区,是 Kubernetes 的一部分 | 历史悠久,庞大的用户基础 | 良好的文档和社区支持 |
性能 | 在处理大量键值对时表现出色 | 在某些场景下提供了更好的最小延迟 | 性能取决于使用场景 |
使用场景 | 配置管理、服务注册和发现等场景 | 复杂协调服务 | 服务发现、健康检查和配置管理等场景 |
二、部署说明
1、环境信息
主机IP | 节点 | 操作系统 | 内核版本 | etcd版本 |
---|---|---|---|---|
192.168.1.111 | etcd-1 | Ubuntu 22.04.4 LTS | 5.15.0-113-generic | 3.5.15 |
192.168.1.112 | etcd-2 | Ubuntu 22.04.4 LTS | 5.15.0-113-generic | 3.5.15 |
192.168.1.113 | etcd-3 | Ubuntu 22.04.4 LTS | 5.15.0-113-generic | 3.5.15 |
2、端口说明
端口 | 端口号 | 用途 |
---|---|---|
Client API 端口 | 2379 | 提供 HTTP API 服务,用于客户端与 etcd 交互 |
Peer 通信端口 | 2380 | 用于 etcd 集群内部成员之间的通信,包括数据同步和心跳检测 |
监控端口 | 2381(可自定义) | Prometheus度量指标提供程序使用此端口来提供etcd的性能指标 |
网关端口 | 23790 | etcd集群TCP代理端口,转发应用请求到后端客户端 |
三、部署etcd集群
3.1、创建用户
说明:以下操作需要在etcd集群各个节点上执行。
root@ecs-6200:~# groupadd --gid 1100 etcd
root@ecs-6200:~# useradd --uid 1100 --gid 1100 --no-create-home --shell /bin/bash etcd
root@ecs-6200:~# passwd etcd
说明:如果当前操作系统已经存在id为1100的用户,可以修改成其它用户id。
3.2、创建证书
说明:手动创建证书比较麻烦,这里采用了etcd证书一键生成工具来创建etcd相关证书。这里默认在etcd-1节点上执行,证书创建完成后手动拷贝到证书到etcd集群各个节点证书目录下(/etc/ssl/ecd)。
注意:以下操作只需在etcd集群任意一个节点上执行或者其它主机,
1、编辑env.conf文件
root@ecs-6200:/opt/etcd_cluster_ssl# vim env.conf
# cfssl生成证书过程日志打印级别<0:调试 1:信息 2:警告 3:错误 4:严重>
export loglevel="3"
# etcd集群所有主机ip地址和主机名,<建议多写几个ip,方便后期扩容>,ip地址之间必须使用逗号分隔
export etcd_hostname_list="127.0.0.1,etcd-1,etcd-2,etcd-3,192.168.1.111,192.168.1.112,193.168.1.113"
2、生成证书
root@ecs-6200:/opt/etcd_cluster_ssl# ./op.sh build
如下图所示:
3、创建证书目录
说明:以下操作需要在etcd集群各个节点上执行。
root@ecs-6200:~# mkdir -p /etc/ssl/etcd
root@ecs-6200:~# chown etcd.etcd /etc/ssl/etcd -R
4、分发证书
说明:当前是以root用户分发证书,分发完成后,再重新进行授权。
etcd-1节点
root@ecs-6200:/opt/etcd_cluster_ssl# cp etcd/*.pem /etc/ssl/etcd/
root@ecs-6200:/opt/etcd_cluster_ssl# scp etcd/*.pem root@192.168.1.112:/etc/ssl/etcd/
root@ecs-6200:/opt/etcd_cluster_ssl# scp etcd/*.pem root@192.168.1.113:/etc/ssl/etcd/
root@ecs-6200:~# chown etcd.etcd /etc/ssl/etcd -R
etcd-2节点
root@ecs-6201:~# chown etcd.etcd /etc/ssl/etcd -R
etcd-3节点
root@ecs-6202:~# chown etcd.etcd /etc/ssl/etcd -R
3.3、软件安装
1、下载二进制包
说明:以下操作需要在etcd集群各个节点上执行。
root@ecs-6200:~# wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
root@ecs-6200:~# tar axf etcd-v3.5.15-linux-amd64.tar.gz
root@ecs-6200:~# cp etcd-v3.5.15-linux-amd64/etcd /usr/local/bin
root@ecs-6200:~# cp etcd-v3.5.15-linux-amd64/etcdctl /usr/local/bin
root@ecs-6200:~# cp etcd-v3.5.15-linux-amd64/etcdutl /usr/local/bin
2、创建数据目录和日志文件目录
说明:以下操作需要在etcd集群各个节点上执行。
root@ecs-6200:~# mkdir -p /data/basic-data/etcd/data
root@ecs-6200:~# mkdir -p /data/basic-data/etcd/logs
root@ecs-6200:~# chown etcd.etcd /data/basic-data/etcd -R
3、配置systemd管理etcd
1、etcd-1节点
root@ecs-6200:~# vim /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=etcd-1 \
--data-dir=/data/basic-data/etcd/data \
--wal-dir=/data/basic-data/etcd/data/wal \
--snapshot-count=100000 \
--max-snapshots=5 \
--max-wals=5 \
--cert-file=/etc/ssl/etcd/server.pem \
--key-file=/etc/ssl/etcd/server-key.pem \
--trusted-ca-file=/etc/ssl/etcd/ca.pem \
--peer-cert-file=/etc/ssl/etcd/peer.pem \
--peer-key-file=/etc/ssl/etcd/peer-key.pem \
--peer-trusted-ca-file=/etc/ssl/etcd/ca.pem \
--listen-peer-urls=https://192.168.1.111:2380 \
--listen-client-urls=https://192.168.1.111:2379,http://127.0.0.1:2379 \
--max-request-bytes=1572864 \
--quota-backend-bytes=2147483648 \
--initial-advertise-peer-urls=https://192.168.1.111:2380 \
--advertise-client-urls=https://192.168.1.111:2379 \
--initial-cluster-token=etcd-cluster-token \
--initial-cluster="etcd-1=https://192.168.1.111:2380,etcd-2=https://192.168.1.112:2380,etcd-3=https://192.168.1.113:2380" \
--initial-cluster-state=new \
--auto-compaction-retention=12 \
--auto-compaction-mode=periodic \
--metrics=basic \
--listen-metrics-urls=http://192.168.1.111:2381 \
--log-outputs=/data/basic-data/etcd/logs/etcd.log \
--log-level=info \
--enable-log-rotation=true
User=etcd
Group=etcd
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
2、etcd-2节点
root@ecs-6201:~# vim /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=etcd-2 \
--data-dir=/data/basic-data/etcd/data \
--wal-dir=/data/basic-data/etcd/data/wal \
--snapshot-count=100000 \
--max-snapshots=5 \
--max-wals=5 \
--cert-file=/etc/ssl/etcd/server.pem \
--key-file=/etc/ssl/etcd/server-key.pem \
--trusted-ca-file=/etc/ssl/etcd/ca.pem \
--peer-cert-file=/etc/ssl/etcd/peer.pem \
--peer-key-file=/etc/ssl/etcd/peer-key.pem \
--peer-trusted-ca-file=/etc/ssl/etcd/ca.pem \
--listen-peer-urls=https://192.168.1.112:2380 \
--listen-client-urls=https://192.168.1.112:2379,http://127.0.0.1:2379 \
--max-request-bytes=1572864 \
--quota-backend-bytes=2147483648 \
--initial-advertise-peer-urls=https://192.168.1.112:2380 \
--advertise-client-urls=https://192.168.1.112:2379 \
--initial-cluster-token=etcd-cluster-token \
--initial-cluster="etcd-1=https://192.168.1.111:2380,etcd-2=https://192.168.1.112:2380,etcd-3=https://192.168.1.113:2380" \
--initial-cluster-state=new \
--auto-compaction-retention=12 \
--auto-compaction-mode=periodic \
--metrics=basic \
--listen-metrics-urls=http://192.168.1.112:2381 \
--log-outputs=/data/basic-data/etcd/logs/etcd.log \
--log-level=info \
--enable-log-rotation=true
User=etcd
Group=etcd
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
3、etcd-3节点
root@ecs-6202:~# vim /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=etcd-3 \
--data-dir=/data/basic-data/etcd/data \
--wal-dir=/data/basic-data/etcd/data/wal \
--snapshot-count=100000 \
--max-snapshots=5 \
--max-wals=5 \
--cert-file=/etc/ssl/etcd/server.pem \
--key-file=/etc/ssl/etcd/server-key.pem \
--trusted-ca-file=/etc/ssl/etcd/ca.pem \
--peer-cert-file=/etc/ssl/etcd/peer.pem \
--peer-key-file=/etc/ssl/etcd/peer-key.pem \
--peer-trusted-ca-file=/etc/ssl/etcd/ca.pem \
--listen-peer-urls=https://192.168.1.113:2380 \
--listen-client-urls=https://192.168.1.113:2379,http://127.0.0.1:2379 \
--max-request-bytes=1572864 \
--quota-backend-bytes=2147483648 \
--initial-advertise-peer-urls=https://192.168.1.113:2380 \
--advertise-client-urls=https://192.168.1.113:2379 \
--initial-cluster-token=etcd-cluster-token \
--initial-cluster="etcd-1=https://192.168.1.111:2380,etcd-2=https://192.168.1.112:2380,etcd-3=https://192.168.1.113:2380" \
--initial-cluster-state=new \
--auto-compaction-retention=12 \
--auto-compaction-mode=periodic \
--metrics=basic \
--listen-metrics-urls=http://192.168.1.113:2381 \
--log-outputs=/data/basic-data/etcd/logs/etcd.log \
--log-level=info \
--enable-log-rotation=true
User=etcd
Group=etcd
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
参数解释如下所示:
1、–name: 成员名称,用于标识集群中的成员。
2、–data-dir: 数据目录,用于存储 etcd 的数据文件。
3、–wal-dir: WAL (Write-Ahead Log) 目录,用于存储 etcd 的日志文件。
4、–snapshot-count: 快照阈值,当写入操作达到这个阈值时,etcd 会触发快照。
5、–max-snapshots: 最大快照数量。
6、–max-wals: 最大 WAL 文件数量。
7、–listen-peer-urls: 监听的 peer URLs,用于 etcd 成员之间的通信。
8、–listen-client-urls: 监听的客户端 URLs,用于客户端访问 etcd。
9、–max-request-bytes: 单个请求的最大大小,单位是字节。默认值为1572863,建议不要修改,设置过大会导致etcd性能下载,尤其是高负载情况下。
10、–quota-backend-bytes: 后端存储配额,单位是字节,默认值:2 GB,官方建议的最大存储大小为 8 GB。如果存储大小超过 8 GB,可能会导致性能下降。
11、–initial-advertise-peer-urls: 对外宣传的 peer URLs,用于 etcd 成员之间的通信。
12、–advertise-client-urls: 对外宣传的客户端 URLs,用于客户端访问 etcd。
13、–initial-cluster-token: 集群标识符,用于区分不同的集群。
14、–initial-cluster: 初始集群配置,用于初始化集群时指定成员及其 URL。
15、–initial-cluster-state: 初始集群状态,可以是 new 或 existing。
16、–auto-compaction-retention: 自动压缩保留的时间,单位是小时。
17、–auto-compaction-mode: 自动压缩模式,可以是 periodic 或 revision。
18、–metrics: 导出指标的详细程度,可以是 basic 或 extensive。
19、–listen-metrics-urls: 监听的 metrics 和 health 检查请求的 URL。
20、–log-outputs: 日志输出文件路径。
21、–log-level: 日志级别,可以是 debug, info, warn, error。
22、–enable-log-rotation: 是否启用日志轮换。
4、启动服务
说明:以下操作需要在etcd集群各个节点上执行。
systemctl daemon-reload && systemctl start etcd && systemctl enable etcd
3.4、集群检查
1、查看服务状态
说明:以下操作只需在etcd集群任意一个节点上执行。
ps -ef | grep etcd
systemctl status etcd
如下图所示:
2、查看集群信息
说明:以下操作只需在etcd集群任意一个节点上执行。
etcdctl --endpoints="https://192.168.1.111:2379,https://192.168.1.112:2379,https://192.168.1.113:2379" --cacert /etc/ssl/etcd/ca.pem --cert /etc/ssl/etcd/peer.pem --key /etc/ssl/etcd/peer-key.pem member list --write-out table
etcdctl --endpoints="https://192.168.1.111:2379,https://192.168.1.112:2379,https://192.168.1.113:2379" --cacert /etc/ssl/etcd/ca.pem --cert /etc/ssl/etcd/peer.pem --key /etc/ssl/etcd/peer-key.pem endpoint health --write-out table
etcdctl --endpoints="https://192.168.1.111:2379,https://192.168.1.112:2379,https://192.168.1.113:2379" --cacert /etc/ssl/etcd/ca.pem --cert /etc/ssl/etcd/peer.pem --key /etc/ssl/etcd/peer-key.pem endpoint status --write-out table
如下图所示:
3、在浏览器上查看etcd监控信息
http://192.168.1.111:2381/metrics
http://192.168.1.112:2381/metrics
http://192.168.1.113:2381/metrics
3.5、使用etcd网关(可选)
说明:以下操作只需在etcd集群任意一个节点上执行或者集群外另一个节点。
etcd 网关是一个简单的 TCP 代理,转发网络数据到 etcd 集群。网关是无状态和透明的;它既不检查客户端请求也不干涉集群应答。
1、配置systemd管理etcd-gateway
root@ecs-6200:~# vim /etc/systemd/system/etcd-gateway.service
[Unit]
Description=Etcd Gateway
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd gateway start \
--endpoints=192.168.1.111:2379,192.168.1.112:2379,192.168.1.113:2379 \
--listen-addr=0.0.0.0:23790
User=etcd
Group=etcd
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
2、启用etcd-gateway服务
systemctl daemon-reload && systemctl start etcd-gateway && systemctl enable etcd-gateway
3、检查etcd-gateway服务
root@ecs-6200:~# systemctl status etcd-gateway
root@ecs-6200:~# ss -tnulp | grep 23790
如下图所示:
总结:这将配置etcd网关以连接到在192.168.1.111、192.168.1.112和192.168.1.113上的etcd服务器实例。通过这种方式,etcd网关可以作为稳定的本地端点,对于客户端应用程序来说,不会感知到集群实例的变化,从而简化了应用程序与etcd集群的交互过程。
4、客户端通过网关地址去访问集群
root@ecs-6200:~# etcdctl --endpoints="https://192.168.1.111:23790" --cacert /etc/ssl/etcd/ca.pem --cert /etc/ssl/etcd/peer.pem --key /etc/ssl/etcd/peer-key.pem member list --write-out=table
root@ecs-6200:~# etcdctl --endpoints="https://192.168.1.111:23790" --cacert /etc/ssl/etcd/ca.pem --cert /etc/ssl/etcd/peer.pem --key /etc/ssl/etcd/peer-key.pem put /test 123456
root@ecs-6200:~# etcdctl --endpoints="https://192.168.1.111:23790" --cacert /etc/ssl/etcd/ca.pem --cert /etc/ssl/etcd/peer.pem --key /etc/ssl/etcd/peer-key.pem get /test
如下图所示:
四、etcd性能优化
etcd 集群的性能优化可以从多个方面进行,以提高其稳定性和响应速度。下面是一些关键的优化建议:
1、硬件优化
CPU: 确保每台机器都有足够的 CPU 核心数量,特别是对于高并发的读写操作。
内存: 提供充足的 RAM 以支持 etcd 的数据缓存和操作。
磁盘: 使用高速 SSD 存储,以减少 I/O 延迟。
网络: 高速低延迟的网络连接有助于提高集群间的通信效率。
2、配置优化
# --max-request-bytes: 根据需要调整最大请求大小,以适应更大的请求负载。
# --quota-backend-bytes: 设置适当的后端存储大小限制,以避免磁盘空间耗尽。
# --max-snapshots 和 --max-wals: 控制快照和 WAL 文件的数量,以保持合理的磁盘使用率。
# --snapshot-count: 设置合理的快照阈值,以减少快照生成的频率。
# --heartbeat-interval 和 --election-timeout: 根据网络条件调整心跳间隔和选举超时时间。
# --auto-compaction-retention 和 --auto-compaction-mode: 设置自动压缩策略,以定期清理旧数据并释放磁盘空间
3、集群规模
节点数量: 通常推荐至少3个节点以保证高可用性。增加节点数量可以提高容错能力和写入吞吐量。
4、网络优化
减少网络延迟: 确保 etcd 节点位于同一数据中心或具有低延迟的网络连接。
使用私有网络: 使用私有网络而非公共网络进行节点间通信,以减少延迟和提高安全性。
优化网络配置: 调整 TCP 参数,例如 TCP 窗口大小和 TCP 保持时间。
5、负载均衡和流量管理
客户端负载均衡: 使用客户端负载均衡器来分散读取请求。
限流和缓冲: 对客户端请求实施限流策略,以防止过载。
6、日志和调试
日志级别: 根据需要调整日志级别,例如设置为 info 或 debug。
日志轮换: 配置日志轮换策略,以避免日志文件占用过多磁盘空间。
五、etcd安全优化
etcd 的安全优化主要涉及几个方面:传输层安全 (TLS)、访问控制 (RBAC)、审计以及加密存储。下面是关于如何对 etcd 进行安全优化的一些具体步骤:
1、启用 TLS 加密或者启用用户身份认证功能
服务器间通信: 在 etcd 服务器之间启用 TLS 加密,以保护集群内部的数据传输。
客户端通信: 同样地,客户端与 etcd 服务器之间的通信也应启用 TLS 加密。
2、网络隔离
限制网络访问: 仅允许特定的 IP 地址或子网访问 etcd 服务器。
防火墙规则: 配置防火墙规则以阻止不必要的流量。
3、最小权限原则
用户权限: 确保每个用户只拥有完成任务所需的最小权限。
服务账户: 使用普通用户启动etcd服务。
4、备份与恢复
定期备份: 定期备份 etcd 的数据和配置。
恢复计划: 制定灾难恢复计划,包括备份的存储位置、备份频率等。
5、监控与报警
监控日志: 监控 etcd 的操作日志。
安全事件报警: 设置报警机制以检测潜在的安全威胁。
6、软件和版本
升级到最新版本: 使用最新的 etcd 版本,因为新版本通常包含性能改进和 bug 修复。
补丁和安全更新: 定期应用安全更新和补丁。
六、etcd启用监控
执行etcd -h,找到监控参数,如下所示:
七、etcd管理工具
1、e3w
2、etcdv3-browser
3、kstone
4、etcdkeeper
5、etcdmanager
八、etcd数据备份与恢复
《Linux运维总结:etcd 3.5.15集群数据备份与恢复》
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》