如何对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。