背景

etcd是目前比较流行的分布式kv存储解决方案,其中kubernets采用etcd作为其存储方案。某个业务使用单点的etcd服务,需要扩容保证etcd服务的高可用性。

etcd数据迁移方案根据是否处于容器环境有所不同,这里记录一下kubernets环境中数据迁移扩容。

迁移

etcd数据迁移不能简单的采用打包db目录的方式,db文件中包含了peerurl地址等信息,会导致复制启动后etcd集群异常。

主要迁移思路采用新建3节点的集群,通过snapshot方式备份旧服务的数据方式,在新集群每一个节点进行restore操作。

1
执行restore命令时,参数中要带`--initial-cluster`和`--initial-advertise-peer-urls`参数,否则集群启动时无法相互同步

如果etcd的镜像采用的是bitnami/etcd, restore后的data-dir目录需要保持一致;并且需要注意该镜像中的数据目录权限是1001:root权限。

如果kubernets部署环境是aliyun,需要使用pvc时,storageClass类型至少选择alicloud-disk-ssd;etcd在请求量增多时会导致IO的延迟增高,一定几率出现request took too long错误。

操作步骤:
1、新建集群(三节点)

1
helm install etcd bitnami/etcd --set 'replicaCount=3'

2、旧服务备份数据库

1
etdctl snapshot save /tmp/my.db --endpoints http://POD_IP:2379

3、复制旧数据库文件到新集群每一个节点,执行restore操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 复制文件操作省略...

// namespace:etcd

// 节点1
etcdctl snapshot restore my.db --name etcd-0 \
--initial-cluster etcd-0=http://etcd-0.etcd-headless.etcd.svc.cluster.local:2380,etcd-1=http://etcd-1.etcd-headless.etcd.svc.cluster.local:2380,etcd-2=http://etcd-2.etcd-headless.etcd.svc.cluster.local:2380 \
--initial-advertise-peer-urls http://etcd-0.etcd-headless.etcd.svc.cluster.local:2380 \
--skip-hash-check=true \
--data-dir=/bitnami/etcd/store

// 节点2
etcdctl snapshot restore my.db --name etcd-1 \
--initial-cluster etcd-0=http://etcd-0.etcd-headless.etcd.svc.cluster.local:2380,etcd-1=http://etcd-1.etcd-headless.etcd.svc.cluster.local:2380,etcd-2=http://etcd-2.etcd-headless.etcd.svc.cluster.local:2380 \
--initial-advertise-peer-urls http://etcd-1.etcd-headless.etcd.svc.cluster.local:2380 \
--skip-hash-check=true \
--data-dir=/bitnami/etcd/store

// 节点3
etcdctl snapshot restore my.db --name etcd-2 \
--initial-cluster etcd-0=http://etcd-0.etcd-headless.etcd.svc.cluster.local:2380,etcd-1=http://etcd-1.etcd-headless.etcd.svc.cluster.local:2380,etcd-2=http://etcd-2.etcd-headless.etcd.svc.cluster.local:2380 \
--initial-advertise-peer-urls http://etcd-2.etcd-headless.etcd.svc.cluster.local:2380 \
--skip-hash-check=true \
--data-dir=/bitnami/etcd/store

旧服务的数据已经迁移etcd集群各节点的pvc中,需要重启etcd集群服务。

4、重启etcd集群服务

1
2
helm uninstall etcd
helm install etcd bitnami/etcd --set 'replicaCount=3'

需要注意的是bitnami/etcd镜像中数据目录通过环境变量ETCD_DATA_DIR配置;如果该配置项不生效则采用busybox挂载pvc的方式修改etcd数据目录/bitnami/etcd/data

5、迁移完成验证数据

1
etcdctl get / --prefix --endpoints http://127.0.0.1:2379

注意事项

  • 数据打包方案

    1
    该方案不适合容器环境,如果在etcd容器中直接复制数据目录,一定几率会出现`panic: freepages: failed to get all reachable pages (page 13802: multiple references)`错误

参考

评论