etcd数据备份数据恢复数据压缩碎片整理

在这#!/usr/bin/python3
# encoding: utf-8
#filename: etcd-backups-restore-compress-defragmentation.py
#author: gaohaixiang
#writetime:202401161055"""
脚本功能:
etcd 数据备份,使用备份数据进行数据库重构,数据压缩,碎片整理数据压缩及碎片整理的原因:
etcd数据写入频繁,导致版本不断叠加,从而导致数据库不断变大 \
需要对其进行压缩,进行碎片整理,从而减小etcd数据库的大小etcd默认的数据存储大小为2G,当超过这个存储大小,可能会限制数据写入 \
或者报错mcc、NOSPACE,除了进行数据压缩碎片整理外,还可以进行参数调整 \
etcd启动添加参数 --quota-backend-bytes ,将etcd存储调整到多少 \
单位为B,10737418240 为10Getcd启动示例:
/opt/etcd/etcd --quota-backend-bytes=10737418240 --auth-token jwt --config-file=/opt/etcd/nodefile.yml注意:
备份恢复是选择最新的一个备份进行数据恢复,不是指定固定的备份来进行操作"""import json
import subprocess
import datetime
import os
import stat
import getpass# 命令执行
def run_command(command):process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)stdout, stderr = process.communicate()return process.returncode, stdout, stderr# 目录权限检查
def check_directory_access(directory):if not os.path.isdir(directory):# print(f"Directory {directory} does not exist")# return False# 创建目录os.makedirs(directory)# 更改目录的权限,使得所有用户都可以读取和写入os.chmod(directory, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)if not os.access(directory, os.R_OK):#print(f"User {getpass.getuser()} does not have read access to directory {directory}")#return False# 更改目录的权限,使得所有用户都可以读取和写入os.chmod(directory, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)if not os.access(directory, os.W_OK):#print(f"User {getpass.getuser()} does not have write access to directory {directory}")#return False# 更改目录的权限,使得所有用户都可以读取和写入os.chmod(directory, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)return True# 备份
def backup_etcd(endpoints, backup_dir):# 检查备份目录的访问权限if not check_directory_access(backup_dir):return False# 生成备份文件的名称backup_file = f"{backup_dir}/etcd_backup_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}.db"# 执行备份操作backup_command = f"ETCDCTL_API=3 etcdctl --endpoints={endpoints} snapshot save {backup_file}"ret, stdout, stderr = run_command(backup_command)if ret != 0:print(f"Failed to backup etcd. Error: {stderr}")return Falseprint(f"Etcd backup completed successfully. Backup file is {backup_file}")return True# 备份恢复,etcd重构
def restore_etcd(backup_dir, restore_dir, name, initial_cluster, initial_advertise_peer_urls):# 检查备份目录和恢复目录的访问权限if not check_directory_access(backup_dir) or not check_directory_access(restore_dir):return False# 选择最新的备份文件backup_files = [f for f in os.listdir(backup_dir) if os.path.isfile(os.path.join(backup_dir, f))]backup_files.sort(reverse=True)if not backup_files:print("No backup files found")return Falsebackup_file = os.path.join(backup_dir, backup_files[0])# 执行恢复操作restore_command = f"ETCDCTL_API=3 etcdctl snapshot restore {backup_file} --name {name} --data-dir {restore_dir} --initial-cluster {initial_cluster} --initial-advertise-peer-urls {initial_advertise_peer_urls}"ret, stdout, stderr = run_command(restore_command)if ret != 0:print(f"Failed to restore etcd. Error: {stderr}")return Falseprint(f"Etcd restore completed successfully. Restored data is in {restore_dir}")return True# 数据压缩及碎片整理
def compact_and_defrag(endpoints):status_command = f"ETCDCTL_API=3 etcdctl --endpoints={endpoints} endpoint status --write-out=json"ret, stdout, stderr = run_command(status_command)if ret != 0:print(f"Failed to get etcd status. Error: {stderr}")returnstatus = json.loads(stdout)for s in status:revision = s['Status']['raftIndex']# 执行压缩操作compact_command = f"ETCDCTL_API=3 etcdctl --endpoints={endpoints} compact {revision}"ret, stdout, stderr = run_command(compact_command)if ret != 0:print(f"Failed to compact etcd. Error: {stderr}")return# 执行碎片整理操作defrag_command = f"ETCDCTL_API=3 etcdctl --endpoints={endpoints} defrag"ret, stdout, stderr = run_command(defrag_command)if ret != 0:print(f"Failed to defrag etcd. Error: {stderr}")returnprint("Etcd compact and defrag completed successfully")# etcd数据恢复,配置文件修改及启动
def etcd_start(timenow,restore_dir):etcdfiledata = """name: node1data-dir: %slisten-client-urls: 'http://192.168.73.10:2380'advertise-client-urls: 'http://192.168.73.10:2380'listen-peer-urls: 'http://192.168.73.10:2379'initial-advertise-peer-urls: 'http://192.168.73.10:2379'initial-cluster: node1=http://192.168.73.10:2379initial-cluster-token: etcd-cluster-1initial-cluster-state: new""" % restore_diretcdfile = "/data/etcd/nodefile%s.yml" % timenowff = open(etcdfile,"w")ff.writelines(etcdfiledata)ff.close()# 关闭etcdetcdKillCommand = "ps -ef |grep etcd|grep 'config-file'|grep -v grep|awk '{print $2}'|xargs kill -9"ret, stdout, stderr = run_command(etcdKillCommand)if ret != 0:print(f"Failed to start etcd. Error: {stderr}")# 启动etcdetcdStartCommand = "setsid nohup etcd --config-file=%s >> /data/etcd/etcd%s.log &" % (etcdfile,timenow)ret = subprocess.Popen(etcdStartCommand, shell=True)if not ret:print(f"Failed to start etcd. Error: {stderr}")def main():endpoints = "http://192.168.73.10:2379"  # 你的 etcd 节点的地址backup_dir = "/data/etcd/etcddatabak/"  # 你的备份目录timenow = datetime.datetime.now().strftime('%Y%m%d%H%M%S')restore_dir = "/data/etcd/etcddata%s" % timenow  # 你的恢复目录name = "node1"  # 你的 etcd 节点的名称initial_cluster = "node1=http://192.168.73.10:2379"  # 你的初始集群配置initial_advertise_peer_urls = "http://192.168.73.10:2379"  # 你的初始对等广播地址# # 先进行备份,然后再进行数据压缩,碎片整理# if backup_etcd(endpoints, backup_dir):#     compact_and_defrag(endpoints)# 数据备份backup_etcd(endpoints, backup_dir)# # 依据最新备份进行数据恢复# restore_etcd(backup_dir, restore_dir, name, initial_cluster, initial_advertise_peer_urls)# # 启动etcd# etcd_start(timenow, restore_dir)if __name__ == "__main__":main()

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

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

相关文章

cpp的套接字编程

服务端 #include<stdio.h> #include<unistd.h> #include<string.h> #include<netinet/in.h>//struct sockaddr_in 结构 #include<stdlib.h> #include<arpa/inet.h>//字节序转换接口文件 #include<sys/socket.h>//socket接口文件int…

yum配置文件及NFS共享

一 yum配置文件及命令 1 /etc/yum.conf //主配置文件 2 /etc/yum.repos.d/*.repo //yum仓库文件位置 写错一个字母就不行&#xff0c;可以ping www.google.com 测试网络 3 /var/log/yum.log //日志文件 二 yum命令 1 [rootlocalhost ~…

分布式锁的产生以及使用

日常开发中&#xff0c;针对一些需要锁定资源的操作&#xff0c;例如商城的订单超卖问题、订单重复提交问题等。 都是为了解决在资源有限的情况限制客户端的访问&#xff0c;对应的是限流。 单节点锁问题 目前针对这种锁资源的情况采取的往往是互斥锁&#xff0c;例如 java 里…

【LeetCode: 295. 数据流的中位数 + 堆】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

list列表可编辑状态

有时候list需要修改或选择属性,mfc自带的只能显示内容,基本上是不可以修改,为了实现这个功能需求,需要完成一下步骤转换. 第一步记录选择的单元格. 第二步创建一个编辑框CComboBox对象, 设置字体,窗口属性. 第三步获取选中单元格的位置信息. 第四步获取单元格内容信息. 第五步…

Leetcode3005. 最大频率元素计数

Every day a Leetcode 题目来源&#xff1a;3005. 最大频率元素计数 解法1&#xff1a;遍历 哈希 遍历数组 nums&#xff0c;统计各元素 num 的出现次数&#xff0c;存储在哈希表 cnt 中。 初始化 sum 0&#xff0c;max_freq 0。 遍历哈希表 cnt&#xff1a; 如果当前…

v34.运算符的优先级 和 结合性

1.优先级 优先级高的运算符会首先被评估。 2.结合性 当运算符的优先级相同时&#xff0c;结合性就会发挥作用。 3.优先级很重要 &#xff08;&#xff09;的优先级大于&#xff0c;所以操作数fun属于&#xff08;&#xff09; 而不是 &#xff0c;所以这个表达式看做是将函数…

【DevOps-09-1】Jenkins流水线任务初体验

一、简要描述 Jenkins流水线任务介绍Jenkins流水线任务初体验Jenkins流水线任务脚本语法初体验Jenkinsfile维护脚本二、Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程…

基于蒙特卡洛模拟的家用电动汽车充电负荷预测(MATLAB实现)

采用蒙特卡洛模拟法&#xff0c;对家用电动汽车充电负荷进行预测&#xff0c;电动汽车分为快、中、慢三种充电功率&#xff0c;且分为一天一充、一天两充、一天三充三种类型。全部MATLAB代码在下方给出&#xff0c;可以直接运行。 %%%%%%%%%%%%%%%%%%%%%%%%输入电动汽车相关原…

Spark读取kafka(流式和批数据)

spark读取kafka&#xff08;批数据处理&#xff09; # 按照偏移量读取kafka数据 from pyspark.sql import SparkSessionss SparkSession.builder.getOrCreate()# spark读取kafka options {# 写kafka配置信息# 指定kafka的连接的broker服务节点信息kafka.bootstrap.servers: n…

beego的模块篇 - config自定义文件配置

加载自定义配置到beego.AppConfig中可以配置&#xff1a;Beego框架 app.conf配置参数及环境配置-CSDN博客 1. 文件配置 目前支持解析的文件格式有 ini、json、xml、yaml 安装依赖库&#xff1a; go get github.com/beego/beego/v2/core/config 1.1 ini文件配置使用 配置文…

【机器学习300问】13、学习率曲线有什么作用?

在之前的文章中我为大家详细介绍了学习率的概念以及学习率设置过大或者过小分别有什么坏处。如果您还未看相关内容&#xff0c;下面是跳转链接哦&#xff1a; 【机器学习300问】10、学习率设置过大或过小对训练有何影响&#xff1f; 本篇文章中&#xff0c;为大家介绍一个工具—…

集美大学“第15届蓝桥杯大赛(软件类)“校内选拔赛 D矩阵选数

经典的状态压缩DP int dp[15][(1<<14)10]; int a[15][15]; void solve() {//dp[i][st]考虑到了第i行 并且当前考虑完第i行以后的选择状态是st的所有方案中的最大值for(int i1;i<13;i)for(int j1;j<13;j)cin>>a[i][j];for(int i1;i<13;i){for(int j0;j<…

宝塔 ftp 服务器发回了不可路由的地址/读取目录列表失败

ftp连接不上&#xff1a; 1.注意内网IP和外网IP 2.检查ftp服务是否启动 &#xff08;面板首页即可看到&#xff09; 3.检查防火墙20端口 ftp 21端口及被动端口39000 - 40000是否放行 &#xff08;如是腾讯云/阿里云等还需检查安全组&#xff09; 4.是否主动/被动模式都不能连接…

相比于 Jira,极狐GitLab 的敏捷项目管理是怎样的?

本文作者 极狐GitLab 资深解决方案架构师 尹学峰 简述 写在前面的话 如果你目前没有用任何专门的项目管理软件&#xff0c;只是在使用word、excel之类的通用软件进行项目管理&#xff0c;建议直接阅读本文详述章节&#xff0c;极狐GitLab的项目管理工具将为你带来巨大的效率提…

Linux安全问题,如何查看哪个用户是可疑用户?如何批量删除这些用户?

目 录 一、可疑用户是一个安全问题 二、查看Linux用户、新建的用户 &#xff08;一&#xff09;Linux里查看所有用户的命令 1、直接查看/etc/passwd文件 2、使用getent passwd命令查看 3、字段解释 4、用户信息解释 &#xff08;二&#xff09;只查看…

logstack 日志技术栈-04-opensource 开源工具 Syslog-ng+Highlight.io

5. Syslog-ng Syslog-ng 是一个开源的日志管理解决方案&#xff0c;主要用于收集和处理日志数据。它可以从多种源收集日志&#xff0c;包括系统日志、网络设备日志和第三方应用日志。 然后将日志解析、分类、重写和关联到统一格式中&#xff0c;然后将其存储或安全地传输到不同…

[ tool ] Xpath选择器和selenium工具基本使用

XPath xpath介绍 是一门在XML文档中查找信息的语言 html文档准备 doc <html><head><base hrefhttp://example.com/ /><title>Example website</title></head><body><div idimages><a hrefimage1.html aabb>Name: My…

JVM工作原理与实战(二十一):内存管理

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、不同语言的内存管理 1.C/C的内存管理 2.Java的内存管理 二、垃圾回收的对比 1.自动垃圾回收与手动垃圾回收的对比 2.优点与缺点 总结 前言 JVM作为Java程序的运行环境&#…

区字棋中的最长非0链

一&#xff0c;区字棋 也叫憋死牛棋。 规则&#xff1a; 棋盘一共只有5个点&#xff0c;双方各2个棋子&#xff0c;还有一个空格。 先手必须移动左边的棋子&#xff0c;之后没有限制&#xff0c;2个棋子任意一个移动到空格皆可。 无法移动者判负。 二&#xff0c;不败策略…