penglongli / blog

18 stars 1 forks source link

Etcd 集群数据迁移(v2) #38

Open penglongli opened 6 years ago

penglongli commented 6 years ago

主要介绍 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。但是截止本文仍然还没有实现。