首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Etcd-集群崩溃恢复

Etcd-集群崩溃恢复

作者头像
运维小路
发布2026-02-28 18:18:25
发布2026-02-28 18:18:25
430
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL

PostgreSQL

MongoDB

Redis

Etcd(本章节)

在一般分布式集群里面,我们的节点数量一般都是3节点,所以允许故障1个节点,但是在极端情况下我们只存在一个节点,而我们需要马上恢复Etcd的服务,本方案就是基于此来编写的。

我们还是以我们刚刚搭建的节点Etcd集群来实现,3节点的集群目前只有100这个节点还在运行,另外2个节点无法恢复。

从剩余100节点日志来看,由于无法链接另外2个节点,导致选举导致 raft 协议无法完成选举,集群无法组建,并持续发起新的选举周期。这个时候由于3节点集群,我们根本无法恢复。所以我们需要把他临时改成单节点进行恢复。

1.数据备份

我们做任何改变操作之前都需要对数据进行备份,当然我们也可以通过直接对数据目录进行复制进行备份。

代码语言:javascript
复制
# 临时设置etcdctl3环境变量(也可写入~/.bashrc永久生效)
export ETCDCTL_API=3
export ETCDCTL_CACERT=/etc/etcd/certs/ca.pem
export ETCDCTL_CERT=/etc/etcd/certs/etcd.pem
export ETCDCTL_KEY=/etc/etcd/certs/etcd-key.pem
# 创建快照(指定集群端点,保存到/opt/etcd_snapshots/,文件名带时间戳)
mkdir -p /opt/etcd_snapshots
etcdctl --endpoints=https://192.168.31.100:2379 snapshot save /opt/etcd_snapshots/etcd_snapshot_$(date +%Y%m%d%H%M%S).db

2.清空历史数据

所以为了保险起见,快照备份和物理备份都同时用上。

代码语言:javascript
复制
rm -rf /var/lib/etcdnew/

3.还原备份数据

代码语言:javascript
复制
etcdctl snapshot restore  \
 /opt/etcd_snapshots/etcd_snapshot_20260208235309.db \
   --data-dir=/var/lib/etcdnew  \
   --name=etcd-1  \
   --initial-cluster=etcd-1=https://192.168.31.100:2380 \
   --initial-cluster-token=etcd-cluster-token \
   --initial-advertise-peer-urls=https://192.168.31.100:2380

# 返回导入成功的提示 
 etcdserver/membership: added member 919995e5b718af77 [https://192.168.31.100:2380] to cluster 4304adb99f80f3ef

4.检查数据格式

代码语言:javascript
复制
[root@localhost certs]# tree /var/lib/etcdnew/
/var/lib/etcdnew/
└── member
    ├── snap
    │   ├── 0000000000000001-0000000000000001.snap
    │   └── db
    └── wal
        └── 0000000000000000-0000000000000000.wal

3 directories, 3 files

4.集群改成单机配置并启动集群

代码语言:javascript
复制
cat > /usr/local/bin/start-etcd-single.sh << 'EOF'
#!/bin/bash
etcd \
  --name=etcd-1 \
  --data-dir=/var/lib/etcdnew \
  --listen-client-urls=https://192.168.31.100:2379 \
  --advertise-client-urls=https://192.168.31.100:2379 \
  --cert-file=/etc/etcd/certs/etcd.pem \
  --key-file=/etc/etcd/certs/etcd-key.pem \
  --trusted-ca-file=/etc/etcd/certs/ca.pem \
  --client-cert-auth
EOF
# 添加执行权限
chmod +x /usr/local/bin/start-etcd-new.sh

5.检查数据是否存在

代码语言:javascript
复制
[root@localhost ~]# export ETCDCTL_API=3
[root@localhost ~]# export ETCDCTL_CACERT=/etc/etcd/certs/ca.pem
[root@localhost ~]# export ETCDCTL_CERT=/etc/etcd/certs/etcd.pem
[root@localhost ~]# export ETCDCTL_KEY=/etc/etcd/certs/etcd-key.pem
[root@localhost ~]# 
[root@localhost ~]# # 1. 查看节点状态(单机正常)
[root@localhost ~]# etcdctl --endpoints=https://192.168.31.100:2379 endpoint status --write-out=table

|          ENDPOINT           |        ID        | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://192.168.31.100:2379 | 8e9e05c52164694d |  3.3.11 |   16 kB |      true |         2 |          4 |
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+

[root@localhost ~]# etcdctl --endpoints=https://192.168.31.100:2379 get single_test
single_test
cluster data restored

这样我们就通过导入备份快照完成了集群变单机的模式。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档