Wrysmile 发表于 2020-12-25 21:22

python文件自动同步备份v1【运维必备】

先说需求:平台会把虚拟机备份的文件打包到服务器A,再同步备份到服务器B(只需要考虑A到B)。


思路:
服务器A作为服务端,定时遍历自己的文件目录,把文件目录信息打包成一个校验文件。
服务器B作为客户端,下载校验文件,遍历自己的文件目录是否和服务器相同,并下载本地没有的文件。
通过http传输,使用python开启一个简单的http服务。


测试环境:
win10→CentOS7, python3.7。


首先开启Http服务:
在win10上找到需要备份的文件夹,在空白处shift+鼠标右键,点击在此处打开powershell窗口。
然后输入:
python -m http.server 8000



开启后访问http://本机Ip:8000即可

服务端代码如下:
import os

path = r'C:\Users\001\Desktop\backup'
def content(path):
    list = []
    dir = []
    x = os.walk(path, topdown=True)
    for (root, dirs, files) in x:
      dir.append(root.replace(r'C:\Users\001\Desktop\backup', ''))
      for j in files:
            list.append(root.replace(r'C:\Users\001\Desktop\backup', '') + '\\' + j)
    return

x = content(path)

with open(path+'\\'+'init.txt', 'w', encoding='utf-8') as f:
    for i in x:
      f.write(i)
      f.write('\n')

with open(path+'\\'+'dir.txt', 'w', encoding='utf-8') as f:
    for i in x:
      f.write(i)
      f.write('\n')


客户端代码如下:import os
import requests
import shutil
import time
from tqdm import tqdm

start_time = time.perf_counter()

def init():
    # 下载服务端目录,文件信息
    url = ['http://192.168.1.13:8000/init.txt', 'http://192.168.1.13:8000/dir.txt']

    download_init = requests.get(url, stream=True)
    with open('/download/init.txt', 'wb') as f:
      for chunk in download_init.iter_content(chunk_size=1024):
            f.write(chunk)

    download_dir = requests.get(url, stream=True)
    with open('/download/dir.txt', 'wb') as f:
      for chunk in tqdm(download_dir.iter_content(chunk_size=1024)):
            f.write(chunk)

init()

path = '/download/backup'

def content(path):
    list = []
    dir = []
    x = os.walk(path, topdown=True)
    for (root, dirs, files) in x:
      dir.append(root)
      for j in files:
            list.append(root+ '/' + j)
    return


def check_dir():
    # 获取本地目录
    x = content(path)
    dir_so = x

    # 清洗服务端目录
    dirs = open('/download/dir.txt', 'r', encoding='utf-8')
    dir_dst = dirs.readlines()
    dir_dst_info = []
    for i in dir_dst:
      i = i.replace('\n', '')
      i = i.replace('\\', '/')
      i = '/download/backup' + i # 修改路径不然会报错
      dir_dst_info.append(i)


    # 比较目录,目录不一致就添加
    for i in dir_dst_info+dir_so:
      if i not in dir_so:
            os.mkdir(i)
            print('创建了' + i)
      if i not in dir_dst_info:
            try:
                shutil.rmtree(i)
                print('删除了' + i)
            except:
                pass


check_dir()

def check_file():
    # 获取本地文件
    x = content(path)
    file_so = x

    # 清洗服务端文件
    files = open('/download/init.txt', 'r', encoding='utf-8')
    files_dst = files.readlines()
    files_dst_info = []
    for i in files_dst:
      i = i.replace('\n', '')
      i = i.replace('\\', '/')
      files_dst_info.append('/download/backup' + i)

    # 没有的下载,多余的删掉
    for i in file_so + files_dst_info:
      if i not in file_so:
            url = 'http://192.168.1.13:8000' + i.replace('/download/backup', '')
            download_file = requests.get(url, stream=True)
            with open(i, 'wb') as f :
                for chunk in download_file.iter_content(chunk_size=10240) :
                  f.write(chunk)
                  print('添加了' + i)
      if i not in files_dst_info:
            os.remove(i)
            print('删除了' + i)

check_file()

end_time =time.perf_counter()

cost = end_time - start_time
print(cost,':s')


代码还在优化,目前的功能有:
1、可以添加定时任务,做到同步更新。
2、支持同步删除。
待开发的功能:
1、多线程/多进程下载。
还没有投入到生产环境中正式测试,测试图片先欠着,代码调优完了再来改。

如果有更好的建议欢迎各位指教。

a5860660 发表于 2020-12-25 21:22

多谢楼主分享

fyk6853544 发表于 2020-12-25 21:49

6666

zwecaw 发表于 2020-12-25 23:22


感谢分享,谢谢提供分享

linxi123456 发表于 2020-12-25 23:24


感谢楼主的分享

andyj2018 发表于 2020-12-26 07:34

谢谢分享!

1028933048 发表于 2020-12-26 08:36

多谢分享多谢分享
页: [1]
查看完整版本: python文件自动同步备份v1【运维必备】