背景
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)`错误
|
参考