备份和恢复 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, 也可以直接在主机上运行恢复命令。
恢复后,使用已恢复的数据目录和当前环境所需的引导配置启动 etcd。例如,在容器化部署中,通常需要在重新启动 etcd 之前,用恢复后的数据替换旧 etcd 容器或其挂载数据卷。
etcd 恢复健康后,请确认 APISIX 已重新连接到恢复后的数据存储。如果 etcd 恢复可用后 APISIX 未自动恢复,请根据部署方式重启或重新加载 APISIX。
对于 Docker 部署,可以运行:
docker restart apisix-quickstart
恢复后,请在宣布恢复完成之前同时验证控制面数据和代理流量。
如果已完成前置条件中的路由教程,请验证其路由和流量路径是否已恢复:
curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip"
curl -i "http://127.0.0.1:9080/ip"
对于多节点 etcd 集群或非 Docker 部署,请使用相同的快照和恢复概念,但要根据运行环境调整已恢复的数据目录、引导配置和服务重启流程。有关集群恢复指南,请参阅官方 etcd 灾难恢复文档。