备份和恢复 etcd
etcd 集群通常具有容错能力。尽管如此,仍可能出现多个 etcd 节点故障并失去与集群连接的情况。为了从此类故障中恢复,etcd 支持备份和恢复功能,可在不丢失数据的情况下重新创建实例。
设置备份有助于保存 APISIX 实例的状态。这在升级 APISIX 时也很有用,可确保你的配置已保存。
本文档介绍如何在 Docker 中运行 APISIX 和 etcd,以及如何备份和恢复 etcd。请将示例中的容器名称、网络名称和路径替换为你的部署所使用的值。
前置条件
通过临时容器备份
etcd 自带了 etcdctl,这是一个用于操作 etcd API 的命令行工具。etcdctl 支持 etcdctl snapshot 命令,可以对 etcd 数据库进行备份。
下面的示例在一个临 时 Docker 容器上运行此命令,并在主机上创建备份。
首先,在主机上创建一个 backup 文件夹用于存放备份。该文件夹将作为卷挂载到临时容器中。
在与 APISIX 和 etcd 容器相同的网络中创建用于备份 etcd 的临时容器,并运行 etcdctl snapshot 命令,提供 etcd 端点:
export NET_NAME="apisix-quickstart-net"
export ETCD_LISTEN_PORT=2379
export ETCD_NAME="etcd-quickstart"
mkdir -p ./backup
docker run --rm \
--mount type=bind,source="$(pwd)/backup",target=/backup \
-e ETCDCTL_API=3 \
--network "$NET_NAME" \
gcr.io/etcd-development/etcd:v3.5.32 \
etcdctl --endpoints="http://$ETCD_NAME:$ETCD_LISTEN_PORT" snapshot save /backup/snapshot.db
如果成功,你应该会看到类似以下的响应:
{"level":"info","ts":"2026-07-21T06:04:56.103946Z","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/backup/snapshot.db.part"}
{"level":"info","ts":"2026-07-21T06:04:56.107775Z","logger":"client","caller":"v3@v3.5.32/maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2026-07-21T06:04:56.107820Z","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"http://etcd-quickstart:2379"}
{"level":"info","ts":"2026-07-21T06:04:56.113786Z","logger":"client","caller":"v3@v3.5.32/maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2026-07-21T06:04:56.114407Z","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"http://etcd-quickstart:2379","size":"45 kB","took":"now"}
{"level":"info","ts":"2026-07-21T06:04:56.114681Z","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/backup/snapshot.db"}
Snapshot saved at /backup/snapshot.db
直接在 etcd 容器上备份
etcdctl snapshot 也可以直接在 etcd 容器上运行。请注意,这可能需要为 Docker 容器设置目录权限。
export ETCD_NAME="etcd-quickstart"
docker exec -it "$ETCD_NAME" \
etcdctl --endpoints="http://127.0.0.1:2379" snapshot save /tmp/snapshot.db
docker cp "$ETCD_NAME:/tmp/snapshot.db" ./backup/snapshot.db
docker exec "$ETCD_NAME" rm /tmp/snapshot.db
这样会先将快照保存到 etcd 容器内,然后将其复制到主机。
从主机备份
如果可以访问 etcd API 端点,则可以在主机上运行 etcdctl。etcd 端点可以通过 TLS 安全地暴露。
请注意,etcdctl 应安装在 主机上。下载适用于相应操作系统的二进制文件,或使用包管理器安装 etcdctl。
在主机上运行 etcdctl 以保存快照:
export ETCD_LISTEN_PORT=2379
export ETCD_ADDRESS="127.0.0.1"
etcdctl --endpoints="http://$ETCD_ADDRESS:$ETCD_LISTEN_PORT" snapshot save ./backup/snapshot.db
从备份恢复
官方 etcd 发行版同时包含这两个工具。使用 etcdctl 从正在运行的 etcd 成员保存快照,使用 etcdutl 将快照恢复到数据目录。
恢复快照会根据快照重新创建 etcd 数据目录。请恢复到新目录,然后按照当前部署方式使用已恢复的数据启动 etcd。
运行以下命令,将快照恢复到新数据目录:
mkdir -p ./restore
docker run --rm \
--mount type=bind,source="$(pwd)/backup",target=/backup \
--mount type=bind,source="$(pwd)/restore",target=/restore \
gcr.io/etcd-development/etcd:v3.5.32 \
etcdutl snapshot restore /backup/snapshot.db --data-dir /restore/data
如果主机上已安装 etcdutl