FastDFS文件同步機制

FastDFS文件同步機制

在FastDFS的服務器端配置文件中,bind_addr這個參數用於需要綁定本機IP地址的場合。只有這個參數和主機特徵相關,其餘參數都是可以統一配置的。在不需要綁定本機的情況下,爲了便於管理和維護,建議所有tracker server的配置文件相同,同組內的所有storage server的配置文件相同。

tracker server的配置文件中沒有出現storage server,而storage server的配置文件中會列舉出所有的tracker server。這就決定了storage server和tracker server之間的連接由storage server主動發起,storage server爲每個tracker server啓動一個線程進行連接和通訊,這部分的通信協議請參閱《FastDFS HOWTO – Protocol》中的“2. storage server to tracker server command”。

tracker server會在內存中保存storage分組及各個組下的storage server,並將連接過自己的storage server及其分組保存到文件中,以便下次重啓服務時能直接從本地磁盤中獲得storage相關信息。storage server會在內存中記錄本組的所有服務器,並將服務器信息記錄到文件中。tracker server和storage server之間相互同步storage server列表:

  1. 如果一個組內增加了新的storage server或者storage server的狀態發生了改變,tracker server都會將storage server列表同步給該組內的所有storage server。以新增storage server爲例,因爲新加入的storage server主動連接tracker server,tracker server發現有新的storage server加入,就會將該組內所有的storage server返回給新加入的storage server,並重新將該組的storage server列表返回給該組內的其他storage server;
    1. 如果新增加一臺tracker server,storage server連接該tracker server,發現該tracker server返回的本組storage server列表比本機記錄的要少,就會將該tracker server上沒有的storage server同步給該tracker server。

同一組內的storage server之間是對等的,文件上傳、刪除等操作可以在任意一臺storage server上進行。文件同步只在同組內的storage server之間進行,採用push方式,即源服務器同步給目標服務器。以文件上傳爲例,假設一個組內有3臺storage server A、B和C,文件F上傳到服務器B,由B將文件F同步到其餘的兩臺服務器A和C。我們不妨把文件F上傳到服務器B的操作爲源頭操作,在服務器B上的F文件爲源頭數據;文件F被同步到服務器A和C的操作爲備份操作,在A和C上的F文件爲備份數據。同步規則總結如下:

  1. 只在本組內的storage server之間進行同步;
    1. 源頭數據才需要同步,備份數據不需要再次同步,否則就構成環路了;
    2. 上述第二條規則有個例外,就是新增加一臺storage server時,由已有的一臺storage server將已有的所有數據(包括源頭數據和備份數據)同步給該新增服務器。

storage server有7個狀態,如下:

FDFS_STORAGE_STATUS_INIT :初始化,尚未得到同步已有數據的源服務器

FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已得到同步已有數據的源服務器

FDFS_STORAGE_STATUS_SYNCING :同步中

FDFS_STORAGE_STATUS_DELETED :已刪除,該服務器從本組中摘除(注:本狀態的功能尚未實現)

FDFS_STORAGE_STATUS_OFFLINE :離線

FDFS_STORAGE_STATUS_ONLINE :在線,尚不能提供服務

FDFS_STORAGE_STATUS_ACTIVE :在線,可以提供服務

當storage server的狀態爲FDFS_STORAGE_STATUS_ONLINE時,當該storage server向tracker server發起一次heart beat時,tracker server將其狀態更改爲FDFS_STORAGE_STATUS_ACTIVE。

組內新增加一臺storage server A時,由系統自動完成已有數據同步,處理邏輯如下:

  1. storage server A連接tracker server,tracker server將storage server A的狀態設置爲FDFS_STORAGE_STATUS_INIT。storage server A詢問追加同步的源服務器和追加同步截至時間點,如果該組內只有storage server A或該組內已成功上傳的文件數爲0,則沒有數據需要同步,storage server A就可以提供在線服務,此時tracker將其狀態設置爲FDFS_STORAGE_STATUS_ONLINE,否則tracker server將其狀態設置爲FDFS_STORAGE_STATUS_WAIT_SYNC,進入第二步的處理;
    1. 假設tracker server分配向storage server A同步已有數據的源storage server爲B。同組的storage server和tracker server通訊得知新增了storage server A,將啓動同步線程,並向tracker server詢問向storage server A追加同步的源服務器和截至時間點。storage server B將把截至時間點之前的所有數據同步給storage server A;而其餘的storage server從截至時間點之後進行正常同步,只把源頭數據同步給storage server A。到了截至時間點之後,storage server B對storage server A的同步將由追加同步切換爲正常同步,只同步源頭數據;
    2. storage server B向storage server A同步完所有數據,暫時沒有數據要同步時,storage server B請求tracker server將storage server A的狀態設置爲FDFS_STORAGE_STATUS_ONLINE;
      4 當storage server A向tracker server發起heart beat時,tracker server將其狀態更改爲FDFS_STORAGE_STATUS_ACTIVE。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章