美文网首页
2022-11-29-etcd管理命令及快照的备份与恢复

2022-11-29-etcd管理命令及快照的备份与恢复

作者: DGFM | 来源:发表于2022-11-29 12:21 被阅读0次

etcd是一个key-value模式(1key1值)的分布式数据库,由GO语言开发;

etcd具有以下属性

1.完全复制性:集群中每个节点都可以使用完整的存档;

2.高可用性:

3.一致性:每次读取都会返回跨多主机的最新写入;

4.简单:包括一个定义良好的面向用户API;

5.安全:实现了带有可选客户端证书身份验证的自动化TLS;

6.快速:每秒1W次的写入速度;

7.可靠:使用raft算法实现了存储合理分布;

设备选型:

非负重情况:2-4C,8G内存;

负重情况:8-16C,16-64G内存;

对磁盘要求很高,尽量使用SSD,网络最好使用万兆网络,至少要是千兆,并且不要让网络保证在高负载情况;

以下硬件示例,仅供参考,通常使用时会比示例需求提高一倍;

etcd的service文件,默认位置etcd节点的/etc/systemd/system/etcd.service。service文件生效的前提,首先保证书写内容没有问题,其次是保证WorkingDirectory(工作目录)和ExecStart(二进制文件目录)位置不要出错;

etcd.service文件示例:

  1 [Unit]

  2 Description=Etcd Server

  3 After=network.target

  4 After=network-online.target

  5 Wants=network-online.target

6 Documentation=https://github.com/coreos

  8 [Service]

  9 Type=notify

10 WorkingDirectory=/var/lib/etcd

11 ExecStart=/usr/local/bin/etcd \

12   --name=etcd-192.168.1.35 \        #当前节点名称,每个etcd节点名称必须不同;

13   --cert-file=/etc/kubernetes/ssl/etcd.pem \        #cert认证文件位置;

14   --key-file=/etc/kubernetes/ssl/etcd-key.pem \        #key文件位置;

15   --peer-cert-file=/etc/kubernetes/ssl/etcd.pem \        

16   --peer-key-file=/etc/kubernetes/ssl/etcd-key.pem \

17   --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \

18   --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \

19   --initial-advertise-peer-urls=https://192.168.1.35:2380\        #etcd集群通告地址;

20   --listen-peer-urls=https://192.168.1.35:2380\

21   --listen-client-urls=https://192.168.1.35:2379,http://127.0.0.1:2379\        #客户端访问地址;

22   --advertise-client-urls=https://192.168.1.35:2379\        #客户端通告地址;

23   --initial-cluster-token=etcd-cluster-0 \        #创建集群时使用的token,集群中的节点此项要保持一致;

24   --initial-cluster=etcd-192.168.1.35=https://192.168.1.35:2380\        #etcd集群内部所有节点的名称和地址信息,名称需要和--name参数相同;

25   --initial-cluster-state=new \        #集群状态;

26   --data-dir=/var/lib/etcd \        #数据目录;

27   --wal-dir= \        #日志目录;

28   --snapshot-count=50000 \        #快照数量;

29   --auto-compaction-retention=1 \        #对数据进行压缩的周期,默认单位是小时;

30   --auto-compaction-mode=periodic \

31   --max-request-bytes=10485760 \        #客户端最大请求字节数上限;

32   --quota-backend-bytes=8589934592        #在etcd中可存储的最大pod元数据信息数量;

33 Restart=always

34 RestartSec=15

35 LimitNOFILE=65536

36 OOMScoreAdjust=-999

37

38 [Install]

39 WantedBy=multi-user.target

# export NODE_IPS="192.168.1.35"        #声明etcd节点IP地址;

# for ip in ${NODE_IPS}; do  ETCDCTL_API=3 /usr/local/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done        #调用声明的IP,测试etcd状态,显示心跳信息,任意etcd节点都可以使用;

# for ip in ${NODE_IPS}; do  ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table member list --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done        #功能同上,只是以表格格式输出;

# etcdctl endpoint health        #检查本机集群心跳信息;

# ETCDCTL_API=3 /usr/local/bin/etcdctl defrag --cluster --endpoints=https://192.168.1.35:2379--cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem        #整理集群存储碎片,可以略微提升读取速度,建议低峰期使用;

# for ip in ${NODE_IPS}; do  ETCDCTL_API=3 /usr/local/bin/etcdctl --write-out=table endpoint status --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem; done        #列表方式输出etcd集群中,各节点信息;

etcd的增删改查,注意这些操作正常应该由K8S来执行,此处只是介绍命令和用法,非特殊不推荐在生产节点上执行;

# etcdctl get        #查询;

# etcdctl put        #修改;

# etcdctl del        #删除,危险;

etcd的watch机制,基于不断监控数据,发生变化就主动发送触发通知客户端,Etcd v3的watch机制可以基于某一个固定的key,也支持watch一个范围;

etcd备份和恢复:

etcd的备份是使用快照机制来执行的;

etcd v3 版本中存在一个wal(write ahead log)预写日志,其功能是,在真正写入操作执行之前,先将操作写入此日志。wal记录了整个数据变化的全部历程;

wal默认存放位置:/var/lib/etcd/member/wal/,这个路径位置是在/etc/systemd/system/etcd.service中声明的;

/var/lib/etcd/member/snap/db        #存放的是etcd集群序列化后的数据;

# etcdctl snapshot save        #创建快照;

操作:

# mkdir /tmp/etcd_snapshot        #创建快照保存路径;

# time=$(date "+%Y-%m-%d_%H:%M:%S")        #配置变量获取当前日期时间,中间连接符不要出现/;

# echo $time        #查看变量结果,进行确认;

# etcdctl snapshot save /tmp/etcd_snapshot/192.168.1.35_$time.db        #创建拥有对应日期时间的快照,此处因为时区不对,所获取的时间不对,所以在配置整个集群时需要先进行时间的修改;

通常备份操作在整个etcd集群中任意节点备份一次即可,并需要将快照移动到可靠的文件存储设备中;

# etcdctl snapshot restore        #恢复快照;

操作:

# etcdctl snapshot restore /tmp/etcd_snapshot/192.168.1.35_2022-11-27_06\:54\:16.db --data-dir="/tmp/etcd-test"        #通过快照恢复;

可以看到恢复时会在指定目录创建member目录,并将snap和wal文件全部恢复,也就是说,当需要进行etcd数据恢复时,我们只需要用恢复后的member文件替换原有数据目录即可(本实验默认db数据位置是/var/lib/etcd/member);

# etcdctl snapshot status        #后需要跟随具体参数,进行快照查询;

ezctl也提供了一个备份数据的方式:etcdctl snapshot save的备份方式仅适合单一节点,但如果我们是个etcd集群那么就要用到ezctl所提供的模式;

操作:

# ezctl backup k8s-cluster.1        #对k8s-cluster.1集群进行备份;

备份后文件位置/etc/kubeasz/clusters/k8s-cluster.1/backup

root@deploy:/etc/kubeasz/clusters/k8s-cluster.1/backup# ls /etc/kubeasz/clusters/k8s-cluster.1/backup/

snapshot_202211270738.db  snapshot.db

snapshot.db不带时间戳的文件即使最新备份文件;

# kubectl delete pod net-test2 -n myserver        #删除net-test2测试容器;

# ezctl restore k8s-cluster.1        #对k8s-cluster.1集群进行恢复,使用的快照默认是不带时间戳的snapshot.db;

/etc/kubeasz/roles/cluster-restore/tasks/main.yml        #这个文件中可以看出快照恢复操作的步骤;

- name: 停止ectd 服务

  service: name=etcd state=stopped

- name: 清除etcd 数据目录

  file: name={{ ETCD_DATA_DIR }}/member state=absent

- name: 生成备份目录

  file: name=/etcd_backup state=directory

- name: 准备指定的备份etcd 数据

  copy:

    src: "{{ cluster_dir }}/backup/{{ db_to_restore }}"

    dest: "/etcd_backup/snapshot.db"

- name: 清理上次备份恢复数据

  file: name=/etcd_backup/etcd-{{ inventory_hostname }}.etcd state=absent

- name: etcd 数据恢复

  shell: "cd /etcd_backup && \

        ETCDCTL_API=3 {{ bin_dir }}/etcdctl snapshot restore snapshot.db \

        --name etcd-{{ inventory_hostname }} \

        --initial-cluster {{ ETCD_NODES }} \

        --initial-cluster-token etcd-cluster-0 \

        --initial-advertise-peer-urls https://{{ inventory_hostname }}:2380"

- name: 恢复数据至etcd 数据目录

  shell: "cp -rf /etcd_backup/etcd-{{ inventory_hostname }}.etcd/member {{ ETCD_DATA_DIR }}/"

- name: 重启etcd 服务

  service: name=etcd state=restarted

- name: 以轮询的方式等待服务同步完成

  shell: "systemctl is-active etcd.service"

  register: etcd_status

  until: '"active" in etcd_status.stdout'

  retries: 8

  delay: 8

相关文章

网友评论

      本文标题:2022-11-29-etcd管理命令及快照的备份与恢复

      本文链接:https://www.haomeiwen.com/subject/kzplfdtx.html