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

首頁 > 學院 > 編程設計 > 正文

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

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

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

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

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

復制代碼
代碼如下:

#!/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()

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

復制代碼
代碼如下:

#!/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服務器來訪問遠程目錄,mirror.py 已經支持這種訪問方式。server.py 是用webpy做的一個簡單的只是列目錄的文件服務器。由于瓶頸在IO上,它的性能不是關鍵。server.py的代碼如下:

復制代碼
代碼如下:

#!/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。如果一個文件發生變化,同步它需要進行的IO操作為N*M,其中N為數的層數,M為每層的文件數目。現在我們N為2,M最大為10000,適當減少它可以獲得更好的性能,比如N為4,M為100。在以后創建目錄結構時,最好能夠考慮這方面的因素。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品福利在线| 91精品视频一区| 亚洲男人天堂网站| 久久免费国产精品1| 午夜欧美大片免费观看| 国产精品91在线| 国产日韩欧美自拍| 久久久久久久久久久av| 亚洲欧美激情视频| 91九色国产视频| 成人女保姆的销魂服务| 日韩视频免费在线观看| 精品国内产的精品视频在线观看| 97视频免费在线观看| 免费不卡在线观看av| 亚洲视频网站在线观看| y97精品国产97久久久久久| 成人欧美一区二区三区黑人| 国产欧美va欧美va香蕉在| 精品一区电影国产| 欧美黑人xxxⅹ高潮交| 在线精品国产欧美| 浅井舞香一区二区| 美女视频久久黄| 精品小视频在线| 欧美老妇交乱视频| 精品国模在线视频| 亚洲精品av在线播放| 中文字幕亚洲无线码a| 欧美性受xxxx白人性爽| 97在线视频免费看| 亚洲人成在线观看| 亚洲aa在线观看| 日韩精品在线免费观看| 在线观看国产成人av片| 在线播放精品一区二区三区| 久久亚洲精品成人| 中文字幕日韩精品在线| 久久亚洲精品中文字幕冲田杏梨| 亚洲成人a**站| 亚洲天堂av网| 亚洲欧美另类国产| 国产97在线播放| 热99精品只有里视频精品| 日韩在线视频免费观看高清中文| 久久久久99精品久久久久| 亚洲欧美激情四射在线日| 欧美巨大黑人极品精男| 亚洲视频一区二区三区| 国产精品中文久久久久久久| 亚洲午夜激情免费视频| 久久99视频免费| 欧美疯狂xxxx大交乱88av| 亚洲欧美精品suv| 久久免费精品视频| 懂色av中文一区二区三区天美| 中文字幕欧美精品日韩中文字幕| 精品久久久久久亚洲精品| 国产精品日韩欧美大师| 欧美日韩中文字幕日韩欧美| 亚洲jizzjizz日本少妇| 中文字幕日韩专区| 日韩国产中文字幕| 亚洲成人精品久久久| 亚洲天堂av在线免费| 亚洲成人黄色在线观看| 96国产粉嫩美女| 黄色一区二区三区| 亚洲成色999久久网站| 亚洲欧美国产视频| 亚洲人午夜精品| 日韩av日韩在线观看| 欧美在线www| 久久久久久国产精品三级玉女聊斋| 久久精品国产免费观看| 欧美性猛xxx| 国产精品99久久久久久久久久久久| 狠狠综合久久av一区二区小说| 国产精品视频不卡| 中文字幕久精品免费视频| 国产69精品久久久久99| 亚洲黄色www网站| 久久亚洲影音av资源网| 亚洲电影免费在线观看| 久久免费国产精品1| 国产亚洲欧美视频| 久久影视电视剧免费网站清宫辞电视| 成人做爰www免费看视频网站| 欧美性高潮在线| 日韩欧美在线观看| 国产一区二区精品丝袜| 狠狠躁夜夜躁人人躁婷婷91| 亚洲精品91美女久久久久久久| 中国日韩欧美久久久久久久久| 亚洲一区亚洲二区| 久久亚洲一区二区三区四区五区高| 国产视频亚洲视频| 欧美另类老女人| 最近2019年好看中文字幕视频| 日本精品性网站在线观看| 国产精品日韩欧美| 色噜噜狠狠狠综合曰曰曰| 中文字幕免费精品一区高清| 高清一区二区三区日本久| 精品中文字幕久久久久久| 国产精品三级美女白浆呻吟| 久久久久久噜噜噜久久久精品| 亚洲高清一区二| 日韩精品小视频| 5566日本婷婷色中文字幕97| 亚洲人成77777在线观看网| 日韩精品视频在线观看免费| 久久久黄色av| 欧美激情亚洲自拍| 久久久久久久一区二区| 欧美激情免费视频| 欧美日韩在线免费| 国产精品18久久久久久麻辣| 久久成人人人人精品欧| 国模精品视频一区二区| 日韩视频中文字幕| 91亚洲精品视频| 国产精品吊钟奶在线| 欧美日韩性生活视频| 国产精品久久久久久久久久99| 欧美黄色成人网| 成人疯狂猛交xxx| 日韩中文第一页| 欧美二区在线播放| 日韩在线观看免费全| 国产精品69久久久久| 国产97免费视| 美女久久久久久久久久久| 亚洲精品一区中文| 久久久久久综合网天天| 91产国在线观看动作片喷水| 国产日本欧美一区二区三区在线| 欧美亚洲激情在线| 色婷婷av一区二区三区在线观看| 日韩中文娱乐网| 国产精品视频一区二区高潮| 久久久精品999| 精品性高朝久久久久久久| 欧美一级电影免费在线观看| 日韩精品在线免费播放| 亚洲午夜国产成人av电影男同| 97色在线观看| 国产精品九九久久久久久久| 国产成人精品免高潮在线观看| 亚洲天堂开心观看| 亚洲激情在线视频| 成人精品视频在线| 成人欧美一区二区三区在线湿哒哒| 久久这里只有精品视频首页| 日韩国产欧美精品一区二区三区| 成人激情av在线| 日产精品久久久一区二区福利| 成人黄色免费网站在线观看| 亚洲国产精品人人爽夜夜爽| 日韩精品福利在线| 欧美风情在线观看| 日韩精品在线观看一区二区| 亚洲精品xxxx| 亚洲va久久久噜噜噜|