如何对etcd进行数据的迁移(备份和恢复)?

1、背景说明

 

在项目上,有个环境,更改了etcd所在主机的IP地址,也就需要使用新的IP,作为etcd对外提供服务和内部通信的IP地址。

 

这个时候,发现在etcd中存储的信息中,有节点成员的IP地址的信息。

 

那在这种的情况,如何把原来那套etcd里面的数据,迁移过来?

同时,在etcd使用新的IP地址之后,数据里面存储的是新节点的IP地址信息

 

2、数据备份

 

为了达到数据迁移的目的,在迁移之前,对原来的etcd数据进行备份。

 

使用snapshot save命令

ETCDCTL_API=3 etcdctl \
        --endpoints "https://10.91.253.127:2379,https://10.91.253.128:2379,https://10.91.253.129:2379" \
        --cert /etc/etcd/ssl/etcd.pem  \
        --key /etc/etcd/ssl/etcd-key.pem \
        --cacert /etc/etcd/ssl/ca.crt \
        snapshot save 127data.backup  

 

参数说明:

--endpoints:是etcd节点的客户端访问地址,对于3个节点的集群,连接任何的一个节点都可以,也可以同时指定3个节点的地址

--cert:客户端证书

--key:客户端的私钥

--cacert:ca的证书。

127data.backup : 是快照的名字,可以执行的指定。

这里面访问etcd的证书,只要是经过ca证书签名、认证的就可以。

 

执行备份之后,出现“Snapshot saved at...”

 

生成了这个备份文件

 

OK,这个就进行了数据的备份。

 

3、数据恢复

 

3.1、传送备份文件

将上面备份的数据,传送到新的etcd集群里。

 

注意:要分别传送到每个节点上。

 

3.2、关闭新的集群

 

在每个节点执行下面的动作,关闭新的集群(如果集群已经安装好,并且已经正常运行了)

systemctl stop etcd

 

3.3、删除现有数据

 

如果集群已经运行了。

那么,在数据目录里面,就会存有集群节点的信息和初始化的数据,导入就会有问题。

 

所以,先删除数据目录。

数据目录,通过service文件可看到

 

每个节点都要执行

rm -rf /var/lib/etcd

 

如果集群是没有启动过,数据目录还没有生成,不需要执行这个命令。

 

3.4、恢复数据

 

使用snapshot restore命令,进行数据的恢复

 

在第一个节点执行(在备份文件所在的目录)

ETCDCTL_API=3 etcdctl --data-dir="/var/lib/etcd" \
        --endpoints "https://10.192.121.202:2379,https://10.192.121.203:2379,https://10.192.121.209:2379" \
        --cert /etc/etcd/ssl/etcd.pem  \
        --key /etc/etcd/ssl/etcd-key.pem \
        --cacert /etc/etcd/ssl/ca.crt \
        snapshot restore 127data.backup \
        --name=etcd1 \
        --initial-cluster-token=etcd-cluster-0 \
        --initial-cluster=etcd1=https://10.192.121.202:2380,etcd2=https://10.192.121.203:2380,etcd3=https://10.192.121.209:2380 \
        --initial-advertise-peer-urls=https://10.192.121.202:2380  

 

参数说明:

--data-dir:数据目录,也就是service中的数据目录

--name: 当前节点的名字

--initial-cluster-token:集群的名字

--initial-cluster:集群节点的信息,列出所有的节点

--initial-advertise-peer-urls:当前节点的集群的通信地址

其实,从这个命令可看出来,这个就是节点的初始化的过程,恢复的过程,用这个命令,就会把节点和集群的信息,写入到本地的数据中。

 

这些信息,都可以通过service文件中获得

 

第二个节点执行

ETCDCTL_API=3 etcdctl --data-dir="/var/lib/etcd" \
        --endpoints "https://10.192.121.202:2379,https://10.192.121.203:2379,https://10.192.121.209:2379" \
        --cert /etc/etcd/ssl/etcd.pem  \
        --key /etc/etcd/ssl/etcd-key.pem \
        --cacert /etc/etcd/ssl/ca.crt \
        snapshot restore 127data.backup \
        --name=etcd2 \
        --initial-cluster-token=etcd-cluster-0 \
        --initial-cluster=etcd1=https://10.192.121.202:2380,etcd2=https://10.192.121.203:2380,etcd3=https://10.192.121.209:2380 \
        --initial-advertise-peer-urls=https://10.192.121.203:2380 

 

 

第三个节点执行

ETCDCTL_API=3 etcdctl --data-dir="/var/lib/etcd" \
        --endpoints "https://10.192.121.202:2379,https://10.192.121.203:2379,https://10.192.121.209:2379" \
        --cert /etc/etcd/ssl/etcd.pem  \
        --key /etc/etcd/ssl/etcd-key.pem \
        --cacert /etc/etcd/ssl/ca.crt \
        snapshot restore 127data.backup \
        --name=etcd3 \
        --initial-cluster-token=etcd-cluster-0 \
        --initial-cluster=etcd1=https://10.192.121.202:2380,etcd2=https://10.192.121.203:2380,etcd3=https://10.192.121.209:2380 \
        --initial-advertise-peer-urls=https://10.192.121.209:2380 

 

当在3个节点,都执行数据恢复。

 

3.5、启动集群

 

在每个节点,都执行下面的命令,启动etcd实例

systemctl start etcd

 

启动之后,查看集群成员的信息

ETCDCTL_API=3 etcdctl \
  --endpoints "https://172.20.59.57:2379,https://172.20.59.238:2379,https://172.20.59.153:2379" \
  --cert /etc/ssl/etcd/ssl/member-nccztsjb-node-08.pem  \
  --key /etc/ssl/etcd/ssl/member-nccztsjb-node-08-key.pem \
  --cacert /etc/ssl/etcd/ssl/ca.pem \
   member list

 

查看集群节点的健康情况

ETCDCTL_API=3 etcdctl \
  --endpoints "https://172.20.59.57:2379,https://172.20.59.238:2379,https://172.20.59.153:2379" \
  --cert /etc/ssl/etcd/ssl/member-nccztsjb-node-08.pem  \
  --key /etc/ssl/etcd/ssl/member-nccztsjb-node-08-key.pem \
  --cacert /etc/ssl/etcd/ssl/ca.pem \
  endpoint health

 

如果能够正确的查询,说明集群是正常的。

 

查看节点的数据(查看所有的数据)

ETCDCTL_API=3 etcdctl \
  --endpoints "https://172.20.59.57:2379,https://172.20.59.238:2379,https://172.20.59.153:2379" \
  --cert /etc/ssl/etcd/ssl/member-nccztsjb-node-08.pem  \
  --key /etc/ssl/etcd/ssl/member-nccztsjb-node-08-key.pem \
  --cacert /etc/ssl/etcd/ssl/ca.pem \
  get --prefix ""

 

可以看到数据,证明数据恢复OK。

 

posted @ 2023-12-11 14:22  Zhai_David  阅读(1121)  评论(0编辑  收藏  举报