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

2024-01-17 15:36

本文主要是介绍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()

这篇关于etcd数据备份数据恢复数据压缩碎片整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/616485

相关文章

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

Python自动化批量重命名与整理文件系统

《Python自动化批量重命名与整理文件系统》这篇文章主要为大家详细介绍了如何使用Python实现一个强大的文件批量重命名与整理工具,帮助开发者自动化这一繁琐过程,有需要的小伙伴可以了解下... 目录简介环境准备项目功能概述代码详细解析1. 导入必要的库2. 配置参数设置3. 创建日志系统4. 安全文件名处

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注