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

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL
Redis
Etcd(本章节)
在一般分布式集群里面,我们的节点数量一般都是3节点,所以允许故障1个节点,但是在极端情况下我们只存在一个节点,而我们需要马上恢复Etcd的服务,本方案就是基于此来编写的。
我们还是以我们刚刚搭建的节点Etcd集群来实现,3节点的集群目前只有100这个节点还在运行,另外2个节点无法恢复。

从剩余100节点日志来看,由于无法链接另外2个节点,导致选举导致 raft 协议无法完成选举,集群无法组建,并持续发起新的选举周期。这个时候由于3节点集群,我们根本无法恢复。所以我们需要把他临时改成单节点进行恢复。
1.数据备份
我们做任何改变操作之前都需要对数据进行备份,当然我们也可以通过直接对数据目录进行复制进行备份。
# 临时设置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.清空历史数据
所以为了保险起见,快照备份和物理备份都同时用上。
rm -rf /var/lib/etcdnew/3.还原备份数据
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 4304adb99f80f3ef4.检查数据格式
[root@localhost certs]# tree /var/lib/etcdnew/
/var/lib/etcdnew/
└── member
├── snap
│ ├── 0000000000000001-0000000000000001.snap
│ └── db
└── wal
└── 0000000000000000-0000000000000000.wal
3 directories, 3 files4.集群改成单机配置并启动集群
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.sh5.检查数据是否存在
[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这样我们就通过导入备份快照完成了集群变单机的模式。