备份和恢复 etcd
etcd 集群通常具有容错能力。尽管如此,仍可能出现多个 etcd 节点故障并失去与集群连接的情况。为了从此类故障中恢复,etcd 支持备份和恢复功能,可在不丢失数据的情况下重新创建实例。
设置备份有助于保存 APISIX 实例的状态。这在升级 APISIX 时也很有用,可确保你的配置已保存。
此文档显示如何在 Docker 中运行 APISIX 和 APISIX 等同时备份并恢复等 。 将示例中的容器名称、网络名称和路径替换为自部署的值。
前提条件
通过临时容器备份
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"
docker run --rm \
-v ./backup:/backup \
-e ETCDCTL_API=3 \
--network "$NET_NAME" \
bitnamilegacy/etcd:3.5.7 \
etcdctl --endpoints="http://$ETCD_NAME:$ETCD_LISTEN_PORT" snapshot save /backup/snapshot.db
如果成功,你应该会看到类似以下的响应:
{"level":"info","ts":"2024-03-26T06:14:17.173Z","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/backup/snapshot.db.part"}
{"level":"info","ts":"2024-03-26T06:14:17.178Z","logger":"client","caller":"v3@v3.5.7/maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2024-03-26T06:14:17.178Z","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"http://etcd-quickstart:2379"}
{"level":"info","ts":"2024-03-26T06:14:17.182Z","logger":"client","caller":"v3@v3.5.7/maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2024-03-26T06:14:17.182Z","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"http://etcd-quickstart:2379","size":"25 kB","took":"now"}
{"level":"info","ts":"2024-03-26T06:14:17.183Z","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 /bitnami/etcd/snapshot.db
docker cp "$ETCD_NAME:/bitnami/etcd/snapshot.db" ./backup/snapshot.db
这样可以先保存等容器内的快照,然后复制到主机.
从主机备份
如果可以访问 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
从备份恢复
恢复快照会从快照中重新创建等效数据目 录. 您应该恢复到一个新的目录,然后根据您的部署方法启动恢复的数据等。
要将快照还原为新数据目录, 运行 :
mkdir -p ./restore
docker run --rm \
-v ./backup:/backup \
-v ./restore:/restore \
-e ETCDCTL_API=3 \
bitnamilegacy/etcd:3.5.7 \
etcdctl snapshot restore /backup/snapshot.db --data-dir /restore/data
如果etcdctl安装在主机上,也可以直接在主机上运行恢复命令.
在恢复后, 以恢复的数据目录和您环境所需的靴子配置启动等 。 例如,在一个集装箱化的部署中,你通常会用恢复的数据替换旧的等离子容器或其挂载的数据量,然后重新开始等等。
etcd 恢复健康后,请确认 APISIX 已重新连接到恢复后的数据存储。如果 etcd 恢复可用后 APISIX 未自动恢复,请根据部署方式重启或重新加载 APISIX。
对于 Docker 部署, 您可以以 :
docker restart apisix-quickstart
恢复后,在考虑恢复完成之前,先核实控制面数据和代理流量.
例如,如果您先前用 IDroute-id创建了路径, 您可以通过 Admin API 验证它, 然后验证流量路径 :
curl -i "http://127.0.0.1:9180/apisix/admin/routes/route-id"
curl -i "http://127.0.0.1:9080/your-route-path"
对于多节点等集群或非Docker部署,使用相同的快照并恢复概念,但将恢复的数据目录,靴子配置,以及服务重启进程适应您的运行时环境. 关于针对组群的恢复指导,参见官方等灾后恢复文件.