blog
blog copied to clipboard
Etcd 集群数据迁移(v2)
主要介绍 Etcd 集群数据迁移,本文基于 Etcd v2 版本
注意:Etcd 有个 Bug,在 v2 版本做数据迁移的话需要基于 v2.3.8 版本做。
背景介绍
目前有一个单节点 v2 版本的 Etcd,需要搭建一个新的 v2 版本的 Etcd 集群并把数据迁移过去。 首先需要准备三台目标机器,用来做新的 v2 版本集群:
| 机器名 | 机器 IP |
|---|---|
| host-1 | 192.168.0.131 |
| host-2 | 192.168.0.132 |
| host-3 | 192.168.0.133 |
数据迁移
迁移的方案是:对旧节点做 backup 然后在新的节点上对 backup 做 restore
首先,在旧节点上做 backup
etcdctl backup --data-dir /data/etcd --backup-dir /data/etcd-backup
在做完 backup 后,我们把备份的数据文件拷贝到 host-1 机器的 /data/etcd 目录下
启动 host-1 机器上的 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 节点加进集群中:
etcdctl member add etcd1 http://192.168.0.132:2380
通过查看集群成员,目前集群中有两个节点,etcd1 集群的状态是 unstarted
启动 host-2 机器上的 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 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
我们启动后,通过 etcdctl member list 可以查看到集群中现在两个节点已经正常了。
启动 host-3 机器上的 Etcd
回到 host-1 机器,执行 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。但是截止本文仍然还没有实现。