Etcd远程备份

配置文件

{
    "backup_base_dir":"/etcdBackupData",
    "compress": true,
    "etcd_zone":[
        {
            "zone_name": "SZD",
            "cluster_ips": "10.25.65.31,10.25.65.32,10.25.65.33",
            "ca_name":"/etc/etcd/ssl/SZD/ca.pem",
            "cert_name":"/etc/etcd/ssl/SZD/etcd.pem",
            "key_name":"/etc/etcd/ssl/SZD/etcd-key.pem",
            "max_backup_num":30
        },
        {
            "zone_name": "SHB",
            "cluster_ips": "172.25.0.1",
            "ca_name":"/etc/etcd/ssl/SHB/ca.pem",
            "cert_name":"/etc/etcd/ssl/SHB/etcd.pem",
            "key_name":"/etc/etcd/ssl/SHB/etcd-key.pem",
            "max_backup_num":30
        }
    ]
} 

备份脚本

#!/usr/bin/python
import json
import os
import time
import glob

def backupEtcd(backupBaseDir, etcdZone, needCompress):
    # parset etcdZone
    zoneName = etcdZone['zone_name']
    clusterIps = etcdZone['cluster_ips']
    ca = etcdZone['ca_name']
    cert = etcdZone['cert_name']
    key = etcdZone['key_name']
    maxBackupNum = etcdZone['max_backup_num']

    endpoints = ""
    clusterIpList = clusterIps.split(',')
    ipNum = len(clusterIpList)
    if ipNum == 1:
        endpoints = "https://" + clusterIps + ":2379"
    else:
        clusterIpList = clusterIps.split(',')
        for index, ip in enumerate(clusterIpList):
            if index == ipNum - 1:
                endpoints += "https://" + ip + ":2379"
            else:
                endpoints += "https://" + ip + ":2379" + ","
    # start backup
    callEtcdctl(backupBaseDir, zoneName, endpoints, ca, cert, key, needCompress, maxBackupNum)


def callEtcdctl(backupBaseDir, zoneName, endpoints, ca, cert, key, needCompress, maxBackupNum):
    print("Call Etcdctl Command To Backup Etcd Data...")
    timeNow = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
    backupDir= backupBaseDir + '/' + zoneName + '/'
    backupFileName = backupDir + timeNow + '-' + zoneName.lower()  + '-snapshot.db'
    command = "export ETCDCTL_API=3;/usr/local/bin/etcdctl " + ' --cacert=' + ca + ' --cert=' + cert + ' --key=' + key + \
    ' --endpoints=' + '"' + endpoints + '"'\
    ' snapshot save ' + backupFileName

    print("backup command:", command)
    if not os.path.exists(backupDir):
        os.makedirs(backupDir)
    os.system(command)

    if needCompress:
        compressBackupFile(backupFileName, maxBackupNum)

    sortFiles = getSortedByMTime(backupBaseDir+zoneName)
    curFileNum = len(sortFiles)
    while curFileNum > maxBackupNum:
        print("delete file:", sortFiles[curFileNum-1])
        os.remove(sortFiles[curFileNum-1])
        curFileNum = curFileNum - 1 


def compressBackupFile(fileName, maxBackupNum):
    compressCMD="tar -cvzf " + fileName + ".tar.gz " + fileName
    print("compress cmd:", compressCMD)
    os.system(commandCMD)
    os.remove(fileName)

def getSortedByMTime(path, reverse=True):
    # TODO dir should not return
    return sorted(glob.glob(os.path.join(path, '*')), key=lambda x: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.path.getmtime(x))), reverse=reverse)

def main():
    with open("config.json",'r') as f:
        config = json.loads(f.read())
        backupBaseDir = config['backup_base_dir']
        needCompress = config['compress']

        etcdZoneArr = config['etcd_zone']
        # parse etcdZoneArr
        for etcdZone in etcdZoneArr:
            backupEtcd(backupBaseDir, etcdZone, needCompress)

if __name__ == "__main__":
    main()
# export ETCDCTL_API=3;etcdctl --cacert= --cert= --key= --endpoints="" snapshot save .db > /etcdBackupData/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值