亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 編程設(shè)計 > 正文

大量小文件的實時同步的解決方案分析

2020-07-14 13:42:49
字體:
供稿:網(wǎng)友
傳統(tǒng)的文件同步方案有rsync(單向) 和 unison(雙向)等,它們需要掃描所有文件后進行比對,差量傳輸。如果文件數(shù)量達到了百萬甚至千萬量級,掃描所有文件將非常耗時。而且正在發(fā)生變化的往往是其中很少的一部分,這是非常低效的方式。

之前看了Amazon的Dynamo的設(shè)計文檔,它們每個節(jié)點的數(shù)據(jù)是通過Hash Tree來實現(xiàn)同步,既有通過日志來同步的軟實時特點(msyql, bdb等),也可以保證最終數(shù)據(jù)的一致性(rsync, unison等)。Hash Tree的大體思路是將所有數(shù)據(jù)存儲成樹狀結(jié)構(gòu),每個節(jié)點的Hash是其所有子節(jié)點的Hash的Hash,葉子節(jié)點的Hash是其內(nèi)容的Hash。這樣一旦某個節(jié)點發(fā)生變化,其Hash的變化會迅速傳播到根節(jié)點。需要同步的系統(tǒng)只需要不斷查詢跟節(jié)點的hash,一旦有變化,順著樹狀結(jié)構(gòu)就能夠在logN級別的時間找到發(fā)生變化的內(nèi)容,馬上同步。

文件系統(tǒng)天然的是樹狀結(jié)構(gòu),盡管不是平衡的數(shù)。如果文件的修改時間是可靠的,可以表征文件的變化,那就可以用它作為文件的Hash值。另一方面,文件的修改通常是按順序執(zhí)行的,后修改的文件比早修改的文件具有更大的修改時間,這樣就可以把一個目錄內(nèi)的最大修改時間作為它的修改時間,以實現(xiàn)Hash Tree。這樣,一旦某個文件被修改,修改時間的信息就會迅速傳播到根目錄。

一般的文件系統(tǒng)都不是這樣做的,目錄的修改時間表示的是目錄結(jié)構(gòu)最后發(fā)生變化的時間,不包括子目錄,否則會不堪重負(fù)。因為我們需要自己實現(xiàn)這個功能,利用Linux 2.6內(nèi)核的新特性inotify獲得某個目錄內(nèi)文件發(fā)生變化的信息,并把其修改時間傳播到它的上級目錄(以及再上級目錄)。Python 有 pyinotify,watch.py的代碼如下:

復(fù)制代碼
代碼如下:

#!/usr/bin/python
from pyinotify import *
import os, os.path
flags = IN_CLOSE_WRITE|IN_CREATE|IN_Q_OVERFLOW
dirs = {}
base = '/log/lighttpd/cache/images/icon/u241'
base = 'tmp'
class UpdateParentDir(ProcessEvent):
def process_IN_CLOSE_WRITE(self, event):
print 'modify', event.pathname
mtime = os.path.getmtime(event.pathname)
p = event.path
while p.startswith(base):
m = os.path.getmtime(p)
if m < mtime:
print 'update', p
os.utime(p, (mtime,mtime))
elif m > mtime:
mtime = m
p = os.path.dirname(p)
process_IN_MODIFY = process_IN_CLOSE_WRITE
def process_IN_Q_OVERFLOW(self, event):
print 'over flow'
max_queued_events.value *= 2
def process_default(self, event):
pass
wm = WatchManager()
notifier = Notifier(wm, UpdateParentDir())
dirs.update(wm.add_watch(base, flags, rec=True, auto_add=True))
notifier.loop()

在已經(jīng)有Hash Tree的時候,同步就比較簡單了,不停地獲取根目錄的修改時間并順著目錄結(jié)構(gòu)往下找即可。需要注意的是,在更新完文件后,需要設(shè)置修改時間為原文件的修改時間,目錄也是,保證Hash Tree的一致性,否則沒法同步。mirror.py的代碼如下 

復(fù)制代碼
代碼如下:

#!/usr/bin/python
import sys,time,re,urllib
import os,os.path
from os.path import exists, isdir, getmtime
src = sys.argv[1]
dst = sys.argv[2]
def local_mirror(src, dst):
if exists(dst) and mtime == getmtime(dst):
return
if not isdir(src):
print 'update:', dst
open(dst,'wb').write(open(src).read())
else:
if not exists(dst):
os.makedirs(dst)
for filename in os.listdir(src):
local_mirror(os.path.join(src,filename), os.path.join(dst,filename))
os.utime(dst, (mtime,mtime))
def get_info(path):
f = urllib.urlopen(path)
mtime = f.headers.get('Last-Modified')
if mtime:
mtime = time.mktime(time.strptime(mtime, '%a, %d %b %Y %H:%M:%S %Z'))
content = f.read()
f.close()
return int(mtime), content
p = re.compile(r'([/d.]+?) +([/w/]+)')
def remote_mirror(src, dst):
mtime, content = get_info(src)
if exists(dst) and mtime == int(getmtime(dst)):
return
print 'update:', dst, src
if not src.endswith('/'):
open(dst,'wb').write(content)
else:
if not exists(dst):
os.makedirs(dst)
for mt,filename in p.findall(content):
mt = int(float(mt))
lpath = dst+filename
if not exists(lpath) or int(getmtime(lpath)) != mt:
remote_mirror(src+filename, lpath)
os.utime(dst, (mtime,mtime))
if src.startswith('http://'):
mirror = remote_mirror
else:
mirror = local_mirror
while True:
mirror(src, dst)
time.sleep(1)
 
如果源文件不在同一臺機器上,可以通過NFS等共享過來?;蛘呖梢酝ㄟ^支持列目錄的HTTP服務(wù)器來訪問遠程目錄,mirror.py 已經(jīng)支持這種訪問方式。server.py 是用webpy做的一個簡單的只是列目錄的文件服務(wù)器。由于瓶頸在IO上,它的性能不是關(guān)鍵。server.py的代碼如下:

復(fù)制代碼
代碼如下:

#!/usr/bin/python
import os,os.path
import web
import time
root = 'tmp'
HTTP_HEADER_TIME = '%a, %d %b %Y %H:%M:%S %Z'
class FileServer:
def GET(self, path):
path = root + path
if not os.path.exists(path):
return 404
mtime = time.localtime(os.path.getmtime(path))
web.header('Last-Modified', time.strftime(HTTP_HEADER_TIME, mtime))
if os.path.isdir(path):
for file in os.listdir(path):
if file.startswith('.'): continue
p = os.path.join(path,file)
m = os.path.getmtime(p)
if os.path.isdir(p):
file += '/'
print m, file
else:
print open(path,'rb').read()
urls = (
"(/.*)", "FileServer",
)
if __name__ == '__main__':
web.run(urls, globals())

為了獲得更好性能,以達到更好的實時性,Hash Tree最好是平衡的,比如BTree。如果一個文件發(fā)生變化,同步它需要進行的IO操作為N*M,其中N為數(shù)的層數(shù),M為每層的文件數(shù)目?,F(xiàn)在我們N為2,M最大為10000,適當(dāng)減少它可以獲得更好的性能,比如N為4,M為100。在以后創(chuàng)建目錄結(jié)構(gòu)時,最好能夠考慮這方面的因素。

之前hongqn推薦過一個利用inotify的文件同步方案,同步方式類似于mysql和bdb等,由于過于復(fù)雜導(dǎo)致不可靠而沒有采用。上面這個方案只用了一百多行Python代碼就基本解決問題了,是不是很帥?:-)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
大片网站久久| 亚洲欧洲午夜一线一品| 欧美三级一级片| 久久亚洲精品毛片| 超碰超碰在线| 神马影院午夜我不卡影院| 伊人精品久久| 成人动漫在线观看视频| 国产精品蜜臀在线观看| 久久免费看毛片| 久久久久久久久国产精品| 欧美在线中文字幕| 亚洲精品久久久久久国产精华液| 国产在线日韩| 97涩在线观看视频| 韩国视频一区二区| 免费观看国产成人| 热久久精品国产| 国产清纯白嫩初高中在线观看性色| 一区二区欧美在线观看| 日韩欧美成人网| 中文在线字幕av| 久久亚洲精品小早川怜子| 久久久久国产一区二区三区四区| 欧美精品一区二区三区涩爱蜜| 国产一区二区免费视频| 米奇777四色精品人人爽| 亚洲国内精品| 99热.com| 国产精品77777| 久久久久久少妇| 欧美三级午夜理伦三级中视频| 午夜精品久久久久99热蜜桃导演| eeuss草民免费| 午夜性色一区二区三区免费视频| 一本—道久久a久久精品蜜桃| 亚洲色欲色欲www在线观看| 丰满人妻一区二区三区免费| 亚洲国产精品国自产拍av秋霞| 国产日韩欧美精品电影三级在线| 亚洲a视频在线观看| 538在线视频观看| 国产清纯白嫩初高生在线观看91| 国内不卡的二区三区中文字幕| 亚洲天堂av片| 国产精品对白久久久久粗| 毛片在线视频播放| 激情小视频在线| 中文字幕中文字幕| 久久97精品久久久久久久不卡| www.91av视频.com| 国产精品美女一区二区三区四区| 亚洲国产精品一区二区www在线| 日本 片 成人 在线| 久久精品亚洲天堂| 一区二区三区免费在线观看| 国产亚洲第一的欧洲日产| 91精品久久久久久综合乱菊| 成人h动漫精品一区二区下载| jizzjizzxxxx| 欧美亚洲精品日韩| 9色porny| 99re视频在线| 伊人久久免费视频| 中文字幕国产在线观看| 一区二区在线免费视频| 免费久久久一本精品久久区| 色综合久久一区二区三区| 亚洲欧美日韩三级| 亚洲精品久久7777777| 性欧美videos白嫩| 3d动漫精品啪啪1区2区免费| 亚洲成人av免费看| 免费久久一级欧美特大黄| 欧美18免费视频| 欧美freesex黑人又粗又大| 社区色欧美激情 | 亚洲国产日韩综合一区| 免费在线看大片无需流量| 国产精品视频xxxx| 免费全黄无遮挡裸体毛片| 国产精品一区二区果冻传媒| 在线视频福利| 中国麻豆视频| 国产精品国产一区二区| 日本xxxxxxx免费视频| 欧美大片在线观看一区| 最新热久久免费视频| 六月婷婷在线视频| 国产精品久久久久久久久久久久久久久久久| 男女人搞j网站| 一区二区三区视频在线观看免费| 四虎国产精品成人永久免费影视| 国产女人精品视频| 无码粉嫩虎白一线天在线观看| 久久成人激情视频| 日韩精品亚洲视频| 中文字幕12页| 日韩欧美视频第二区| 中文字幕av资源一区| 国产一二三区精品视频| 亚洲色图一二三区| 91精品视频大全| 在线成人激情黄色| 一区二区三区亚洲变态调教大结局| 亚洲欧洲一区二区三区在线观看| 少妇久久久久久久| 丁香六月综合激情| 黄色工厂这里只有精品| 日本精品福利视频| 国产高清一区在线观看| 女人扒开腿免费视频app| 91av在线播放| 精品国产一二三| 免费看一级毛片| 色视频网站在线观看| 激情都市亚洲| 色噜噜国产精品视频一区二区| 国产调教一区二区三区| 亚洲欧美日韩另类精品一区二区三区| 精品欧美一区二区精品久久| 久久夜色精品亚洲| 国产精品人人爽| 国产精品高清一区二区| 又粗又大的机巴好爽欧美| 成人午夜国产| 国产一区二区三区日韩精品| 女人高潮特级毛片| 国产精品免费在线| 丁香六月久久综合狠狠色| 亚洲国产三级| jizz中国少妇| 成人片黄网站色大片免费毛片| 97视频在线观看播放| 37pao成人国产永久免费视频| 香蕉国产在线视频| 日韩久久中文字幕| 成人福利在线视频| 人妻少妇精品无码专区久久| 图片区小说区区亚洲五月| 欧美色爱综合网| 久久亚洲精品网站| 精品人妻一区二区三区浪潮在线| 欧美1区2区3区4区| 丰满放荡岳乱妇91ww| 东北一级毛片| 最近中文字幕在线免费观看| 国产一区二区三区视频免费观看| 国产激情无码一区二区三区| av无码精品一区二区三区宅噜噜| 欧美大片在线观看一区二区| 久久综合免费视频| 一区二区三区回区在观看免费视频| 国产呦精品一区二区三区网站| 欧美日韩激情一区二区三区| 免费a级在线播放| 999精品视频在这里| 这里都是精品| 午夜精品久久久久99蜜桃最新版| 欧美成人三级在线| 亚洲第一色网站| 99re成人精品视频| 91精品国产91久久久| 日本黄色免费视频| 四虎影院中文字幕| 暗呦丨小u女国产精品| 韩国美女主播一区| 2025国产精品视频| jizz中国少妇| 国产人妻精品午夜福利免费| 97久久天天综合色天天综合色hd| 国产麻豆剧果冻传媒视频杜鹃| 91产国在线观看动作片喷水| 男人天堂新网址| 久久久久久久久久久人体| 国产一区二区三区精品久久久| 99蜜桃在线观看免费视频网站| 国产精品∨欧美精品v日韩精品| 亚洲天堂av资源在线观看| 成人毛片免费看| 欧美电影免费观看高清完整| 日本久久久精品视频| 亚洲国产高清一区二区三区| 欧美国产欧美亚州国产日韩mv天天看完整| 久操网在线观看| 国产不卡视频在线| 欧美激情一区二区在线| 亚洲欧美在线免费| 久久综合88中文色鬼| 欧洲美女网站| 最近免费观看高清韩国日本大全| 艳妇乳肉豪妇荡乳av无码福利| 偷偷操不一样的久久| 精品少妇一区二区三区视频免付费| 三区精品视频观看| 精品视频在线免费看| 国产亚洲自拍一区| 男女性高潮免费网站| 欧美日韩免费观看一区三区| bl视频在线免费观看| 国产又黄又粗视频| 日韩精品一区二区三区国语自制| 欧美精品a∨在线观看不卡| 久久av一区二区三区漫画| 国产成人无码精品久久久性色| 日本一区二区三区中文字幕| 手机福利小视频在线播放| 夜夜操夜夜骑| china中国猛gary| 亚洲乱码日产精品bd在线观看| 日韩黄色成人| 99久久精品国产一区二区成人| 亚洲av午夜精品一区二区三区| 中文字幕 人妻熟女| 天天操天天干天天| 精品中文字幕一区二区| 天天摸夜夜添狠狠添婷婷| 国产一区二区主播在线| 一卡二卡欧美日韩| 日本一区二区免费电影| 91在线网址| 欧洲永久精品大片ww免费漫画| 亚洲精品午夜精品| 亚洲天堂1区| 国产亚洲一区二区精品| a级片在线观看视频| 伊人网在线免费观看| 不卡视频在线观看| 日韩av中文字幕在线| 日本女优一区| 色综合久久综合网97色综合| 可以直接看的av网址站| 国产精品69久久| 色视频www在线播放国产成人| 日韩国产高清污视频在线观看| 欧美国产视频一区| 日韩电影在线观看一区| 久久久免费高清电视剧观看| 国精产品一区一区三区四川| 国产你懂的在线观看| 国产精品久久久久久久久久白浆| 在线永久免费观看黄网站| 午夜久久一区| 福利av在线| 欧美三级韩国三级日本三斤在线观看| 国产一区视频免费观看| 中国黄色a级片| 亚洲男人天堂一区| 亚洲视屏在线播放| 成人亚洲精品久久久久软件| 国产成人啪精品午夜在线观看| 91免费视频网| 国产又黄又粗又猛又爽的| 丰满的护士2在线观看高清| 欧美精品欧美精品| 成人在线一区二区三区| a级免费视频| 天堂网在线观看国产精品| 欧美日韩三级在线| ckplayer中文字幕| 免费影视观看网站入口| 一本色道a无线码一区v| 北条麻妃国产九九九精品小说| 久久99久久99精品蜜柚传媒| 清纯粉嫩极品夜夜嗨av| 亚洲精品高清在线| 美女久久99| 玖玖爱在线观看| 99re66热这里只有精品3直播| 午夜精品蜜臀一区二区三区免费| www在线观看黄色| 猫咪成人官网| 国产女人在线视频| 高清不卡一区二区| 亚洲午夜久久久影院伊人| 拍拍拍在线观看视频免费| 超碰在线免费观看97| 美女91在线看| 亚洲精品成人精品456| 三级黄在线观看| 2023国产精品久久久精品双| 久久福利网址导航| 欧美国产日韩一区二区三区| 国产999精品在线观看| 国产美女高潮一区二区三区| 欧美精品自拍| 亚洲一区精品视频| 在线精品视频小说1| 嫩草视频免费在线观看| 久久久精品视频在线观看| 国产一区二区三区四区hd| 久久香蕉频线观| 日韩亚洲欧美成人一区| 青青草原成人网| 国产熟人av一二三区| 国产一区二区精品| 国产午夜激情视频| 都市激情久久久久久久久久久| av免费在线免费观看| 国产树林野战在线播放| 一区二区三区在线看| 一本大道av一区二区在线播放| 99国内精品| 成 年 人 黄 色 大 片大 全| 欧美精品手机在线| 免费观看日韩av| 欧美国产综合色视频| 国产 日韩 欧美| 亚洲国产精品久久久久久6q| 国产精品久久久久久久久免费| 九九热只有这里有精品| 九九九九九九精品任你躁| 日韩视频免费观看高清完整版| 欧美日韩亚洲在线观看| 米奇精品一区二区三区在线观看| 26uuu精品一区二区| 精品午夜一区二区三区在线观看| 在线播放你懂的| 国产一区香蕉久久| 亚洲国产精品久久久久久女王| 视频一区欧美日韩| 熟女俱乐部一区二区视频在线| ,一级淫片a看免费| 国产精品666| 丰满少妇被猛烈进入| 一本色道久久加勒比88综合| 7777精品伊久久久大香线蕉语言| 四虎一区二区|