Open penglongli opened 6 years ago
主要介绍 Etcd 集群数据迁移,本文基于 Etcd v2 版本
注意:Etcd 有个 Bug,在 v2 版本做数据迁移的话需要基于 v2.3.8 版本做。
目前有一个单节点 v2 版本的 Etcd,需要搭建一个新的 v2 版本的 Etcd 集群并把数据迁移过去。 首先需要准备三台目标机器,用来做新的 v2 版本集群:
迁移的方案是:对旧节点做 backup 然后在新的节点上对 backup 做 restore
首先,在旧节点上做 backup
etcdctl backup --data-dir /data/etcd --backup-dir /data/etcd-backup
在做完 backup 后,我们把备份的数据文件拷贝到 host-1 机器的 /data/etcd 目录下
host-1
/data/etcd
目前我们 host-1 机器上已经有了 Backup 出来的数据,存在 /data/etcd 目录。 执行如下脚本:
#!/bin/bash VERSION=v2.3.8 docker pull quay.io/coreos/etcd:$VERSION docker rm -f etcd docker run -d --name etcd --restart=always \ --net=host \ -v /data/etcd:/data:rw \ quay.io/coreos/etcd:$VERSION \ -name etcd0 \ -data-dir /data \ -initial-advertise-peer-urls http://192.168.0.131:2380 \ -listen-peer-urls http://192.168.0.131:2380 \ -listen-client-urls http://192.168.0.131:2379,http://127.0.0.1:2379 \ -advertise-client-urls http://192.168.0.131:2379 \ -initial-cluster-token etcd-cluster-1 \ -initial-cluster etcd0=http://192.168.0.131:2380 \ -initial-cluster-state new \ -force-new-cluster
增加了一个参数: -force-new-cluster(猜测这个参数会毁掉旧数据中的集群信息)
我们会发现 Host-1 机器上已经起来了一个 Etcd 服务,可以查看下目前的集群 member 情况:
etcdctl member list
可以看到目前只有 host-1 一个成员,我们通过如下命令把 host-2 节点加进集群中:
host-2
etcdctl member add etcd1 http://192.168.0.132:2380
通过查看集群成员,目前集群中有两个节点,etcd1 集群的状态是 unstarted
unstarted
执行下述命令:
#!/bin/bash VERSION=v2.3.8 docker pull quay.io/coreos/etcd:$VERSION docker rm -f etcd docker run -d --name etcd --restart=always \ --net=host \ -v /data/etcd:/data:rw \ quay.io/coreos/etcd:$VERSION \ -name etcd1 \ -data-dir /data \ -initial-advertise-peer-urls http://192.168.0.132:2380 \ -listen-peer-urls http://192.168.0.132:2380 \ -listen-client-urls http://192.168.0.132:2379,http://127.0.0.1:2379 \ -advertise-client-urls http://192.168.0.132:2379 \ -initial-cluster-token etcd-cluster-1 \ -initial-cluster etcd0=http://192.168.0.131:2380,etcd1=http://192.168.0.132:2380 \ -initial-cluster-state existing \
可以发现,我们在 -initial-cluster 参数增加了一个 etcd1=http://192.168.0.132:2380,并且修改了 -initial-cluster-state=existing
-initial-cluster
etcd1=http://192.168.0.132:2380
-initial-cluster-state=existing
我们启动后,通过 etcdctl member list 可以查看到集群中现在两个节点已经正常了。
回到 host-1 机器,执行 etcdctl cluster-health 查看集群健康状态,发现包含两个节点,并且状态均为健康。
etcdctl cluster-health
我们在 host-1 机器上使用如下命令添加 host-3 节点:
etcdctl member add etcd2 http://192.168.0.133:2380
回到 host-3 机器,执行如下命令:
#!/bin/bash VERSION=v2.3.8 docker pull quay.io/coreos/etcd:$VERSION docker rm -f etcd docker run -d --name etcd --restart=always \ --net=host \ -v /data/etcd:/data:rw \ quay.io/coreos/etcd:$VERSION \ -name etcd2 \ -data-dir /data \ -initial-advertise-peer-urls http://192.168.0.133:2380 \ -listen-peer-urls http://192.168.0.133:2380 \ -listen-client-urls http://192.168.0.133:2379,http://127.0.0.1:2379 \ -advertise-client-urls http://192.168.0.133:2379 \ -initial-cluster-token etcd-cluster-1 \ -initial-cluster etcd0=http://192.168.0.131:2380,etcd1=http://192.168.0.132:2380,etcd2=http://192.168.0.133:2380 \ -initial-cluster-state existing
在服务启动后,查看 member 发现集群中已经存在了三个节点,并且状态为健康。
这样迁移会有个问题,数据肯定会有些地方不完整。因为旧的节点仍然一直在工作,在产生数据。 据说 Etcd 官方在 v3 版本在做不会出现丢失数据的 hash checking。但是截止本文仍然还没有实现。
主要介绍 Etcd 集群数据迁移,本文基于 Etcd v2 版本
背景介绍
目前有一个单节点 v2 版本的 Etcd,需要搭建一个新的 v2 版本的 Etcd 集群并把数据迁移过去。 首先需要准备三台目标机器,用来做新的 v2 版本集群:
数据迁移
首先,在旧节点上做 backup
在做完 backup 后,我们把备份的数据文件拷贝到
host-1
机器的/data/etcd
目录下启动 host-1 机器上的 Etcd
目前我们 host-1 机器上已经有了 Backup 出来的数据,存在 /data/etcd 目录。 执行如下脚本:
增加了一个参数: -force-new-cluster(猜测这个参数会毁掉旧数据中的集群信息)
我们会发现 Host-1 机器上已经起来了一个 Etcd 服务,可以查看下目前的集群 member 情况:
可以看到目前只有
host-1
一个成员,我们通过如下命令把host-2
节点加进集群中:通过查看集群成员,目前集群中有两个节点,etcd1 集群的状态是
unstarted
启动 host-2 机器上的 Etcd
执行下述命令:
可以发现,我们在
-initial-cluster
参数增加了一个etcd1=http://192.168.0.132:2380
,并且修改了-initial-cluster-state=existing
我们启动后,通过
etcdctl member list
可以查看到集群中现在两个节点已经正常了。启动 host-3 机器上的 Etcd
回到
host-1
机器,执行etcdctl cluster-health
查看集群健康状态,发现包含两个节点,并且状态均为健康。我们在 host-1 机器上使用如下命令添加 host-3 节点:
回到 host-3 机器,执行如下命令:
在服务启动后,查看 member 发现集群中已经存在了三个节点,并且状态为健康。
问题
这样迁移会有个问题,数据肯定会有些地方不完整。因为旧的节点仍然一直在工作,在产生数据。 据说 Etcd 官方在 v3 版本在做不会出现丢失数据的 hash checking。但是截止本文仍然还没有实现。