ETCD添加删除集群成员过程
ETCD_INITIAL_CLUSTER_STATE="new/existing"
有两个值new和existing。如果填为existing,则该member启动时会尝试与其他member交互。
集群初次建立时,要填为new,通过测试发现最后一个节点填existing也正常(因为属于后加入,不能同时启动进程,existing要落后前两个节点一丢丢时间启动),其他节点不能填为existing。
集群运行过程中,一个member故障后恢复时填为existing,如果是new的话需要集群没有业务数据。
概括如下:
new适用于无数据集群加入(就是所有节点都没有业务数据)
existing适用于有数据的集群加入(有两个节点有数据,新节点没有数据)
ETCD删除成员过程
先创建环境变量
export ETCDCTL_ENDPOINTS=https://172.16.98.175:2379,https://172.16.98.176:2379,https://172.16.98.177:2379
export ETCDCTL_CACERT=/opt/etcd/ssl/ca.pem
export ETCDCTL_CERT=/opt/etcd/ssl/client.pem
export ETCDCTL_KEY=/opt/etcd/ssl/client-key.pem
检查ID
[root@master ~]# etcdctl member list --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379,https://172.28.17.85:2379" --write-out=table
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| 418294c668bdb445 | started | etcd-3 | https://172.28.17.85:2380 | https://172.28.17.85:2379 | false |
| 4c978cbca553cd70 | started | etcd-1 | https://172.21.130.169:2380 | https://172.21.130.169:2379 | false |
| cc0bba643b3d8ce1 | started | etcd-2 | https://172.21.130.168:2380 | https://172.21.130.168:2379 | false |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
根据ID删除成员
[root@master ~]# etcdctl member remove 418294c668bdb445 --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379"
Member 418294c668bdb445 removed from cluster 28d9bab5a0f18219
查看删除后的结果
[root@master ~]# etcdctl member list --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379,https://172.28.17.85:2379" --write-out=table +------------------+---------+--------+-----------------------------+-----------------------------+------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER | +------------------+---------+--------+-----------------------------+-----------------------------+------------+ | 4c978cbca553cd70 | started | etcd-1 | https://172.21.130.169:2380 | https://172.21.130.169:2379 | false | | cc0bba643b3d8ce1 | started | etcd-2 | https://172.21.130.168:2380 | https://172.21.130.168:2379 | false | +------------------+---------+--------+-----------------------------+-----------------------------+------------+
删除了那么我们要怎么添加节点?
1、在失去的那台节点上查看一下现在的状态(因为只是服务挂了所以etcdctl请求查看还是可以的)
2、删除现有的数据(不删除你可以试试,没有明显报错你会很精彩,因为数据内的local-member-id还是之前的)
3、在失去的那台节点上添加节点到集群,为什么?
1)因为添加完会临时在机器上生成新增加的环境变量,重启服务时会直接调用。
2)还有人说那删除数据后直接吧state状态改成new重启就好了,很不幸的告诉你抱歉不好使。因为在把成员移出集群的时候他会做一个记录,而且你在用new加入集群的时候用的id通过计算还是之前删除的那个id。所以直接检测到那个记录你被永久移除导致失败。)
May 18 15:49:43 iZuf6h1kfgutxc3el68z2lZ etcd: {"level":"warn","ts":"2021-05-18T15:49:43.599+0800","caller":"etcdserver/server.go:1095","msg":"server error","error":"the member has been permanently removed from the cluster"}
3)还有人会认为把主的数据拷贝到新节点或者故障节点不就好了,但是抱歉他会强你拷贝过去数据的节点位置。(如下)
[root@master1 ~]# etcdctl member list --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379,https://172.28.17.85:2379" --write-out=table
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| 4c978cbca553cd70 | started | etcd-3 | https://172.21.130.169:2380 | https://172.28.17.85:2379 | false |
| cc0bba643b3d8ce1 | started | etcd-2 | https://172.21.130.168:2380 | https://172.21.130.168:2379 | false |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
正确做法:
1、删除旧数据
2、执行加入命令etcdctl member add etcd-3 --peer-urls="https://172.28.17.85:2380" --endpoints="https://172.21.130.169:2379,https://172.21.130.168:2379"
3、重启服务即可
最后记得如果之间add成员的时候指定了--learner参数
在为新添加的学习成员启动新的etcd进程后,使用etcdctl member promote将学习成员提升为投票成员。
etcdctl member promote 9bf1b35fc7761a23
执行上面命令的原因:
添加一个新的学习节点到集群,该learn作为无投票成员加入集群,但仍然从leader接收所有数据。在learn节点赶上leader的日志前。learn节点既不投票也不计算法定人数(无票)。当学习者赶上领导者的进度时,成员API可以将其提升为一个有投票权的成员,然后将其计入法定人数(仲裁)。仲裁大小 3。
Etcd服务器验证提升请求,确保其运行安全。只有在它的日志赶上leader的之后,学习者才能被提升为有投票权的成员。“学习者”在晋升前只能作为备用节点:领导权不能转移给“学习者”。learn拒绝客户端读写(客户端quorum(仲裁)不会将请求路由到学习learn)。这意味着learn不需要向leader发出阅读索引请求。但是允许检查状态
此外,etcd限制了集群可以拥有的learn的总数,并避免了日志复制使leader过载。learn从不自我推销。而etcd提供了learn状态信息和安全检查,集群管理员必须做出是否提升学习者的最终决定。
只设置learn状态并默认:默认一个新成员状态给learn将大大提高成员重新配置的安全性,因为learn不会改变quorum的大小。错误配置将始终是可逆的,而不会丢失quorum。
使投票成员的提升完全自动化:一旦learn赶上了leader的日志,集群就可以自动提升learn。Etcd要求用户定义一定的阈值,一旦满足要求,学习者将自己提升为有投票权的成员。
从用户的角度来看,“成员添加”命令将以与今天相同的方式工作,但学习者功能提供了更高的安全性。
设置learn为备用故障切换节点:learn作为备用节点加入,当集群可用性受到影响时自动升级。使learn可以作为只读节点,永远不会升级。在弱一致性模式下,learn只接收leader发来的数据,不处理写入。在没有共识开销的情况下,在本地提供读取服务将大大减少leader的工作负载,但可能会提供过时的数据。在强一致性模式下,learn向leader请求读索引以提供最新数据,但仍然拒绝写。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫