etcd 目前最新的版本的 v3.1.1,但它的 API 又有 v3 和 v2 之分,社区通常所说的 v3 与 v2 都是指 API 的版本号。从 etcd 2.3 版本开始推出了一个实验性的全新 v3 版本 API 的实现,v2 与 v3 API 使用了不同的存储引擎,所以客户端命令也完全不同。
# etcdctl --version
etcdctl version: 3.0.4
API version: 2
官方指出 etcd v2 和 v3 的数据不能混合存放,support backup of v2 and v3 stores 。
特别提醒:
官方 v2 admin guide (https://github.com/coreos/etcd/blob/master/Documentation/v2/admin_guide.md#disaster-recovery)
etcd的数据默认会存放在我们的命令工作目录中,我们发现数据所在的目录,会被分为两个文件夹中:
# etcdctl backup --data-dir /home/etcd/ --backup-dir /home/etcd_backup
# etcd -data-dir=/home/etcd_backup/ -force-new-cluster
恢复时会覆盖 snapshot 的元数据(member ID 和 cluster ID),所以需要启动一个新的集群。
官方 v3 admin guide (https://github.com/coreos/etcd/blob/master/Documentation/op-guide/recovery.md)
在使用 API 3 时需要使用环境变量 ETCDCTL_API 明确指定。
在命令行设置:
# export ETCDCTL_API=3
备份数据:
# etcdctl --endpoints localhost:2379 snapshot save snapshot.db
恢复:
# etcdctl snapshot restore snapshot.db --name m3 --data-dir=/home/etcd_data
恢复后的文件需要修改权限为 etcd:etcd
建议使用时不指定 name 但指定 data-dir,并将 data-dir 对应于 etcd 服务中配置的 data-dir
etcd 集群都是至少 3 台机器,官方也说明了集群容错为 (N-1)/2,所以备份数据一般都是用不到,但是鉴上次 gitlab 出现的问题,对于备份数据也要非常重视。