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

这篇具有很好参考价值的文章主要介绍了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 为10G

etcd启动示例:
/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 False

    print(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 False

    backup_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 False

    print(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}")
        return

    status = 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}")
            return

    print("Etcd compact and defrag completed successfully")


# etcd数据恢复,配置文件修改及启动
def etcd_start(timenow,restore_dir):
    etcdfiledata = """
    name: node1
    data-dir: %s
    listen-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:2379
    initial-cluster-token: etcd-cluster-1
    initial-cluster-state: new
    """ % restore_dir

    etcdfile = "/data/etcd/nodefile%s.yml" % timenow
    ff = open(etcdfile,"w")
    ff.writelines(etcdfiledata)
    ff.close()

    # 关闭etcd
    etcdKillCommand = "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}")

    # 启动etcd
    etcdStartCommand = "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()

文章来源地址https://www.toymoban.com/news/detail-797837.html

到了这里,关于etcd数据备份数据恢复数据压缩碎片整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据备份与恢复

    按照 数据库服务状态 分为: 冷备份:在备份时暂停数据库运行和服务,将整个数据库复制到备份设备中 热备份:在备份时不停止数据库的运行和服务 按照 备份的数据 分为: 物理备份:备份数据库服务器上存储的原始数据和文件,可以直接拷贝和恢复 逻辑备份:备份的是

    2024年01月20日
    浏览(40)
  • MySQL数据备份与恢复

    备份的主要目的: 备份的主要目的是:灾难恢复,备份还可以测试应用、回滚数据修改、查询历史数据、审计等。 日志: MySQL 的日志默认保存位置为: ##配置文件 ##通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的 ##二进制日志(binlog),用来记录所有更新了数据

    2024年02月11日
    浏览(47)
  • ES数据备份与恢复

    场景:ES线上的数据和服务迁移到另外的机器上去 老ES机器ip:172.16.0.1 新ES机器ip:172.16.0.2 一. 首先, 在备份之前要在es/config/elasticsearch.yml添加仓库配置: path.repo: [\\\"/mnt/backup/es_backup\\\"] 1. 2.重启ES 二. 在老机器上 3.创建备份仓库 在/mnt/backup下新建名为es_backup的仓库 POST /_snapsho

    2024年02月16日
    浏览(39)
  • ElasticSearch 数据备份与恢复

    以下为背景 Elasticsearch 7.6.2单点,8.3.3单点 Docker 部署 当前使用场景:部分index,数据量较大,需要在跨版本的ES之间进行迁移 一、前提说明 1. Elasticsearch备份 2. 备份恢复方案 二、Elasticsearch 环境准备 1.查看Elasticsearch所有版本 2.部署2个Elasticsearch单点服务 三、数据备份 1. 增加

    2024年02月10日
    浏览(40)
  • MySQL 数据备份与恢复

    本次使用的MySQL版本为8.0.20 目录 一、数据备份 1.使用 MySQLdump 命令备份 (1)使用MySQLdump备份单个数据库中的所有表 案例:完成数据插入后,输入备份命令如下: (2)使用MySQLdump备份数据库中的某个表 案例:备份booksDB数据库中的books表,输入语句如下: (3)使用MySQLdump备

    2024年02月11日
    浏览(43)
  • 如何备份与恢复MySQL数据库数据

    目录 一、MySQL备份 备份方式 完全备份 差异备份 增量备份 二、常见的备份方法 物理冷备 专用备份工具 mysqldump 或 mysqlhotcopy 启用二进制日志进行增量备份 第三方工具备份 三、MySQL完全备份 四、数据库完全备份分类 物理冷备份与恢复 mysqldump备份与恢复 五、物理冷备份与恢复

    2024年02月16日
    浏览(73)
  • 9-MySQL数据库 数据的备份与恢复

    1.date文件的备份 2.mysqldump 备份 说明: mysqldump是MySQL数据库中的一个实用程序,它主要用于转储(备份)数据库。mysqldump通过生成一个SQL脚本文件,包含从头开始重新创建数据库所必需的(如 CREATE TABLE和INSERT等),来实现数据库的备份和转储。这样,你可以在任何时候通过运

    2024年02月08日
    浏览(71)
  • 06.Oracle数据备份与恢复

    01.CentOS7静默安装oracle11g 02.Oracle的启动过程 03.从简单的sql开始 04.Oracle的体系架构 05.Oracle数据库对象 06.Oracle数据备份与恢复 07.用户和权限管理 08.Oracle的表 09.Oracle表的分区 10.Oracle的同义词与序列 11.Oracle的视图 12.Oracle的索引 13.Oracle通过JDBC连接Java 14.Oracle中的事务 15.Oracle11g的

    2024年02月05日
    浏览(44)
  • Elasticsearch 的数据备份和恢复

    1.1 Elasticsearch 数据备份 数据备份是一项重要的任务,用于保护数据免受意外数据丢失、硬件故障等不可预测的事件。 Elasticsearch 提供了一些机制来备份和恢复数据,以确保数据的可靠性和持久性。 1.2 Elasticsearch 数据恢复 数据恢复是指从备份中恢复数据并将其重新加载到 El

    2024年02月08日
    浏览(40)
  • Vault数据备份恢复-MySQL

    Vault提供了可靠的功能来保护数据库和其他关键数据。 对于MySQL数据库,Vault提供了一个易于使用的解决方案,可以自动创建和管理定期备份,并支持从备份中快速恢复数据。本文将介绍Vault后端存储MySQL的备份恢复,包括如何设置Vault、如何进行数据备份和还原、如何保护备份

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包