跳到主要内容

备份和恢复 etcd

etcd 集群通常具有容错能力。尽管如此,仍可能出现多个 etcd 节点故障并失去与集群连接的情况。为了从此类故障中恢复,etcd 支持备份和恢复功能,可在不丢失数据的情况下重新创建实例。

设置备份有助于保存 APISIX 实例的状态。这在升级 APISIX 时也很有用,可确保你的配置已保存。

本文档演示了如何在 APISIX 和 etcd 都运行在 Docker 中的情况下备份和恢复 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"

docker run --rm \
-v ./backup:/backup \
-e ETCDCTL_API=3 \
--network "$NET_NAME" \
bitnami/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 -e ETCD_LISTEN_PORT=2379 -it $ETCD_NAME etcdctl --endpoints="http://127.0.0.1:$ETCD_LISTEN_PORT" snapshot save ./backup/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

从备份恢复

要从备份恢复,请运行:

etcdctl snapshot restore ./backup/snapshot.db