
问题
由于上周五办公室大厦的变压器坏掉,造成办公室服务器瞬间断电。后来进行恢复时候,居然发现一台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 接口就是快,就是不用等那种快!