天天看點

thinking about application known or un-known distributed storage

最近有個資源整合的項目,存儲的話選擇了mongodb的sharding來做,因為資料量較大。

原本可能會選擇hadoop來做的,不過從hadoop的文檔上看到好像不太适用大并發的小io的操作(小檔案),更加适用大吞吐量小并發的操作(大檔案)。

應用要求多idc部署,是以資源檔案也要求在多idc存儲(相當于每個idc需要有同樣的資源檔案)。

考慮到擴充性,在一個idc内部使用了mongodb的sharding特性。

但是這樣帶來一個問題,不友善複制到其他的idc,是以目前的做法是應用層在寫入檔案存儲的時候同時調用遠端idc的應用寫入檔案到遠端idc的mongodb sharding。

thinking about application known or un-known distributed storage

。這樣做的好處是單個idc的檔案存儲擴充變得比較靈活,不過又帶來一些問題,由于sharding是mongodb來做的,可能不能做到就近存儲(比如存進去的資源,需要讀取這個資源的應用和存儲的位置應該最近,這樣的話才是最優的。針對write-once-read-some型應用。)

還一個問題是,可能出現一個idc檔案資源存儲成功了,另一個idc的檔案資源沒有存儲成功的情況,同時也是應用需要考慮來解決的問題。

是以最近我也在考慮是否有其他的解決方案,即能夠做到分布存儲,又可以讓檔案存儲來做多idc複制,例如mongodb的master-slave。

例如

idc a : (讀寫)

增加一個postgresql,用于存儲檔案存放的位置,

如:

idc_id,file_name,mongodb_hostname,mongodb_namespace

當檔案被寫入到mongodb時,同時寫入記錄到postgresql,這樣的話如果一個mongodb不夠了,可以加mongodb伺服器,

如果一台postgresql資料庫不夠用,甚至還可以對file_name進行hash分區,使用多台postgresql來堆。

當檔案被讀取時,先到postgresql讀取到檔案存放的位置,然後到mongodb讀取。

idc b:  (隻讀)

利用postgresql的複制功能和mongodb的複制功能複制idc a的資料到idc b。idc b隻提供讀取功能,所有的寫在idc a完成。

如圖 : 

thinking about application known or un-known distributed storage

這樣做的好處是在應用部署時會比較靈活,解決了就近存儲的問題。同時也簡化了應用設計,不需要應用來處理寫多個idc的問題。

當然,兩種方式都可能使得idc a 和idc b在短時間内有一定的資料延時。