etcd集群的数据的备份和恢复及etcd-workbench实战
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一. etcd的基本使用
1.etcd基础操作概述
etcd的操作和zookeeper,Redis的操作类似,存储数据都是键值对。
2.etcd增删改查基础操作
2.1 写入数据KEY的school,value等于yinzhengjie
[root@node-exporter41 ~]# etcdctl put school yinzhengjie
OK
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl put /class linux97
OK
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl put classroom 教室5
OK
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl put /etc/hosts 10.0.0.141 ceph141
OK
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl put /yinzhengjie/docker/registry 轻量级镜像仓库
OK
[root@node-exporter41 ~]#
2.2 查看数据
[root@node-exporter41 ~]# etcdctl get school
school
yinzhengjie
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get school --keys-only
school
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get school --print-value-only
yinzhengjie
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get / --prefix --keys-only
/class
/etc/hosts
/yinzhengjie/docker/registry
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get / --prefix --print-value-only
linux97
10.0.0.141
轻量级镜像仓库
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get "" --prefix --keys-only # 查看etcd所有数据
/class
/etc/hosts
/yinzhengjie/docker/registry
classroom
school
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get "" --prefix --print-value-only
linux97
10.0.0.141
轻量级镜像仓库
教室5
yinzhengjie
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get "" --prefix
/class
linux97
/etc/hosts
10.0.0.141
/yinzhengjie/docker/registry
轻量级镜像仓库
classroom
教室5
school
yinzhengjie
[root@node-exporter41 ~]#
2.3 修改数据
[root@node-exporter42 ~]# etcdctl get school --print-value-only
yinzhengjie
[root@node-exporter42 ~]#
[root@node-exporter41 ~]# etcdctl put school 老男孩IT教育
OK
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get school --print-value-only
老男孩IT教育
[root@node-exporter41 ~]#
2.4 删除数据
[root@node-exporter41 ~]# etcdctl get "" --prefix --keys-only
/class
/etc/hosts
/yinzhengjie/docker/registry
classroom
school
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl del school
1
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl del / --prefix
3
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get "" --prefix --keys-only
classroom
[root@node-exporter41 ~]#
二.etcd集群数据备份和恢复
推荐阅读:
https://etcd.io/docs/v3.5/op-guide/recovery/
https://etcd.io/docs/v3.5/op-guide/
https://etcd.io/docs/v3.5/learning/
https://etcd.io/docs/v3.5/upgrades/
1 原生数据【数据随机创建即可,用于模拟备份环节】
[root@node-exporter41 ~]# etcdctl get "" --prefix
/yinzhengjie/linux97/first
陈梦元
/yinzhengjie/linux97/fourth
徐灵杰
/yinzhengjie/linux97/second
任鹏宇
/yinzhengjie/linux97/third
贾震
class
linux97
classroom
教室5
school
yinzhengjie
[root@node-exporter41 ~]#
2 创建快照用于备份数据
[root@node-exporter41 ~]# \etcdctl snapshot save /tmp/yinzhengjie-etcd-`date +%F`.backup
{"level":"info","ts":"2025-05-15T14:54:56.340375+0800","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/tmp/yinzhengjie-etcd-2025-05-15.backup.part"}
{"level":"info","ts":"2025-05-15T14:54:56.341243+0800","logger":"client","caller":"v3@v3.5.21/maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2025-05-15T14:54:56.341274+0800","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"127.0.0.1:2379"}
{"level":"info","ts":"2025-05-15T14:54:56.343658+0800","logger":"client","caller":"v3@v3.5.21/maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2025-05-15T14:54:56.344576+0800","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"127.0.0.1:2379","size":"20 kB","took":"now"}
{"level":"info","ts":"2025-05-15T14:54:56.344728+0800","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/tmp/yinzhengjie-etcd-2025-05-15.backup"}
Snapshot saved at /tmp/yinzhengjie-etcd-2025-05-15.backup
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# ll /tmp/yinzhengjie-etcd-`date +%F`.backup
-rw------- 1 root root 20512 May 15 14:54 /tmp/yinzhengjie-etcd-2025-05-15.backup
[root@node-exporter41 ~]#
3.查看快照的基本信息
[root@node-exporter41 ~]# etcdctl snapshot status /tmp/yinzhengjie-etcd-`date +%F`.backup -w table # 查看官网文档的状态
Deprecated: Use `etcdutl snapshot status` instead.
+----------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| 1583e0e8 | 15 | 24 | 20 kB |
+----------+----------+------------+------------+
[root@node-exporter41 ~]#
4.将快照拷贝到其他两个集群节点
[root@node-exporter41 ~]# scp /tmp/yinzhengjie-etcd-`date +%F`.backup 10.0.0.42:/tmp
[root@node-exporter41 ~]# scp /tmp/yinzhengjie-etcd-`date +%F`.backup 10.0.0.43:/tmp
5 删除所有数据【搞破坏】
[root@node-exporter41 ~]# etcdctl get "" --prefix
/yinzhengjie/linux97/first
陈梦元
/yinzhengjie/linux97/fourth
徐灵杰
/yinzhengjie/linux97/second
任鹏宇
/yinzhengjie/linux97/third
贾震
class
linux97
classroom
教室5
school
yinzhengjie
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl del "" --prefix
7
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get "" --prefix
[root@node-exporter41 ~]#
6 停止etcd集群
[root@node-exporter41 ~]# systemctl stop etcd
[root@node-exporter42 ~]# systemctl stop etcd
[root@node-exporter43 ~]# systemctl stop etcd
7.各节点恢复数据 【恢复的数据目录必须为空】
[root@node-exporter41 ~]# etcdctl snapshot restore /tmp/yinzhengjie-etcd-`date +%F`.backup --data-dir=/var/lib/etcd-2025
Deprecated: Use `etcdutl snapshot restore` instead.
2025-05-15T14:59:18+08:00 info snapshot/v3_snapshot.go:265 restoring snapshot {"path": "/tmp/yinzhengjie-etcd-2025-05-15.backup", "wal-dir": "/var/lib/etcd-2025/member/wal", "data-dir": "/var/lib/etcd-2025", "snap-dir": "/var/lib/etcd-2025/member/snap", "initial-memory-map-size": 0}
2025-05-15T14:59:18+08:00 info membership/store.go:138 Trimming membership information from the backend...
2025-05-15T14:59:18+08:00 info membership/cluster.go:421 added member {"cluster-id": "cdf818194e3a8c32", "local-member-id": "0", "added-peer-id": "8e9e05c52164694d", "added-peer-peer-urls": ["http://localhost:2380"], "added-peer-is-learner": false}
2025-05-15T14:59:18+08:00 info snapshot/v3_snapshot.go:293 restored snapshot {"path": "/tmp/yinzhengjie-etcd-2025-05-15.backup", "wal-dir": "/var/lib/etcd-2025/member/wal", "data-dir": "/var/lib/etcd-2025", "snap-dir": "/var/lib/etcd-2025/member/snap", "initial-memory-map-size": 0}
[root@node-exporter41 ~]#
[root@node-exporter42 ~]# etcdctl snapshot restore /tmp/yinzhengjie-etcd-`date +%F`.backup --data-dir=/var/lib/etcd-2025
Deprecated: Use `etcdutl snapshot restore` instead.
2025-05-15T14:59:42+08:00 info snapshot/v3_snapshot.go:265 restoring snapshot {"path": "/tmp/yinzhengjie-etcd-2025-05-15.backup", "wal-dir": "/var/lib/etcd-2025/member/wal", "data-dir": "/var/lib/etcd-2025", "snap-dir": "/var/lib/etcd-2025/member/snap", "initial-memory-map-size": 0}
2025-05-15T14:59:42+08:00 info membership/store.go:138 Trimming membership information from the backend...
2025-05-15T14:59:42+08:00 info membership/cluster.go:421 added member {"cluster-id": "cdf818194e3a8c32", "local-member-id": "0", "added-peer-id": "8e9e05c52164694d", "added-peer-peer-urls": ["http://localhost:2380"], "added-peer-is-learner": false}
2025-05-15T14:59:42+08:00 info snapshot/v3_snapshot.go:293 restored snapshot {"path": "/tmp/yinzhengjie-etcd-2025-05-15.backup", "wal-dir": "/var/lib/etcd-2025/member/wal", "data-dir": "/var/lib/etcd-2025", "snap-dir": "/var/lib/etcd-2025/member/snap", "initial-memory-map-size": 0}
[root@node-exporter42 ~]#
[root@node-exporter43 ~]# etcdctl snapshot restore /tmp/yinzhengjie-etcd-`date +%F`.backup --data-dir=/var/lib/etcd-2025
Deprecated: Use `etcdutl snapshot restore` instead.
2025-05-15T15:00:41+08:00 info snapshot/v3_snapshot.go:265 restoring snapshot {"path": "/tmp/yinzhengjie-etcd-2025-05-15.backup", "wal-dir": "/var/lib/etcd-2025/member/wal", "data-dir": "/var/lib/etcd-2025", "snap-dir": "/var/lib/etcd-2025/member/snap", "initial-memory-map-size": 0}
2025-05-15T15:00:41+08:00 info membership/store.go:138 Trimming membership information from the backend...
2025-05-15T15:00:41+08:00 info membership/cluster.go:421 added member {"cluster-id": "cdf818194e3a8c32", "local-member-id": "0", "added-peer-id": "8e9e05c52164694d", "added-peer-peer-urls": ["http://localhost:2380"], "added-peer-is-learner": false}
2025-05-15T15:00:41+08:00 info snapshot/v3_snapshot.go:293 restored snapshot {"path": "/tmp/yinzhengjie-etcd-2025-05-15.backup", "wal-dir": "/var/lib/etcd-2025/member/wal", "data-dir": "/var/lib/etcd-2025", "snap-dir": "/var/lib/etcd-2025/member/snap", "initial-memory-map-size": 0}
[root@node-exporter43 ~]#
8.将恢复后的数据目录作为新的数据目录
[root@node-exporter41 ~]# grep "/var/lib/etcd" /yinzhengjie/softwares/etcd/etcd.config.yml
data-dir: /var/lib/etcd
wal-dir: /var/lib/etcd/wal
[root@node-exporter41 ~]#
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# sed -ri "s#(/var/lib/etcd)#\1-2025#g" /yinzhengjie/softwares/etcd/etcd.config.yml
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# grep "/var/lib/etcd" /yinzhengjie/softwares/etcd/etcd.config.yml
data-dir: /var/lib/etcd-2025
wal-dir: /var/lib/etcd-2025/wal
[root@node-exporter41 ~]#
[root@node-exporter42 ~]# sed -ri "s#(/var/lib/etcd)#\1-2025#g" /yinzhengjie/softwares/etcd/etcd.config.yml
[root@node-exporter42 ~]#
[root@node-exporter42 ~]# grep "/var/lib/etcd" /yinzhengjie/softwares/etcd/etcd.config.yml
data-dir: /var/lib/etcd-2025
wal-dir: /var/lib/etcd-2025/wal
[root@node-exporter42 ~]#
[root@node-exporter43 ~]# sed -ri "s#(/var/lib/etcd)#\1-2025#g" /yinzhengjie/softwares/etcd/etcd.config.yml
[root@node-exporter43 ~]#
[root@node-exporter43 ~]# grep "/var/lib/etcd" /yinzhengjie/softwares/etcd/etcd.config.yml
data-dir: /var/lib/etcd-2025
wal-dir: /var/lib/etcd-2025/wal
[root@node-exporter43 ~]#
9.启动etcd集群
[root@node-exporter41 ~]# systemctl start etcd
[root@node-exporter42 ~]# systemctl start etcd
[root@node-exporter43 ~]# systemctl start etcd
10.验证数据是否恢复
[root@node-exporter41 ~]# etcdctl get "" --prefix --keys-only
/yinzhengjie/docker/dockerhub
/yinzhengjie/docker/harbor
/yinzhengjie/docker/registry
offic
school
service
[root@node-exporter41 ~]#
11.测试数据是否可以正常读写
[root@node-exporter41 ~]# etcdctl put xixi 哈哈
OK
[root@node-exporter41 ~]#
[root@node-exporter41 ~]# etcdctl get "" --prefix --keys-only
/yinzhengjie/linux97/first
/yinzhengjie/linux97/fourth
/yinzhengjie/linux97/second
/yinzhengjie/linux97/third
class
classroom
school
xixi
[root@node-exporter41 ~]#
三.etcd-workbench图形化管理etcd集群
参考链接:
https://tzfun.github.io/etcd-workbench/
https://github.com/tzfun/etcd-workbench/blob/master/README_ZH.md
https://github.com/tzfun/etcd-workbench-web/blob/master/server/src/main/resources/etcd-workbench.conf
1.拉取镜像
docker pull tzfun/etcd-workbench:1.1.4
SVIP:
[root@node-exporter43 ~]# wget http://192.168.17.253/Resources/Prometheus/images/etcd-workbench/yinzhengjie-etcd-workbench-v1.1.4.tar.gz
[root@node-exporter43 ~]# docker load -i yinzhengjie-etcd-workbench-v1.1.4.tar.gz
2.运行etcd-workbench
[root@node-exporter43 ~]# cat etcd-workbench.conf
[server]
# 服务监听的端口
port = 8002
# 链接超时时间
etcdExecuteTimeoutMillis = 3000
# 数据存储目录
dataDir = ./data
[auth]
# 启用认证功能
enable = true
# 指定用户名和密码
user = admin:yinzhengjie
[log]
# 指定日志的级别
level = INFO
# 日志存储目录
file = ./logs
# 日志文件的名称
fileName = etcd-workbench
# 指定日志的滚动大小
fileLimitSize = 100
# 日志打印的位置
printers = std,file
[root@node-exporter43 ~]#
[root@node-exporter43 ~]# docker run -d -v /root/etcd-workbench.conf:/usr/tzfun/etcd-workbench/etcd-workbench.conf --name etcd-workbench --network host tzfun/etcd-workbench:1.1.4
88e4dc60963e92f988a617727e7cf76db3e0d565096859ca63549bed7883fc46
[root@node-exporter43 ~]#
[root@node-exporter43 ~]# ss -ntl | grep 8002
LISTEN 0 4096 *:8002 *:*
[root@node-exporter43 ~]#
[root@node-exporter43 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88e4dc60963e tzfun/etcd-workbench:1.1.4 "/bin/sh -c 'java …" 9 seconds ago Up 8 seconds etcd-workbench
[root@node-exporter43 ~]#
3.访问etcd-workbench的webUI
http://10.0.0.43:8002/
用户名和密码使用你自定义的即可。
4.拷贝证书到windows系统
cert-file: '/yinzhengjie/certs/etcd/etcd-server.pem'
key-file: '/yinzhengjie/certs/etcd/etcd-server-key.pem'
trusted-ca-file: '/yinzhengjie/certs/etcd/etcd-ca.pem'
5.上传证书并测试
略,见视频。
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/18859688,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。