InfoQ技术大会双节活动折上折,满10000-1000>> 了解详情
写点什么

ETCD 集群的常见问题处理

2019 年 11 月 15 日

ETCD集群的常见问题处理

ETCD 是一个高可用的分布式 Key/Value 存储系统。它使用 Raft 算法,通过选举来保持集群内各节点状态的一致性。虽然 ETCD 具有高可用的特点,但是也无法避免多个节点宕机,甚至全部宕机的情况发生。如何快速的恢复集群,就变得格外重要。本文将介绍在日常工作中,遇到的 ETCD 集群常见问题的处理方法。


ETCD 常见问题

由于 ETCD 集群需要选举产生 leader,所以集群节点数目需要为奇数来保证正常进行选举。而集群节点的数量并不是越多越好,过多的节点会导致集群同步的时间变长,使得 leader 写入的效率降低。我们线上的 ETCD 集群由三个节点组成(即宕机一台,集群可正常工作),并开启了认证。以下是日常运维工作中,遇到问题的处理过程。


1 集群一个节点宕机的恢复步骤

一个节点宕机,并不会影响整个集群的正常工作。此时可通过以下几步恢复集群:


1)在正常节点上查看集群状态并摘除异常节点

etcdctl endpoint status



2)摘除异常节点

etcdctl member remove $ID


3)重新部署服务后,将节点重新加入集群

  • 由于 ETCD 集群证书依赖于服务器 IP,为避免重新制作证书,需要保持节点 IP 不变。在部署好节点上服务后,先不要启动。

  • 将节点重新加入集群

  • etcdctl member add $name --peer-urls=https://x.x.x.x:2380

  • 此时查看集群状态,新加入的节点状态为 unstarted

  • 删除新增成员的旧数据目录,更改相关配置

  • 需将原 etcd 服务的旧数据目录删除,否则 etcd 会无法正常启动。新增节点是加入已有集群,所以需要修改配置 ETCD_INITIAL_CLUSTER_STATE=“existing”

  • 启动服务 检测集群是否正常

  • systemctl start etcd


使用 etcdctl endpoint status 命令查看集群状态,若三台都正常,集群恢复。


2 集群超过半数节点宕机的恢复步骤

此时集群处于无法正常工作的状态,需要尽快恢复。若机器宕机重启,IP 保持不变,则证书无需重新生成;若 IP 更换,则还需重新生成证书。集群恢复需要使用 ETCD 的备份数据(使用 etcdctl snapshot save 命令备份),或者从 ETCD 数据目录复制 snap/db 文件。以下是恢复步骤:


1)将备份数据恢复至集群

  • 集群部署完成后,先不启动 ETCD 服务,并将原有 ETCD 数据目录删除

  • 依次在三台节点上执行恢复数据的命令

  • etcdctl --name=x.x.x.x-name-3 --endpoints=“https://x.x.x.x:2379” --cert=/var/lib/etcd/cert/etcd-client.pem --key=/var/lib/etcd/cert/etcd-client-key.pem --cacert=/var/lib/etcd/cert/ca.pem --initial-cluster-token=xxxxxxxxxx --initial-advertise-peer-urls=https://x.x.x.x:2380 --initial-cluster=x.x.x.x-name-1=https://x.x.x.x:2380,x.x.x.x-name-2=https://x.x.x.x:2380,x.x.x.x-name-3=https://x.x.x.x:2380 --data-dir=/var/lib/etcd/data.etcd/ snapshot restore snapshot.db

  • 更改数据目录的权限

  • chown -R etcd:etcd data.etcd/


2)启动 ETCD 服务,检查集群状态

  • systemctl start etcd

  • etcdctl member list 查看节点状态


3 database space exceeded 报错恢复步骤

从报错的字面意思来看,是超出数据库空间导致。执行 etcdctl endpoint status,查看集群此时各节点的状态,发现 DB SIZE 为 2.1GB。ETCD官方文档说明提到 ETCD 默认的存储大小是 2GB。超出后,集群无法进行写入。以下为恢复步骤:


1)备份数据

使用 snapshot save 命令备份集群数据


2)获取 reversion

etcdctl --write-out=“json” --cacert /var/lib/etcd/cert/ca.pem --key /var/lib/etcd/cert/etcd-client-key.pem --cert /var/lib/etcd/cert/etcd-client.pem --endpoints=’...:2379’ endpoint status |grep -o ‘“revision”:[0-9]*’


3)compact

etcdctl --cacert /var/lib/etcd/cert/ca.pem --key /var/lib/etcd/cert/etcd-client-key.pem --cert /var/lib/etcd/cert/etcd-client.pem --endpoints=’...:2379’ compact $revision


4)defrag

etcdctl --cacert /var/lib/etcd/cert/ca.pem --key /var/lib/etcd/cert/etcd-client-key.pem --cert /var/lib/etcd/cert/etcd-client.pem --endpoints=’...:2379’ defrag


5)删除报警(必需删除,否则集群仍然无法使用)

etcdctl --write-out=“table” --cacert /var/lib/etcd/cert/ca.pem --key /var/lib/etcd/cert/etcd-client-key.pem --cert /var/lib/etcd/cert/etcd-client.pem --endpoints=’...:2379 alarm disarm


以上就是对 ETCD 集群日常维护的总结,为了使服务更加稳定的运行,建议定时备份和压缩数据,并增加集群监控(与 Prometheus 配合使用)。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/IANaqD6k3IQQJNX1tjgVag


2019 年 11 月 15 日 15:312198

评论

发布
暂无评论
发现更多内容

作业一:食堂就餐卡系统设计

静海

UML

架构师训练营—第一周命题作业UML

Geek_shu1988

架构师训练营第一期-第一周课后作业

卖猪肉的大叔

作业二:第一周学习情况总结

静海

食堂就餐卡系统设计

jizhi7

极客大学架构师训练营

架构师训练营2期-第一周总结

Geek_no_one

极客大学架构师训练营

架构师训练营第一期-第一周学习总结

卖猪肉的大叔

食堂就餐卡系统设计

L

第一周 架构方法学习总结

L

架构师训练营Week1 - 学习总结

极客大学架构师训练营

架构方法

Eddy.何

极客大学架构师训练营 命题作业

Python+Appium运行简单的demo,你需要理解Appium运行原理!

清菡

架构师训练营第1期第1周学习总结

du tiezheng

极客大学架构师训练营

第五周总结

架构师训练营1期作业-学习总结

道长

极客大学架构师训练营

第一周架构之UML

若水先生

极客大学架构师训练营

合并两个单向链表

食堂就餐卡系统UML设计

Meow

极客大学架构师训练营

微服务架构

第一周命题作业

月殇

极客大学架构师训练营

架构师训练营第一周作业 食堂就餐卡系统设计

帅到没朋友

极客大学架构师训练营

性能测试总结

食堂就餐系统

focus

第八周总结

【第一周】课后作业

云龙

极客大学架构师训练营

架构师训练营第一周命题作业

一马行千里

极客大学架构师训练营

潮汕之旅第一站

熊斌

摄影 游记

架构师训练营 week 1 笔记

陈春亮

极客大学架构师训练营

第一周学习总结

月殇

极客大学架构师训练营

【架构师训练营第 1 期】第一周作业

知鱼君

极客大学架构师训练营

架构师1期week01总结

FG佳

ETCD集群的常见问题处理-InfoQ