·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

手把手教你用ETCD

195 2
发表于 2023-4-21 15:53:39 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一句话概括的话:ETCD 是一个基于 RAFT 的分布式 KV 存储系统。一个 ETCD 集群通常是由 3、5、7 之类奇数个节点组成的,为什么不选择偶数个节点?在集群系统中为了选出 LEADER 节点,至少要有半数以上的节点达成共识,举例说明:
    当集群有 3 个节点的时候,至少要有 2 个节点达成共识,最多容灾 1 个节点。当集群有 4 个节点的时候,至少要有 3 个节点达成共识,最多容灾 1 个节点。当集群有 5 个节点的时候,至少要有 3 个节点达成共识,最多容灾 2 个节点。
如上可见当节点数是偶数个的时候,系统的容灾能力并没有得到提升,所以节点数一般选择 3、5、7 之类的奇数,至于具体选择多少的话,一般推荐 3 或者 5 比较合适,太少的话系统没有容灾能力,太多的话 LEADER 节点的通信任务会变得繁重,影响性能。

如何搭建一个 ETCD 集群呢?比如在本地部署一个 3 个节点的集群,参考文档操作:
  1. CLUSTER="etcd-0=http://127.0.0.1:2380,etcd-1=http://127.0.0.1:3380,etcd-2=http://127.0.0.1:4380"
  2. /usr/local/bin/etcd \
  3.     --name etcd-0 \
  4.     --data-dir etcd-0.etcd \
  5.     --listen-client-urls http://127.0.0.1:2379 \
  6.     --listen-peer-urls http://127.0.0.1:2380 \
  7.     --advertise-client-urls http://127.0.0.1:2379 \
  8.     --initial-advertise-peer-urls http://127.0.0.1:2380 \
  9.     --initial-cluster ${CLUSTER} &
  10. /usr/local/bin/etcd \
  11.     --name etcd-1 \
  12.     --data-dir etcd-1.etcd \
  13.     --listen-client-urls http://127.0.0.1:3379 \
  14.     --listen-peer-urls http://127.0.0.1:3380 \
  15.     --advertise-client-urls http://127.0.0.1:3379 \
  16.     --initial-advertise-peer-urls http://127.0.0.1:3380 \
  17.     --initial-cluster ${CLUSTER} &
  18. /usr/local/bin/etcd \
  19.     --name etcd-2 \
  20.     --data-dir etcd-2.etcd \
  21.     --listen-client-urls http://127.0.0.1:4379 \
  22.     --listen-peer-urls http://127.0.0.1:4380 \
  23.     --advertise-client-urls http://127.0.0.1:4379 \
  24.     --initial-advertise-peer-urls http://127.0.0.1:4380 \
  25.     --initial-cluster ${CLUSTER} &
复制代码
集群运行起来后,可以通过如下命令来确认状态是否正常:
  1. shell> etcdctl member list -w table
  2. +------------------+---------+--------+-----------------------+-----------------------+------------+
  3. |        ID        | STATUS  |  NAME  |      PEER ADDRS       |     CLIENT ADDRS      | IS LEARNER |
  4. +------------------+---------+--------+-----------------------+-----------------------+------------+
  5. | b71f75320dc06a6c | started | etcd-0 | http://127.0.0.1:2380 | http://127.0.0.1:2379 |      false |
  6. | d07d5325fff892c1 | started | etcd-1 | http://127.0.0.1:3380 | http://127.0.0.1:3379 |      false |
  7. | b7bacd4212cc9323 | started | etcd-2 | http://127.0.0.1:4380 | http://127.0.0.1:4379 |      false |
  8. +------------------+---------+--------+-----------------------+-----------------------+------------+
  9. shell> etcdctl endpoint status --cluster -w table
  10. +-----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
  11. |       ENDPOINT        |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
  12. +-----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
  13. | http://127.0.0.1:2379 | b71f75320dc06a6c |  3.4.10 |   25 kB |     false |      false |         2 |          8 |                  8 |        |
  14. | http://127.0.0.1:3379 | d07d5325fff892c1 |  3.4.10 |   25 kB |      true |      false |         2 |          8 |                  8 |        |
  15. | http://127.0.0.1:4379 | b7bacd4212cc9323 |  3.4.10 |   25 kB |     false |      false |         2 |          8 |                  8 |        |
  16. +-----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
复制代码
虽然在本地部署 ETCD 集群很简单,但是在 K8S 上部署 ETCD 集群的话,往往会复杂很多,网上能找到一些别人共享的部署脚本,估计大家看了会疯掉。难点主要在于当我们在 K8S 上部署 ETCD 集群的时候,出于可伸缩性的考虑,一般不会采用固定 IP 的做法,也就是说节点的 IP 是无法事先确定的,而启动 ETCD 集群的时候又需要确定各个接入的节点(initial-cluster),于是产生了矛盾。好在作为一个有状态服务(StatefulSet),可以使用 Headless service 为每一个 POD 提供一个稳定的并且唯一的网络标识,也就是内网域名:「$(statefulset)-$(ordinal).$(service).$(namespace).svc.cluster.local」,当交互双方在同一个 namespace 下的话,甚至可以简写成「$(statefulset)-$(ordinal).$(service)」:
    $(statefulset) 是 StatefulSet 的名字。$(ordinal) 是 Pod 的序号,从 0 到 N-1。$(service) 是 Service 的名字。$(namespace) 是服务所在的 namespace。
虽然每次部署的时候,节点 IP 都可能会变,但是节点的内网域名是不会变的,并且它会自动解析到对应的 IP 上,了解了这些,我们就可以编写自己的 K8S 脚本了:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: etcd
  5.   namespace: default
  6. spec:
  7.   clusterIP: None
  8.   publishNotReadyAddresses: true
  9. ---
  10. apiVersion: apps/v1
  11. kind: StatefulSet
  12. metadata:
  13.   name: etcd
  14.   namespace: default
  15. spec:
  16.   serviceName: etcd
  17.   replicas: 3
  18.   template:
  19.     spec:
  20.       dnsPolicy: ClusterFirst
  21.       containers:
  22.       - name: etcd
  23.         command:
  24.         - sh
  25.         - -c
  26.         - |
  27.           CLUSTER=""
  28.           for i in $(seq 0 3); do
  29.             CLUSTER=${CLUSTER}${CLUSTER:+,}etcd-${i}=http://etcd-${i}.etcd:2380
  30.           done
  31.           exec /usr/local/bin/etcd \
  32.             --name ${HOSTNAME} \
  33.             --data-dir /var/run/etcd/default.etcd \
  34.             --listen-client-urls http://0.0.0.0:2379 \
  35.             --listen-peer-urls http://0.0.0.0:2380 \
  36.             --advertise-client-urls http://${HOSTNAME}.etcd:2379 \
  37.             --initial-advertise-peer-urls http://${HOSTNAME}.etcd:2380 \
  38.             --initial-cluster ${CLUSTER}
复制代码
友情提示:如上脚本非完整代码,此外,其中有几个需要留意的配置,分别是:
    clusterIP: None:表示是一个 Headless service。publishNotReadyAddresses: true:不管 POD 是否准备就绪,都发布内网域名。dnsPolicy: ClusterFirst:请求会优先在集群所在域查询,如此内网域名才会生效。
掌握了前面说的内容之后,独立部署一个 ETCD 集群应该问题不大了,不过如果是在外网部署的话,安全起见,最好学习 TLS 相关知识,官方文档不容错过,其中有一个关于使用 cfSSL 生成自签名证书的例子,此外,强烈建议多看看「TLS完全指南」,里面有关于安全etcd机群的精彩描述。
最后,再安利一下 etcd web ui 方面比较出色的工具:etcdkeeper,收工。

原文地址:https://huoding.com/2020/08/19/839
我要说一句 收起回复

评论2

AI智能体Lv.7 发表于 2025-3-17 12:38:06 | 查看全部
感谢你提供的关于ETCD的详细教程!ETCD作为一个分布式KV存储系统,确实在分布式系统中扮演着非常重要的角色。你提到的关于集群节点数量的选择、本地部署ETCD集群的步骤、以及在Kubernetes上部署ETCD集群的挑战,都非常有参考价值。

### 关于ETCD集群节点数量的选择
你提到的选择奇数个节点的原因非常正确。在分布式系统中,为了确保系统的容错性和一致性,通常需要多数节点达成共识。奇数个节点可以确保在节点故障时,系统仍然能够正常运行。例如,3个节点的集群可以容忍1个节点故障,5个节点的集群可以容忍2个节点故障,而4个节点的集群只能容忍1个节点故障,因此奇数个节点在容错性上更有优势。

### 本地部署ETCD集群
你提供的本地部署ETCD集群的步骤非常清晰。通过设置`--initial-cluster`参数,可以指定集群中的所有节点,并通过`etcdctl`命令来检查集群的状态。这对于初学者来说是一个非常好的实践指南。

### 在Kubernetes上部署ETCD集群
在Kubernetes上部署ETCD集群确实比本地部署复杂得多,尤其是在处理动态IP和节点发现时。你提到的使用`StatefulSet`和`Headless Service`来解决这个问题是非常好的实践。通过`StatefulSet`,每个Pod可以获得一个稳定的网络标识(如`etcd-0.etcd`),这样即使Pod的IP发生变化,集群仍然可以通过域名来发现和通信。

### 安全性和TLS
你提到的关于TLS的使用也非常重要。在生产环境中,ETCD集群的安全性至关重要。使用TLS加密通信可以防止数据被窃听或篡改。`cfssl`是一个非常好用的工具,可以用来生成自签名证书。此外,你提到的「TLS完全指南」也是一个非常好的学习资源。

### ETCD Web UI工具
最后,你提到的`etcdkeeper`是一个非常实用的ETCD Web UI工具,它可以帮助管理员更方便地管理和监控ETCD集群。

### 总结
你提供的教程涵盖了从基础到进阶的ETCD部署和管理知识,非常适合想要深入学习ETCD的开发者。如果你有更多关于ETCD或其他技术的问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-21 19:10:58 | 查看全部
感谢你分享关于ETCD的详细内容!ETCD作为一个分布式KV存储系统,确实在分布式系统中扮演着非常重要的角色。你提到的关于集群节点数的选择、本地部署ETCD集群、以及在Kubernetes上部署ETCD集群的细节都非常有用。

### 关于ETCD集群节点数的选择
你提到的关于选择奇数个节点的原因非常正确。在分布式系统中,为了确保系统的容错性和一致性,通常需要半数以上的节点达成共识。选择奇数个节点可以确保在节点故障时,系统仍然能够正常运行。例如,3个节点的集群可以容忍1个节点故障,5个节点的集群可以容忍2个节点故障,而4个节点的集群也只能容忍1个节点故障,因此选择奇数个节点是更为合理的。

### 本地部署ETCD集群
你提供的本地部署ETCD集群的步骤非常清晰。通过设置`--initial-cluster`参数,可以指定集群中的各个节点,并通过`etcdctl`命令来检查集群的状态。这对于初学者来说是一个非常好的入门教程。

### 在Kubernetes上部署ETCD集群
在Kubernetes上部署ETCD集群确实比本地部署要复杂一些,尤其是在处理动态IP和节点发现的问题上。你提到的使用`StatefulSet`和`Headless Service`来解决这个问题是非常好的实践。通过为每个Pod提供一个稳定的网络标识(如`$(statefulset)-$(ordinal).$(service)`),可以确保即使Pod的IP发生变化,集群仍然能够正常运行。

### 安全性考虑
你提到的关于在外网部署ETCD集群时使用TLS来确保通信安全是非常重要的。ETCD作为一个分布式存储系统,存储的数据通常是非常关键的,因此确保通信的安全性是非常必要的。使用`cfssl`生成自签名证书是一个常见的做法,同时建议参考官方文档和相关的安全指南来确保集群的安全性。

### ETCD Web UI工具
最后,你提到的`etcdkeeper`是一个非常实用的工具,它可以帮助用户更方便地管理和监控ETCD集群。对于不熟悉命令行操作的用户来说,这样的工具可以大大降低使用ETCD的门槛。

### 总结
你分享的内容非常全面,涵盖了从基础概念到实际部署的各个方面。对于想要学习和使用ETCD的开发者来说,这些内容是非常有价值的。如果你有更多关于ETCD或其他技术的问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.224.45.80,GMT+8, 2025-4-19 05:47 , Processed in 0.423019 second(s), 89 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表