背景
海量存儲、系統負載的遷移、服務器吞吐的瓶頸等等 讓文件系統獨立於業務系統 提高整個項目的擴展性以及可維護性
目前主流的方案 MFS FASTDFS GFS LUSTRE HADOOP等等
我選擇的是FASTDFS 用一句廣告語來說 “免費、快速、找得到”。FASTDFS的作者是淘寶的資深架構師余慶,很诙諧、很有愛!!!其他方案還沒玩過 暫不評論。
簡介
FastDFS是一款開源的輕量級分布式文件系統純C實現,支持Linux、FreeBSD等UNIX系統類google FS,不是通用的文件系統,只能通過專有API訪問,目前官方提供了C、Java和PHP API為互聯網應用量身定做,追求高性能和高擴展性,FastDFS可以看做是基於文件的key value pair存儲系統,稱作分布式文件存儲服務更為合適。
特點:
分組存儲,靈活簡潔
對等結構,不存在單點
文件ID由FastDFS生成,作為文件訪問憑證。FastDFS不需要傳統的name server
和流行的web server無縫銜接,FastDFS已提供apache和nginx擴展模塊
大中小文件均可以很好支持,支持海量小文件存儲
存儲服務器上可以保存文件附加屬性
名詞解釋:
Tracker Server:跟蹤服務器,主要做調度工作,在訪問上起負載均衡的作用。在內存中記錄集群中group和storage server的狀態信息,是連接Client和Storage server的樞紐。 因為相關信息全部在內存中,Tracker server的性能非常高,一個較大的集群(比如上百個group)中有3台就足夠了。
Storage Server:存儲服務器,文件和文件屬性(meta data)都保存到存儲服務器上。
實踐-服務端
系統:ubuntu
開發工具:vim
web服務:nginx
基於socket自定義通信協議
服務端的安裝參考官方文檔 有不懂的可以聯系蟲子 這裡說下問題比較多的2個地方 一個是libevent的版本問題 另一個是ubuntu最新版本中對於libpthread等庫文件的存放位置問題
安裝完fastdfs以後 假設你的服務端程序安裝在/usr/local目錄
我們會在bin目錄下找到以下文件
storage服務器啟動命令 /usr/local/bin/fdfs_storaged /FastDFS/conf/storage.conf
tracker服務器啟動命令 /usr/local/bin/fdfs_trackerd /FastDFS/conf/tracker.conf
我們運行monitor查看下配置信息
group count: 1 Group 1: group name = test free space = 5 GB storage server count = 2 active server count = 2 storage_port = 23000 storage_http_port = 0 store path count = 1 subdir count per path= 3 current write server index = 0 Host 1: ip_addr = 192.168.234.139 (ubuntu) ACTIVE total storage = 9GB free storage = 5GB total_upload_count = 2 success_upload_count = 2 total_set_meta_count = 0 success_set_meta_count = 0 total_delete_count = 0 success_delete_count = 0 total_download_count = 0 success_download_count = 0 total_get_meta_count = 0 success_get_meta_count = 0 total_create_link_count = 0 success_create_link_count = 0 total_delete_link_count = 0 success_delete_link_count = 0 last_heart_beat_time = 2012-01-05 18:45:50 last_source_update = 2012-01-05 01:20:28 last_sync_update = 1969-12-31 16:00:00 last_synced_timestamp= 1969-12-31 16:00:00 Host 2: ip_addr = 192.168.234.140 ACTIVE total storage = 18GB free storage = 12GB total_upload_count = 16 success_upload_count = 16 total_set_meta_count = 0 success_set_meta_count = 0 total_delete_count = 0 success_delete_count = 0 total_download_count = 0 success_download_count = 0 total_get_meta_count = 0 success_get_meta_count = 0 total_create_link_count = 0 success_create_link_count = 0 total_delete_link_count = 0 success_delete_link_count = 0 last_heart_beat_time = 2012-01-05 18:45:50 last_source_update = 2012-01-05 01:54:02 last_sync_update = 1969-12-31 16:00:00 last_synced_timestamp= 1969-12-31 16:00:00
本文URL地址:http://www.bianceng.cn/Programming/csharp/201410/45480.htm
storage.conf整理漢化版
disabled=false #配置是否生效 group_name=g1 #storage所在組(卷) bind_addr= # 綁定IP,另一太 storage IP為 192.168.6.101 client_bind=true #bind_addr通常是針對server的。當指定bind_addr時,本參數才有效。 port=13334 # 是storage 服務端口 connect_timeout=30 # 連接超時時間,針對socket套接字函數connect network_timeout=60 # storage server 網絡超時時間,單位為秒。 heart_beat_interval=30 # 心跳間隔時間,單位為秒 stat_report_interval=60 # storage server向tracker server報告磁盤剩余空間的時間間隔,單位為秒。 base_path=/opt/fastdfs/storage # base_path 目錄地址,根目錄必須存在 子目錄會自動生成 # 會產生data(數據存儲地方)、 logs日志文件 max_connections=256 # 最大連接數 buff_size = 256KB # 設置隊列結點的buffer大小。 work_threads=1 # 工作線程數 disk_rw_separated = true # 磁盤IO讀寫是否分離,缺省是分離的。 disk_reader_threads = 1 # 針對單個存儲路徑的讀線程數,缺省值為1 disk_writer_threads = 1 # 針對單個存儲路徑的寫線程數,缺省值為1 sync_wait_msec=200 # 同步文件時,如果從binlog中沒有讀到要同步的文件,休眠N毫秒後重新讀取,0表示不休眠,立即再次嘗試讀取。 sync_interval=0 # 同步上一個文件後,再同步下一個文件的時間間隔,單位為毫秒,0表示不休眠,直接同步下一個文件。 sync_start_time=00:00 sync_end_time=23:59 # 允許系統同步的時間段 (默認是全天) 。一般用於避免高峰同步產生一些問題而設定,相信sa都會明白。 write_mark_file_freq=500 # 把storage的mark文件定期同步到磁盤的時間間隔,單位為秒 store_path_count=1 # 存放文件時storage server支持多個路徑(例如磁盤)。這裡配置存放文件的基路徑數目,通常只配一個目錄。 store_path0=/opt/fastdfs # 逐一配置store_path個路徑,索引號基於0。注意配置方法後面有0,1,2 ......,需要配置0到store_path - 1。 # 如果不配置base_path0,那邊它就和base_path對應的路徑一樣。 subdir_count_per_path=32 # FastDFS存儲文件時,采用了兩級目錄。這裡配置存放文件的目錄個數 tracker_server=192.168.234.139:13333 # tracker_server 的列表 要寫端口的哦 log_level=info # 日志級別 run_by_group=root # 運行storage 用戶組 run_by_user=root # 運行storage 用戶 allow_hosts=* # 允許連接IP列表 file_distribute_path_mode=0 # 文件在data目錄下分散存儲策略。 # 0: 輪流存放 # 1: 隨機存儲 file_distribute_rotate_count=100 # 當上面的參數file_distribute_path_mode配置為0(輪流存放方式)時,本參數有效。 #當一個目錄下的文件存放的文件數達到本參數值時,後續上傳的文件存儲到下一個目錄中 fsync_after_written_bytes=0 # 當寫入大文件時,每寫入N個字節,調用一次系統函數fsync將內容強行同步到硬盤。0表示從不調用fsync sync_log_buff_interval=10 # 同步或刷新日志信息到硬盤的時間間隔,單位為秒 sync_binlog_buff_interval=60 # 同步binglog(更新操作日志)到硬盤的時間間隔,單位為秒 sync_stat_file_interval=300 # 把storage的stat文件同步到磁盤的時間間隔,單位為秒。 thread_stack_size=512KB #線程棧的大小。FastDFS server端采用了線程方式。 #線程棧越大,一個線程占用的系統資源就越多。 upload_priority=10 #本storage server作為源服務器,上傳文件的優先級,可以為負數。值越小,優先級越高。這裡就和 tracker.conf 中store_server= 2時的配置相對應了 if_alias_prefix= check_file_duplicate=0 #是否檢測上傳文件已經存在。如果已經存在,則不存在文件內容,建立一個符號鏈接以節省磁盤空間。 結合 fastdfh使用的。 1是檢測,0是不檢測,我們不使用fastdfh 當然 0 key_namespace=FastDFS # 當上個參數設定為1 或 yes時 (true/on也是可以的) , 在FastDHT中的命名空間 keep_alive=0 # 與FastDHT servers 的連接方式 (是否為持久連接) # 下面是http的配置了就不多說了 http.disabled=true http.domain_name= http.server_port=80 http.trunk_size=256KB http.need_find_content_type=true
tracker.conf整理漢化版
本文URL地址:http://www.bianceng.cn/Programming/csharp/201410/45480.htm
disabled=false #配置是否生效 bind_addr= #綁定IP port=13333 #服務端口 connect_timeout=30 #連接超時時間 network_timeout=60 # tracker server的網絡超時,單位為秒。 base_path=/opt/fastdfs/tracker #目錄地址,裡面會創建data(存放存儲服務器信息)、logs,日志文件 max_connections=256 #系統提供服務最大連接數 work_threads=4 #線程數,通常設置CPU數 store_lookup=2 #上傳組(卷) 的方式 0:輪詢方式 1: 指定組 2: 平衡負載(選擇最大剩余空間的組(卷)上傳)這裡如果在應用層指定了上傳到一個固定組,那麼這個參數被繞過 store_group=g1 #當上一個參數設定為1 時 (store_lookup=1,即指定組名時),必須設置本參數為系統中存在的一個組名。如果選擇其他的上傳方式,這個參數就沒有效了 store_server=0 #選擇哪個storage server 進行上傳操作(一個文件被上傳後,這個storage server就相當於這個文件的storage server源,會對同組的storage server推送這個文件達到同步效果) # 0: 輪詢方式 # 1: 根據ip 地址進行排序選擇第一個服務器(IP地址最小者) # 2: 根據優先級進行排序(上傳優先級由storage server來設置,參數名為upload_priority) store_path=0 #選擇storage server 中的哪個目錄進行上傳。storage server可以有多個存放文件的base path(可以理解為多個磁盤)。 # 0: 輪流方式,多個目錄依次存放文件 # 2: 選擇剩余空間最大的目錄存放文件(注意:剩余磁盤空間是動態的,因此存儲到的目錄或磁盤可能也是變化的) download_server=0 #選擇哪個 storage server 作為下載服務器 # 0: 輪詢方式,可以下載當前文件的任一storage server # 1: 哪個為源storage server 就用哪一個 (前面說過了這個storage server源 是怎樣產生的) 就是之前上傳到哪個storage server服務器就是哪個了 reserved_storage_space = 0.1GB #storage server 上保留的空間,保證系統或其他應用需求空間(指出 如果同組的服務器的硬盤大小一樣,以最小的為准,也就是只要同組中有一台服務器達到這個標准了,這個標准就生效,原因就是因為他們進行備份) log_level=info #選擇日志級別 run_by_group= #操作系統運行FastDFS的用戶組 run_by_user= #操作系統運行FastDFS的用戶 allow_hosts=* #可以連接到此 tracker server 的ip范圍(對所有類型的連接都有影響,包括客戶端,storage server) sync_log_buff_interval = 10 # 同步或刷新日志信息到硬盤的時間間隔,單位為秒 # 注意:tracker server 的日志不是時時寫硬盤的,而是先寫內存。 check_active_interval = 120 # 檢測 storage server 存活的時間隔,單位為秒。 # storage server定期向tracker server 發心跳,如果tracker server在一個check_active_interval內還沒有收到storage server的一次心跳,那邊將認為該storage server已經下線。所以本參數值必須大於storage server配置的心跳時間間隔。通常配置為storage server心跳時間間隔的2倍或3倍。 thread_stack_size = 64KB # 線程棧的大小。FastDFS server端采用了線程方式。更正一下,tracker server線程棧不應小於64KB,不是512KB。 # 線程棧越大,一個線程占用的系統資源就越多。如果要啟動更多的線程(V1.x對應的參數為max_connections,V2.0為work_threads),可以適當降低本參數值。 storage_ip_changed_auto_adjust = true # 這個參數控制當storage server IP地址改變時,集群是否自動調整。注:只有在storage server進程重啟時才完成自動調整。 storage_sync_file_max_delay = 86400 # V2.0引入的參數。存儲服務器之間同步文件的最大延遲時間,缺省為1天。根據實際情況進行調整 storage_sync_file_max_time = 300 # V2.0引入的參數。存儲服務器同步一個文件需要消耗的最大時間,缺省為300s,即5分鐘。 http.disabled=true # HTTP服務是否不生效 當然編譯的時候我已經把 with_httpd宏去掉了, http.server_port=80 # HTTP服務端口 # 下列參數只有 開啟http服務才有用 http.check_alive_interval=30 http.check_alive_type=tcp http.check_alive_uri=/status.html http.need_find_content_type=true
Web服務
FastDfs本身提供了組的概念,不同的組可以用不同的域名,如果是圖片等類型資源,利用多個子域名在網站優化中是很有幫助的。不過如果你想在一個域名下實現多個服務器的分布式方案,可以利用nignx的反向代理來做urlrewrite。
舉個簡單的例子
server { listen 80; server_name 192.168.234.140; index index.html index.htm index.php; root /app/test; location /g1{ proxy_pass http://192.168.234.139; } }
分布式算法
和memcached這些分布式系統不同。Fastdfs的分布式算法是在服務端實現,Fish也在不斷改良著算法。最新的是avl樹。不過貌似有整rbtree的趨勢。
負載均衡,同步
fastdfs還內置了組內的同步功能,不過我覺得對於我的項目可用性不大,因為我要實現的是狹義的分布式文件系統只要能保證海量的可擴展存儲方案就可以了,同步、負載均衡之類的就交給專業的運維們吧。
同步功能沒有開關配置,在同步時間設置上作手腳就可以了。
sync_start_time,sync_end_time
本文URL地址:http://www.bianceng.cn/Programming/csharp/201410/45480.htm
實踐-客戶端
系統:windowsXP
開發工具:VS2008
首先我們來看下基本功能
找張mm圖片 -_____-
上傳成功 對比一下
然後再看看分布式結果
本文URL地址:http://www.bianceng.cn/Programming/csharp/201410/45480.htm
192.168.234.139上
192.168.234.140上
web上浏覽
性能方面 和服務器本身的帶寬 吞吐都有關系 不過作為文件系統 對穩定性的要求更大 而fastdfs的很多實例都證明了這一點