etcd 备份与恢复

发布时间:2018年07月08日 阅读:828 次

etcd 是一款开源的分布式一致性键值存储,由 CoreOS 公司进行维护,详细的介绍请参考官方文档。

etcd 目前最新的版本的 v3.1.1,但它的 API 又有 v3 和 v2 之分,社区通常所说的 v3 与 v2 都是指 API 的版本号。

从 etcd 2.3 版本开始推出了一个实验性的全新 v3 版本 API 的实现,v2 与 v3 API 使用了不同的存储引擎,所以客户端命令也完全不同。

   # etcdctl --version
   etcdctl version: 3.0.4
   API version: 2
  1. 官方指出 etcd v2 和 v3 的数据不能混合存放,support backup of v2 and v3 stores 。


特别提醒:若使用 v3 备份数据时存在 v2 的数据则不影响恢复
若使用 v2 备份数据时存在 v3 的数据则恢复失败

对于 API 2 备份与恢复方法

官方 v2 admin guide

etcd的数据默认会存放在我们的命令工作目录中,我们发现数据所在的目录,会被分为两个文件夹中:

snap: 存放快照数据,etcd防止WAL文件过多而设置的快照,存储etcd数据状态。

wal: 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中。

    # etcdctl backup --data-dir /home/etcd/ --backup-dir /home/etcd_backup
    # etcd -data-dir=/home/etcd_backup/  -force-new-cluster

恢复时会覆盖 snapshot 的元数据(member ID 和 cluster ID),所以需要启动一个新的集群。

对于 API 3 备份与恢复方法

官方 v3 admin guide

在使用 API 3 时需要使用环境变量 ETCDCTL_API 明确指定。

在命令行设置:

    # export ETCDCTL_API=3

备份数据:

    # etcdctl --endpoints localhost:2379 snapshot save snapshot.db

恢复:

    # etcdctl snapshot restore snapshot.db --name m3 --data-dir=/home/etcd_data
    
      恢复后的文件需要修改权限为 etcd:etcd
    –name:重新指定一个数据目录,可以不指定,默认为 default.etcd
    –data-dir:指定数据目录
    建议使用时不指定 name 但指定 data-dir,并将 data-dir 对应于 etcd 服务中配置的 data-dir

etcd 集群都是至少 3 台机器,官方也说明了集群容错为 (N-1)/2,所以备份数据一般都是用不到,但是鉴上次 kubernetes 出现的问题,对于备份数据也要非常重视。

ETCD更新篇--2020-2-11

root@manage10:~# etcd --version
etcd Version: 3.4.1
Git SHA: a14579fbf
Go Version: go1.12.9
Go OS/Arch: linux/amd64


https://github.com/etcd-io/etcd/blob/6f0ae78b399ff5e365c3646e92121e18d5d1a01e/Documentation/demo.md
查看etcd的集群状态
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379"   --write-out="table"  endpoint health
查看集群的leader是哪台
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379" --write-out="table"  endpoint status
查看成员:
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379" member list
删除集群的节点
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379"  --write-out="table" endpoint status   #查看节点的id
etcdctl member remove d4c66b4ffee32ca5   #指定id从集群里删除节点
添加已有的集群里加节点
systemctl  stop etcd
--initial-cluster-state=new 改成  --initial-cluster-state=existing    不然加进去的节点自己是leader另一个集群了
rm /var/lib/etcd/member -r
systemctl daemon-reload
systemctl  start  etcd
etcdctl member add etcd-0 --peer-urls=http://172.16.244.115:2380
备份
单机备份:etcdctl snapshot save etcdsnapshot.db    #备份到etcdsnapshot.db文件里  这个是有个完整的hash值的
或者可以从数据目录里的db文件备份,这个是没有hash值验证,恢复时用--skip-hash-check
集群恢复:恢复时得需要起新的数据目录,把数据还原进去,因为恢复数据成员id会变把--initial-cluster-state=existing 改成--initial-cluster-state=new
https://github.com/etcd-io/etcd/blob/a621d807f061e1dd635033a8d6bc261461429e27/Documentation/op-guide/recovery.md
etcd-0:
etcdctl snapshot restore snapshot.db \
--name etcd-0 \
--initial-cluster etcd-0=http://172.16.244.115:2380,etcd-1=http://172.16.244.12:2380,etcd-2=http://172.16.244.61:2380 \
--initial-cluster-token etcd-cluster-0 \
--initial-advertise-peer-urls http://172.16.244.115:2380   \
--data-dir="/var/lib/etcd2"
etcd-1:
etcdctl snapshot restore snapshot.db \
--name etcd-1 \
--initial-cluster etcd-0=http://172.16.244.115:2380,etcd-1=http://172.16.244.12:2380,etcd-2=http://172.16.244.61:2380 \
--initial-cluster-token etcd-cluster-0 \
--initial-advertise-peer-urls http://172.16.244.12:2380   \
--data-dir="/var/lib/etcd2"
etcd-2:
etcdctl snapshot restore snapshot.db \
--name etcd-2 \
--initial-cluster etcd-0=http://172.16.244.115:2380,etcd-1=http://172.16.244.12:2380,etcd-2=http://172.16.244.61:2380 \
--initial-cluster-token etcd-cluster-0 \
--initial-advertise-peer-urls http://172.16.244.61:2380   \
--data-dir="/var/lib/etcd2"
更改etcd的数据目录改成新的,--initial-cluster-state=new,后重启服务,搞定!
集群写入数据
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379" put /name/1 guleng
读取
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379" get  --write-out="json" /name/1
查看所有的key
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379" get / --prefix --keys-only
拿前缀通配获取
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379" get /name/ --prefix
删除key
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379" del  /name/1
拿前缀通配删除
etcdctl   --endpoints="http://172.16.244.115:2379,http://172.16.244.12:2379,http://172.16.244.61:2379" del  /name/  --prefix


etcd:性能调优:https://mp.weixin.qq.com/s/tEaRGXGCeCJxwU_SU7ZBOQ

Tag:kubernetes docker etcd
相关文章

发表评论: