ETCD集群的常见问题处理

  • Post author:
  • Post category:其他



奇技指南

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

本文来自

公众号“360云计算”


ETCD常见问题

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

1


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

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


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

etcdctl endpoint status

640?wx_fmt=png


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官方文档说明(https://etcd.io/docs/v3.3.12/dev-guide/limit/)提到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配合使用)。


相关文章

  • https://github.com/etcd-io/etcd/tree/master/Documentation/dev-guide

  • http://linux265.com/news/2182.html

  • https://doc.zhnytech.com/etcd/documentation/op-guide/recovery.html


最新活动

面对复杂的业务逻辑和海量用户的并发访问,如何构建高性能、稳定的后端服务系统,是很多技术从业人员都需要解决的一个问题。

本期活动我们邀请多位一线技术专家从大数据计算、微服务架构、实时监控等方面探讨高性能Web服务端实现之路。



640?wx_fmt=png

识别下方


二维码


或点击


阅读原文


,立即报名

640?wx_fmt=jpeg