etcd的容器备份工具


在这里插入图片描述

问题

由于上周五办公室大厦的变压器坏掉,造成办公室服务器瞬间断电。后来进行恢复时候,居然发现一台etcd的数据不见了。这下悲剧了,它配置给apisix作为路径数据存储的,数据没有后,现在很多服务都无法访问了。

我曾经问过apisix的开发团队为什么没有配置备份功能。开发团队说,你备份一下etcd的数据库就好了。当时没有在意这事。现在吃了个大亏。
后面我会单独弄个企业备份系列

本来是准备把jenkins的系列写完,再写其他内容,既然赶上了,还是把这个事情总结写一写, 后面准备一个 docker 不求人系列

简单的etcd 介绍

etcd的定义

etcd是一个开源的分布式键值存储系统,由CoreOS团队开发,常用于服务发现、配置共享和协调分布式系统。它基于Raft一致性算法实现高可用性,提供强一致性的数据读写能力。

etcd的核心特性

高可用性:通过Raft协议确保集群中多个节点数据一致,即使部分节点故障也能正常服务。
强一致性:所有读写操作需经过多数节点确认,保证数据准确性。
简单API:提供基于HTTP/JSON和gRPC的接口,支持键值操作的增删改查。
Watch机制:客户端可监听键的变化,实时获取更新通知。

etcd与类似系统的对比

ZooKeeper:etcd更轻量,API更简单,而ZooKeeper功能更丰富(如临时节点)。
Consul:Consul内置服务发现和健康检查,etcd更专注于键值存储。
Redis:高性能缓存、多样化数据结构、实时数据处理。
etcd广泛应用于Kubernetes等云原生系统,作为核心数据存储组件。

总结

你可以把它当成一种数据库来使用就可以了。当然,根据不同应用场景,也可以考虑不同的类似的组件。

需求和实现的例子

我的需求很简单,对etcd 的数据可以备份,以便出现故障的时候可以恢复。
根据etcd 资料,我们可以使用 etcdctl 来进行备份。

  • 使用etcdctl 备份
  • 能够定时执行
  • 能够清理过期的备份文件

实现方式

最开始的时候,我尝试在bitnami-etcd 的镜像上面安装 etcdctl ,cron 组件,并定时执行备份过程。
在基于bitnami-ectd上面做了几次尝试发现有一定问题,权限方面和执行脚本上存在问题。

因此切换成为独立的容器镜像,并通过 etcdctl 通过http协议来进行数据备份。 核心脚本如下

# 保存快照
echo "[INFO] 备份 etcd 快照到 ${SNAPSHOT_FILE}"
ETCDCTL_API=3 etcdctl snapshot save "$SNAPSHOT_FILE" \
  --endpoints="${ETCD_URLS:-http://127.0.0.1:2379}"

整个Dockerfile 内容为

FROM registry.cn-hangzhou.aliyuncs.com/ali-cache/alpine:3.19

# 指定 etcdctl 版本
ARG ETCD_VERSION=v3.5.14
#ENV ETCDCTL_DOWNLOAD_URL="https://ghproxy.com/https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz"
# 替换成自己的下载地址,国外的太慢了
ARG ETCDCTL_DOWNLOAD_URL="https://cdn-media-dev.example.com/docker-build/etcd-v3.5.14-linux-amd64.tar.gz"


# 替换 apk 源为阿里云,加快下载速度
RUN sed -i 's|https://dl-cdn.alpinelinux.org|https://mirrors.aliyun.com|g' /etc/apk/repositories

# 安装 bash + curl + tzdata + ca 证书 + cron
RUN apk update && apk add --no-cache bash curl ca-certificates tzdata busybox-extras

# 下载并安装 etcdctl
RUN curl -L ${ETCDCTL_DOWNLOAD_URL} -o /tmp/etcd.tar.gz \
 && tar -xzf /tmp/etcd.tar.gz -C /tmp \
 && mv /tmp/etcd-${ETCD_VERSION}-linux-amd64/etcdctl /usr/local/bin/etcdctl \
 && chmod +x /usr/local/bin/etcdctl \
 && rm -rf /tmp/*

RUN mkdir -p /backup && mkdir -p /backup/data

# 拷贝备份脚本和定时任务
COPY etcd-backup.sh /backup/etcd-backup.sh
#COPY crontab /etc/crontabs/root
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /backup/etcd-backup.sh /entrypoint.sh

CMD ["/entrypoint.sh"]

配合 entrypoint.sh etcd-backup.sh 就可以了。

运行时候,通过参数就可以进行远程 etcd 的数据备份了。
#可以映射到主机的备份路径
ETCD_BACKUP_DIR=/etcd_backup
#需要备份的etcd服务地址
ETCD_URLS=http://etcd3:2379
#定时执行的时间,下面是凌晨两点执行
CRON_SCHEDULE=0 2 * * *

备份好的文件

总用量 1788
-rw-------. 1 root root 606240 6月 23 22:00 2025-06-24.db
-rw-------. 1 root root 606240 6月 24 22:00 2025-06-25.db
-rw-------. 1 root root 606240 6月 25 22:00 2025-06-26.db

好的,这下不怕停电了。


请收藏问题合集,方便随时查找
jenkins的全解-工欲善其事,必先利其器


最近夏天跳闸断电,莫名几个虚拟机数据丢了。。哎,

在这里插入图片描述某东 USB4 接口 的硬盘盒-一个字 快! USB 4 接口就是快,就是不用等那种快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山外山与楼外楼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值