工作原理
![](https://img.haomeiwen.com/i659256/ceb926d2f204a240.jpg)
FastDFS服务端有2个角色 分别是tracker( 调度器 ) 和 storage(存储节点)。
tracker负责调度和负载均衡,tracker负责管理所有的storage 和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。并不需要存储文件的索引信息,client 通过文件id 就可以获取存储信息,所有tracker服务器是对等的,可以随时增减而不影响已有服务。
文件id含义:
![](https://img.haomeiwen.com/i659256/525d3d45dc4875d2.jpg)
![](https://img.haomeiwen.com/i659256/e66a2d2851260169.png)
Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。group 只能通过增加磁盘扩容,无法通过增加机器扩容。
![](https://img.haomeiwen.com/i659256/60a1d59dc75ad072.jpg)
负载均衡
选择存储group:
- Round robin,所有的group间轮询
- Specified group,指定某一个确定的group
- Load balance,剩余存储空间多多group优先
选择storage server:
- Round robin,在group内的所有storage间轮询
- First server ordered by ip,按ip排序
- First server ordered by priority,按优先级排序(优先级在storage上配置)
选择storage path:
storage将会为文件分配一个数据存储目录,支持如下规则:
- Round robin,多个存储目录间轮询
- 剩余存储空间最多的优先
文件同步:
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。
存在的问题
- 当storage的某块磁盘故障时,只能换存磁盘,然后手动恢复数据;
- 存储空间受限于单机存储inode数量
安装
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 # 存储日志和数据的根目录
vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000 # storage服务端口(默认23000,一般不修改)
base_path=/home/dfs # 数据和日志文件存储根目录
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
网友评论