工作原理
FastDFS服務端有2個角色 分別是tracker( 調度器 ) 和 storage(存儲節(jié)點)掸冤。
tracker負責調度和負載均衡,tracker負責管理所有的storage 和group稿湿,每個storage在啟動后會連接Tracker,告知自己所屬的group等信息包斑,并保持周期性的心跳,tracker根據(jù)storage的心跳信息罗丰,建立group==>[storage server list]的映射表再姑。并不需要存儲文件的索引信息萌抵,client 通過文件id 就可以獲取存儲信息元镀,所有tracker服務器是對等的,可以隨時增減而不影響已有服務沐兰。
文件id含義:
Storage server(后簡稱storage)以組(卷蔽挠,group或volume)為單位組織瓜浸,一個group內包含多臺storage機器比原,數(shù)據(jù)互為備份插佛,存儲空間以group內容量最小的storage為準量窘,所以建議group內的多個storage盡量配置相同,以免造成存儲空間的浪費蚌铜。group 只能通過增加磁盤擴容,無法通過增加機器擴容囚痴。
負載均衡
選擇存儲group:
- Round robin审葬,所有的group間輪詢
- Specified group,指定某一個確定的group
- Load balance涣觉,剩余存儲空間多多group優(yōu)先
選擇storage server:
- Round robin痴荐,在group內的所有storage間輪詢
- First server ordered by ip,按ip排序
- First server ordered by priority官册,按優(yōu)先級排序(優(yōu)先級在storage上配置)
選擇storage path:
storage將會為文件分配一個數(shù)據(jù)存儲目錄生兆,支持如下規(guī)則:
- Round robin,多個存儲目錄間輪詢
- 剩余存儲空間最多的優(yōu)先
文件同步:
寫文件時攀隔,客戶端將文件寫至group內一個storage server即認為寫文件成功皂贩,storage server寫完文件后,會由后臺線程將文件同步至同group內其他的storage server昆汹。
每個storage寫文件后明刷,同時會寫一份binlog,binlog里不包含文件數(shù)據(jù)满粗,只包含文件名等元信息辈末,這份binlog用于后臺同步映皆,storage會記錄向group內其他storage同步的進度挤聘,以便重啟后能接上次的進度繼續(xù)同步;進度以時間戳的方式進行記錄捅彻,所以最好能保證集群內所有server的時鐘保持同步组去。
storage的同步進度會作為元數(shù)據(jù)的一部分匯報到tracker上,tracke在選擇讀storage的時候會以同步進度作為參考步淹。
存在的問題
- 當storage的某塊磁盤故障時从隆,只能換存磁盤诚撵,然后手動恢復數(shù)據(jù);
- 存儲空間受限于單機存儲inode數(shù)量
安裝
https://github.com/happyfish100/fastdfs/wiki#%E5%AE%89%E8%A3%85fastdfs
cd /usr/local/src
## 安裝依賴
sudo aptitude install git gcc g++ make automake autoconf libtool pcre2-utils libpcre2-dev zlib1g zlib1g-dev openssl libssh-dev wget vim
sudo aptitude install libpcre3 libpcre3-dev
## 安裝fastdfs的common包
sudo git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon
sudo ./make.sh && sudo ./make.sh install
cd ..
## fastdfs
sudo git clone https://github.com/happyfish100/fastdfs.git --depth 1
cd fastdfs
sudo ./make.sh && sudo ./make.sh install
#供nginx訪問使用的配置
cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/
cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/
cd ..
## 安裝 nginx 及相關模塊
sudo git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
sudo cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
sudo wget http://nginx.org/download/nginx-1.15.4.tar.gz && sudo tar -zxvf nginx-1.15.4.tar.gz
cd nginx-1.15.4/
sudo ./configure --prefix=/usr/local/nginx
sudo make && sudo make install
sudo ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src/
sudo make && sudo make install
cd ..
## 防火墻
sudo aptitude install ufw
sudo ufw enable
sudo ufw allow 23000 22122 8888 22
配置
vim /etc/fdfs/tracker.conf
port=22122 # tracker服務器端口(默認22122,一般不修改)
base_path=/home/dfs # 存儲日志和數(shù)據(jù)的根目錄
vim /etc/fdfs/storage.conf
#需要修改的內容如下
port=23000 # storage服務端口(默認23000,一般不修改)
base_path=/home/dfs # 數(shù)據(jù)和日志文件存儲根目錄
store_path0=/home/dfs # 第一個存儲目錄
tracker_server=192.168.52.1:22122 # tracker服務器IP和端口
vim /etc/fdfs/client.conf
#需要修改的內容如下
base_path=/home/dfs
tracker_server=192.168.52.1:22122 #tracker服務器IP和端口
#保存后測試,返回ID表示成功 如:group1/M00/00/00/xx.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz
vim /etc/fdfs/mod_fastdfs.conf
#需要修改的內容如下
tracker_server=192.168.52.1:22122 #tracker服務器IP和端口
url_have_group_name=true
store_path0=/home/dfs
#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
listen 8888; ## 該端口為storage.conf中的http.server_port相同
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#測試下載键闺,用外部瀏覽器訪問剛才已傳過的nginx安裝包,引用返回的ID
http://192.168.52.1:8888/group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVgg.tar.gz