Etcd 压缩整理

etcd数据存储

在实际生产中使用 ETCD 存储元数据,起初集群规模不大的时候元数据信息不多没有发现什么问题。随着集群规模越来越大,可能引发存储问题。


—auto-compaction-retention
由于ETCD数据存储多版本数据,随着写入的主键增加历史版本需要定时清理,默认的历史数据是不会清理的,数据达到2G就不能写入,必须要清理压缩历史数据才能继续写入。根据业务需求,在上生产环境之前就提前确定,历史数据多长时间压缩一次。

#启动命令  /usr/bin/etcd --auto-compaction-retention '1'

快照

etcd的存储分为内存存储和持久化(硬盘)存储两部分,内存中的存储除了顺序化的记录下所有用户对节点数据变更的记录外,还会对用户数据进行索引、建堆等方便查询的操作。而持久化则使用预写式日志(WAL:Write Ahead Log)进行记录存储。

在WAL的体系中,所有的数据在提交之前都会进行日志记录。在etcd的持久化存储目录中,有两个子目录。一个是WAL,存储着所有事务的变化记录;另一个则是snapshot,用于存储某一个时刻etcd所有目录的数据。通过WAL和snapshot相结合的方式,etcd可以有效的进行数据存储和节点故障恢复等操作。

既然有了WAL实时存储了所有的变更,为什么还需要snapshot呢?随着使用量的增加,WAL存储的数据会暴增,为了防止磁盘很快就爆满,etcd默认每10000条记录做一次snapshot,经过snapshot以后的WAL文件就可以删除。而通过API可以查询的历史etcd操作默认为1000条。

 

 

etcd压缩整理

默认存储大小限制是 2GB, 可以通过 --quota-backend-bytes 标记配置; 最大支持 8GB

根据实践发现只配置 auto-compaction-retention只会做碎片整理,不会实际减少空间大小;如果需要减少大小还是需要使用etcdctl compact 和 etcdctl defrag清理空间

若果已经设置默认存储大小为8GB, 还存在 Error: rpc error: code = 8 desc = etcdserver: mvcc: database space exceeded 的报错 请按以下操作手动压缩

master节点执行以下操作(每台都要操作):

获取etcdctl工具,若以下方式获取有问题,可以参考: etcdctl获取

 查找当前节点的etcd pod,copy出etcdctl工具

kubectl -n kube-system cp etcd-kcs-euler-125-m-4xk6z:/usr/local/bin/etcdctl ./etcdctl

赋予权限

sudo chmod +x  etcdctl  && mv  etcdctl /usr/local/bin/

若是存量双栈v6优先集群,则需要使用--endpoints=https://[::1]:2379

alias ETCDCTL_VV="/usr/local/bin/etcdctl --endpoints=https://localhost:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key"

 查看etcd已使用存储空间

ETCDCTL_VV --write-out=table endpoint status --cluster+------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|        ENDPOINT        |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://10.20.0.8:2379 | 1ed28cd2451e3407 |   3.5.6 |  5.9 GB |     false |      false |        10 |  794275440 |          794275440 |        |
| https://10.20.0.9:2379 | 553c78b3da279422 |   3.5.6 |  5.9 GB |      true |      false |        10 |  794275440 |          794275440 |        |
| https://10.20.0.7:2379 | d7f8cf57ef93a58c |   3.5.6 |  5.8 GB |     false |      false |        10 |  794275440 |          794275440 |        |
+------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

执行压缩步骤

1、 获取当前版本 

ETCDCTL_VV endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*'
rev=$(ETCDCTL_VV endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')

2、压缩所有旧版本 

ETCDCTL_VV compact $rev

历史版本越多,存储空间越大,性能越差,直到etcd到达空间配额限制的时候,etcd的写入将会被禁止变为只读,影响线上服务,因此这些历史版本需要进行压缩。

数据压缩并不是清理现有数据,只是对给定版本之前的历史版本进行清理,清理后数据的历史版本将不能访问,但不会影响现有最新数据的访问。

手动压缩     etcdctl compact 5。 在 5 之前的所有版本都会被压缩,不可访问

3、整理多余的空间  去碎片化(清理磁盘碎片 defrag)

ETCDCTL_VV defrag

4、取消告警信息

ETCDCTL_VV alarm disarm

5、重新查询 etcd 状态可发现 etcd 空间变化

 
ETCDCTL_VV  endpoint status  --cluster --write-out=table +------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|        ENDPOINT        |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://localhost:2379 | d9fe35af000dac45 |   3.5.6 |  4.2 MB |     false |      false |         5 |    3125010 |            3125010 |        |
+------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

 

 参数说明 启动参数

--name etcd-1 // 节点名称
--data-dir /Users/noogel/Debug/data/etcd1 // 数据目录
--initial-advertise-peer-urls http://127.0.0.1:238
--listen-peer-urls http://127.0.0.1:2381
--listen-client-urls http://127.0.0.1:2379
--advertise-client-urls http://127.0.0.1:2379
--initial-cluster-token etcd-lock-cluster-1 // 集群 token
--initial-cluster etcd-1=http://127.0.0.1:2381,etcd-2=http://127.0.0.1:2382,etcd-3=http://127.0.0.1:2383 // 集群节点信息
--initial-cluster-state new // 初始化的集群状态
--heartbeat-interval 1000 // 心跳间隔
--auto-compaction-retention 1 // 开启自动压缩,间隔 1h 执行
--auto-compaction-mode periodic
--quota-backend-bytes 8589934592 // 后端存储大小
--election-timeout 5000 // 选举超时时间

关于自动压缩 https://etcd.io/docs/v3.4/op-guide/maintenance/#defragmentation

  • --auto-compaction-mode=revision --auto-compaction-retention=1000 每5分钟自动压缩”latest revision” - 1000
  • --auto-compaction-mode=periodic --auto-compaction-retention=12h 每1小时自动压缩并保留12小时窗口。

自动压缩碎片后还需要单独再清理占用的系统存储空间,etcdctl defrag

最佳实践
heartbeat timeout 默认为 100ms,推荐配置为 1s;
election timeout 默认为 1000ms,推荐为 5s(election timeout >= 5 * heartbeat timeout);
quota-backend-bytes 默认为 2G(最大值8G),推荐根据集群容量预估调整;
配置 auto-compaction-retention=1 和 auto-compaction-mode=periodic 参数,定期压缩历史数据;
推荐通过 cronjob 定期执行 etcdctl defrag(如果 defrag 执行时间 > election timeout,则集群会进入重新选主模式)

 

 

定时任务示例

注意:

  • 确保每台master上都有etcdctl工具
  • 在master节点上(每一台都部署),部署crontab ,在维护时间段,定时压缩etcd
  • 定时脚本存放位置可自行调整
#!/usr/bin/env bashecho $(date "+%Y-%m-%d %H:%M:%S")echo -e "\n[1]===压缩前查询 etcd 状态==\n"export ETCDCTL_API=3alias ETCDCTL_VV="/usr/local/bin/etcdctl --endpoints=https://localhost:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key"ETCDCTL_VV --write-out=table endpoint statusecho -e "\n[2]===获取当前版本===\n"ETCDCTL_VV endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*'
rev=$(ETCDCTL_VV endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*')echo -e "\n[3]===压缩所有旧版本===\n"
ETCDCTL_VV compact $revecho -e "\n[4]===整理多余的空间===\n"
ETCDCTL_VV defrag echo -e "\n[5]===取消告警信息===\n"
ETCDCTL_VV alarm disarmecho -e "\n[6]===压缩整理后 etcd 状态可发现 etcd 空间变化===\n"
ETCDCTL_VV  --write-out=table endpoint status

定时任务示例

crontab  -e  编写

crontab -l  查看

每周日凌晨1点(示例),建议3个master定时任务间隔一些时间,比如5-10min

0 1 * * 0  sh /opt/cron/etcd_comtact_cron.sh > /opt/cron/etcd_comtact_cron.out 2>&1 

每小时(示例)

0 * * * * sh /opt/cron/etcd_comtact_cron.sh > /opt/cron/etcd_comtact_cron.out 2>&1 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【更新完毕】2025妈妈杯C题 mathercup数学建模挑战赛C题数学建模思路代码文章教学:音频文件的高质量读写与去噪优化

完整内容请看文章最下面的推广群 我将先给出文章、代码、结果的完整展示, 再给出四个问题详细的模型 面向音频质量优化与存储效率提升的自适应编码与去噪模型研究 摘 要 随着数字媒体技术的迅速发展,音频处理技术在信息时代的应用愈加广泛,特别是在存储…

React-请勿在循环或者条件语句中使用hooks

这是React Hooks的首要规则,这是因为React Hooks 是以单向循环链表的形式存储,即是有序的。循环是为了从最后一个节点移到一个节点的时候,只需通过next一步就可以拿到第一个节点,而不需要一层层回溯。React Hooks的执行&#xff0…

【大模型】 LangChain框架 -LangChain实现问答系统

LangChain 介绍与使用方法 1. 什么是 LangChain?2. LangChain 的主要功能3. 如何使用 LangChain?3.1 环境准备3.2 基本使用示例3.2.1 简单的问答系统3.2.2 结合外部工具 3.3 高级用法 4. 常见问题及解决方法4.1 安装问题4.2 运行问题4.3 性能问题 5. 实战…

企业级HAProxy高可用离线部署实战(附Kubernetes APIServer负载均衡配置)

企业级HAProxy高可用离线部署实战(附Kubernetes APIServer负载均衡配置) 摘要:本文深入讲解在离线环境下部署HAProxy 3.1.1的全流程,涵盖源码编译、系统服务封装、K8S APIServer四层负载配置等核心环节,并提供生产级高…

Python网络爬虫设计(一)

目录 一、网络爬虫 1、基本的爬虫 2、获取URL 3、查找网页源码关键字 4、代码实现 二、requests库 1、requests的优势和劣势 2、获取网页的其他库 (1)selenium库 (2)pyppeteer库 三、pyppeteer库 1、pyppeteer库的来历…

BR_频谱20dB 带宽(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])

目录 一、规范要求 1、协议章节 2、测试目的 二、测试方法 1、样机初值条件: 2、测试步骤: 方法一:频谱仪 方法二:综测仪CMW500 3、预期结果 一、规范要求 1、协议章节 4.5.5 RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Ba…

【橘子大模型】初探rag知识库的构建

一、简介 我们在实现了一系列功能之后,终于来到了rag的部分,下面我们将基于langchain来实现一个rag检索。 关于rag方面的知识,可以查看这两篇文章: 大模型应用之RAG详解 什么是 RAG(检索增强生成) 或者是去…

CentOS7执行yum命令报错 Could not retrieve mirrorlist http://mirrorlist.centos.org

CentOS7执行yum命令报错 引更新yum源备份原有源创建新的源文件清理并重建缓存 引 CentOS 7 系统无法连接到 CentOS 的官方镜像站点。这通常是由于网络问题或 CentOS 7 已停止维护导致的(2024年6月30日后 CentOS 7 已进入 EOL) 报错明细: 已…

VSCode安装与环境配置(Mac环境)

20250419 - 概述 大概是非常久之前了,装了VSCode,估计都得21的时候了,电脑上也没更新过。当时安装也直接装上就完事了。这次把版本更新一下,同时记录一下这个安装过程。 安装 mac下安装非常简单,直接从官网下载&am…

QML动画--ParallelAnimation和SequentialAnimation

一、ParallelAnimation ParallelAnimation 是 QML 中用于并行执行多个动画的容器动画类型,可以同时运行多个子动画。 基本用法 qml import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0; opacity: 1.0ParallelAnim…

NLP高频面试题(四十三)——什么是人类偏好对齐中的「对齐税」(Alignment Tax)?如何缓解?

一、什么是「对齐税」(Alignment Tax)? 所谓「对齐税」(Alignment Tax),指的是在使人工智能系统符合人类偏好的过程中,所不可避免付出的性能损失或代价。换句话说,当我们迫使AI遵循人类价值观和规范时,AI系统往往无法达到其最大理论性能。这种性能上的妥协和折衷,就…

速查手册:TA-Lib 超过150种量化技术指标计算全解 - 1. Overlap Studies(重叠指标)

速查手册:TA-Lib 超过150种量化技术指标计算全解 - 1. Overlap Studies(重叠指标) TA-Lib(Technical Analysis Library)是广泛使用的金融技术分析库,实现了超过150种技术指标计算函数,适用于股票…

重构未来智能:Anthropic 解码Agent设计哲学三重奏

第一章 智能体进化论:从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…

Git 中修改某个特定的commit提交内容

在 Git 中修改某个特定的提交(commit)通常需要使用 交互式变基(Interactive Rebase) 或 修改提交(Commit Amend)。以下是不同场景下的具体操作步骤: 一、修改最近的提交(最新提交&am…

ZLMediaKit流媒体服务器

ZLMediaKit 简介 ZLMediaKit 是一个基于 C11 开发的高性能流媒体服务器框架,支持 RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、HTTP-TS、WebSocket-TS、HTTP-fMP4、WebSocket-fMP4 等多种流媒体协议。 主要特性 多协议支持: 支持 RTSP/RTMP/HLS/HTTP-F…

数字电子技术基础(五十)——硬件描述语言简介

目录 1 硬件描述语言简介 1.1 硬件描述语言简介 1.2 硬件编程语言的发展历史 1.3 两种硬件描述的比较 1.4 硬件描述语言的应用场景 1.5 基本程序结构 1.5.1 基本程序结构 1.5.2 基本语句和描述方法 1.5.3 仿真 1 硬件描述语言简介 1.1 硬件描述语言简介 硬件描述语…

SQL系列:常用函数

1、【MySQL】合并字段函数(列转行) 它可以将两个字段中的数据合并到一个字段中。 1)CONCAT函数 CONCAT函数可以将多个字段中的数据合并到一个字段中。它的语法格式如下: SELECT CONCAT(字段1,字段2,...字段N) FROM 表名;SELEC…

多线程和线程同步

多线程在项目开发中使用频率高,使用多线程能够提高程序的并发性 提高程序的并发性:1.多线程,对系统资源的消耗更小一些 2.多进程 系统的cpu资源有线,cpu时间片被分好后,由系统进行调度,每个线程在执行的时候都需要抢这个cpu的时间片。如果抢到了,就执行,如果没抢到,…

时序数据预测:TDengine 与机器学习框架的结合(一)

一、引言 在当今数字化时代,时序数据如潮水般涌来,广泛存在于物联网、工业监控、金融交易、气象监测等众多领域。这些按时间顺序记录的数据蕴含着丰富的信息,对其进行准确预测,能够为企业和组织的决策提供有力支持,带…

elementUI中MessageBox.confirm()默认不聚焦问题处理

在项目中使用elementUI的MessageBox.confirm()出现了默认不聚焦的问题,默认确认按钮是浅色的,需要点击一下才会变成正常。面对这种问题,创建新组件,实现聚焦。替换默认的MessageBox.confirm() 解决 创建components/MessageBoxCo…