python文件实时同步_python文件自动同步备份v1.2【运维必备】2020/12/31
本帖最后由 We. 于 2021-1-4 08:18 編輯
v1版本打包在這里了,感興趣的自己下來(lái)看:
同步備份v1.rar
(1.6 KB, 下載次數(shù): 8)
2020-12-30 16:12 上傳
點(diǎn)擊文件名下載附件
下載積分: 吾愛(ài)幣 -1 CB
聲明:
感謝@的提醒,本方案只適用于局域網(wǎng)內(nèi)同步備份,沒(méi)有做加密/認(rèn)證,沒(méi)有過(guò)防火墻。
以下是v1.2內(nèi)容:
新增加了多進(jìn)程下載
修改下目錄就可以直接拿去用了
--------------------------------------------------------------------------------------------------------------------------
需求:平臺(tái)會(huì)把虛擬機(jī)備份的文件打包到服務(wù)器A,再同步備份到服務(wù)器B(只需要考慮A到B)。
思路:
服務(wù)器A作為服務(wù)端,定時(shí)遍歷自己的文件目錄,把文件目錄信息打包成一個(gè)校驗(yàn)文件。
服務(wù)器B作為客戶端,下載校驗(yàn)文件,遍歷自己的文件目錄是否和服務(wù)器相同,并下載本地沒(méi)有的文件。
通過(guò)http傳輸,使用python開(kāi)啟一個(gè)簡(jiǎn)單的http服務(wù)。有防火墻需要把端口放通,沒(méi)有就不管。
生產(chǎn)環(huán)境:python3.7.9,兩臺(tái)CentOS7.9服務(wù)器。
在服務(wù)端的備份目錄下開(kāi)啟http服務(wù):
nohup是用來(lái)后臺(tái)開(kāi)啟http服務(wù)的,不然控制臺(tái)沒(méi)法干其他事情。
image.png (23.68 KB, 下載次數(shù): 0)
2020-12-30 16:16 上傳
服務(wù)端:
[Python] 純文本查看 復(fù)制代碼import os
path = '/H3C_Backup'
def func(path):
contents = os.walk(path, topdown=True)
dir = []
file = []
for (root, dirs, files) in contents:
dir.append(root)
for i in files:
file.append(root+'/'+i)
return [dir, file]
content = func(path)
with open(path+'/'+'content.txt', 'w', encoding='utf-8') as f:
for i in content[0]:
f.write(i)
f.write('\n')
with open(path+'/'+'file.txt', 'w', encoding='utf-8') as f:
for i in content[1]:
f.write(i)
f.write('\n')
客戶端:
[Python] 純文本查看 復(fù)制代碼import os
import time
import shutil
import multiprocess
import requests
def init() :
url = ['http://172.172.172.1:8000/file.txt', 'http://172.172.172.1:8000/content.txt']
download_file = requests.get(url[0], stream=True)
with open('/download/file.txt', 'wb') as f :
for chunk in download_file.iter_content(chunk_size=4096) :
f.write(chunk)
download_content = requests.get(url[1], stream=True)
with open('/download/content.txt', 'wb') as f :
for chunk in download_content.iter_content(chunk_size=4096) :
f.write(chunk)
def function(path) :
# 通過(guò)os.walk()方法遍歷到所有文件夾和文件
file = []
dir = []
x = os.walk(path, topdown=True)
for (root, dirs, files) in x :
dir.append(root)
for i in files :
file.append(root + '/' + i)
return [dir, file]
def check_dir(path) :
# 獲取本地目錄
x = function(path)
dir_so = x[0]
# 清洗服務(wù)端目錄
dirs = open('/download/content.txt', 'r', encoding='utf-8')
dir_dst = dirs.readlines()
dir_dst_info = []
for i in dir_dst :
i = i.replace('\n', '')
print(i)
dir_dst_info.append(i)
# 比較目錄,目錄不一致就添加
for i in dir_dst_info[1 :] + dir_so :
if i not in dir_so :
os.mkdir(i)
print('創(chuàng)建了' + i)
if i not in dir_dst_info :
try :
shutil.rmtree(i)
print('刪除了' + i)
except :
pass
def download(url, path) :
download_file = requests.get(url, stream=True)
with open(path, 'wb') as f :
for chunk in download_file.iter_content(chunk_size=10240) :
f.write(chunk)
print('添加了' + path)
def check_file(path) :
x = function(path)
file_so = x[1]
pool = multiprocessing.Pool(processes=10)
# 清洗服務(wù)端文件
files = open('/download/file.txt', 'r', encoding='utf-8')
files_dst = files.readlines()
files_dst_info = []
for i in files_dst :
i = i.replace('\n', '')
files_dst_info.append(i)
# 沒(méi)有的下載,多余的刪掉
for i in file_so + files_dst_info :
if i not in file_so :
url = 'http://172.172.172.1:8000' + i
pool.apply_async(download, (url, i,))
if i not in files_dst_info :
os.remove(i)
print('刪除了' + i)
pool.close()
pool.join()
if __name__ == '__main__' :
path = '/H3C_Backup'
init()
check_dir(path)
check_file(path)
10個(gè)進(jìn)程起飛,一共12T數(shù)據(jù)慢慢跑。
image.png (116.95 KB, 下載次數(shù): 0)
2020-12-30 18:02 上傳
12個(gè)進(jìn)程一起跑這cpu占用率有點(diǎn)高啊。
image.png (47.66 KB, 下載次數(shù): 0)
2020-12-30 18:32 上傳
速度也不算慢,一小會(huì)兒80個(gè)G了。
image.png (78.08 KB, 下載次數(shù): 0)
2020-12-30 18:34 上傳
今早起來(lái)一看,傳了10個(gè)T了,還在運(yùn)行,等他慢慢弄完把。
image.png (29.79 KB, 下載次數(shù): 0)
2020-12-31 08:55 上傳
待優(yōu)化:
1、寫(xiě)法待優(yōu)化
2、觸發(fā)方式待優(yōu)化
3、用socket的tcp會(huì)不會(huì)比http更快?
另外,為什么多線程這么拉跨比單線程還慢?總感覺(jué)多進(jìn)程有點(diǎn)浪費(fèi)cpu資源。迅雷的下載方式又是如何實(shí)現(xiàn)的?
歡迎指教。
總結(jié)
以上是生活随笔為你收集整理的python文件实时同步_python文件自动同步备份v1.2【运维必备】2020/12/31的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ida导入jni头文件_IDA导入Jni
- 下一篇: django 后台日期_Django中的