FastDFS
Posted 何波安的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastDFS相关的知识,希望对你有一定的参考价值。
FastDFS简介
FastDFS是一个开源的高性能分布式文件系统,它的主要功能包括文件存储,文件上传和文件下载,解决高容量和负载均衡问题。FastDFS应该满足基于照片共享站点和视频共享站点等文件服务的网站的要求。
支持存储服务器在线扩容,支持相同的文件只保存一份,节约磁盘。
FastDFS只能通过Client API访问,不支持POSIX访问方式。
FastDFS适合中大型网站使用,用来存储资源文件(如:图片、文档、视频等)
FastDFS有两个角色
tracker server(跟踪器):跟踪器负责文件访问的调度和负载平衡
storage server(存储器):存储器负责文件管理,包括文件存储,文件同步,文件提供存取接口它还管理作为表示文件的键值对的属性的元数据
跟踪器和存储包含一个或多个服务器。跟踪器或存储群集中的服务器可随时添加到群集或从群集中删除,而不影响在线服务。跟踪器集群中的服务器是对等的
由文件卷/组织组织的存储服务器获得高容量。存储系统包含一个或多个文件在这些卷中独立的卷。整个存储系统的容量等于所有容量的总和。文件卷包含一个或多个在这些服务器中文件相同的存储服务器。文件卷中的服务器相互备份,所有这些服务器都是负载均衡。将存储服务器添加到卷时,将自动将此卷中已有的文件复制到此新服务器,并且在完成此复制时,系统会将此服务器联机切换到提供存储服务
1)Tracker cluster中各个tracker server相互独立,不进行相互通信。
2)Storage cluster中各个storage组(Volume1,Volume2...)相互独立,不进行相互通信,也就是说各个组之间保存的数据是不相同的。但是各个组中的storage server之间是属于互相备份的关系,也就是说storage server之间保存相同的数据。
3)每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息。
文件上传
1)Client通过Tracker server将文件上传到Storage server。
2)Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
3)Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
4)上传完成,Storage server返回Client一个文件ID,文件上传结束。
文件下载
1)Client通过Tracker server下载指定Storage组中某个Storage server上的某个文件(文件名包括Storage组名称)。
2)Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
3)Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件下载。
安装配置FastDFS
yum groupinstall "Development Tools" "Server platform Development" mkdir /home/heboan/tools
下载并安装FastDFS依赖包libfastcommon
cd /home/heboan/tools git clone https://github.com/happyfish100/libfastcommon.git cd libfastcommon/ ./make.sh ./make.sh install
下载安装FastDFS
下载安装FastDFS cd /home/heboan/tools git clone https://github.com/happyfish100/fastdfs.git cd fastdfs/ ./make.sh ./make.sh install
注意:这里我把tracker和storage服务器安装在同一台机,如果安装在不同的机器上都要执行以上操作
配置tracker server(跟踪服务器)
1)、复制tracker server和client端样例文件并重命名 cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf 2)、编辑tracker server配置文件tracker.conf,需要修改的内容如下: disabled=false port=22122 base_path=/data/fdfs/tracker 3)、编辑client端的配置文件client.conf,需要修改的内容如下: base_path=/data/fdfs/client tracker_server=192.168.88.1:22122 4)、创建tracker server数据目录 mkdir -p /data/fdfs/tracker 5)、启动tracker server /etc/init.d/fdfs_trackerd start netstat -lntp|grep 22122
配置storage server(存储服务器)
1)、复制storage server样例配置文件并重命名 cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf 2)、编辑storage server配置文件storage.conf,需要修改的内容如下: disabled=false port=23000 base_path=/data/fdfs/storage tracker_server=192.168.88.1:22122 store_path0=/data/fdfs/storage http.server_port=8888 #默认为8888,nginx中配置的监听端口那之一致 3)、创建storage server数据目录 mkdir -p /data/fdfs/storage 4)、启动storage server,启动成功会自动在/data/fdfs/tracker目录新建data和logs目录 #启动storage server的前提是tracker server必须事先已启动 /etc/init.d/fdfs_storaged start netstat -lntp|grep 23000
文件上传/查看/下载测试
文件上传/查看/下载测试 # fdfs_upload_file /etc/fdfs/client.conf /home/heboan/win8.png group1/M00/00/00/wKhYAVoumUyALZFGAATNsxTPz7I070.png #返回文件ID说明文件已经上传成功 # fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKhYAVoumUyALZFGAATNsxTPz7I070.png source storage id: 0 source ip address: 192.168.88.1 file create timestamp: 2017-12-11 22:42:20 file size: 314803 file crc32: 349163442 (0x14CFCFB2) # fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKhYAVoumUyALZFGAATNsxTPz7I070.png /tmp/win8.jpg
查看存储节点状态
fdfs_monitor /etc/fdfs/client.conf
####配置nginx为storage server提供http访问接口####
下载fastdfs-nginx-module
cd /home/heboan/tools git clone https://github.com/happyfish100/fastdfs-nginx-module.git
拷贝fastdfs-nginx-module模块中配置文件到/etc/fdfs目录中并编辑
# cp /home/heboan/tools/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ # vim /etc/fdfs/mod_fastdfs.conf 修改内容如下 connect_timeout=10 base_path=/tmp tracker_server=192.168.88.1:22122 storage_server_port=23000 url_have_group_name = true store_path0=/data/fdfs/storage group_name=group1 ... [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/data/fdfs/storage
下载nginx源码,并编译支持FastDFS
yum install openssl-devel pcre-devl cd /home/heboan/tools useradd -r nginx wget http://nginx.org/download/nginx-1.12.2.tar.gz tar xf nginx-1.12.2.tar.gz cd nginx-1.12.2 ./configure --prefix=/opt/nginx-1.12.2 --user=nginx --group=nginx --add-module=../fastdfs-nginx-module/src/ make && make install ln -s /opt/nginx-1.12.2 /opt/nginx
复制FastDFS中的部分配置文件到/etc/fdfs目录中
cp /home/tools/fastdfs/conf/http.conf /etc/fdfs/ cp /home/tools/fastdfs/conf/mime.types /etc/fdfs/
做软链接
ln -s /data/fdfs/storage/data /data/fdfs/storage/data/M00
配置nginx
vim /opt/nginx/conf/nginx.conf ... server { listen 8888; #888端口号与/etc/fdfs/storage.conf中的http.server_port=8888相对应 server_name localhost; location ~/group/M00 { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
启动nginx,通过浏览器访问之前已经上传的文件
/opt/nginx/sbin/nginx -t /opt/nginx/sbin/nginx 访问http://192.168.88.1:8888/group1/M00/00/00/wKhYAVoumUyALZFGAATNsxTPz7I070.png
集群模式
tracker配置
tracker cluster中各个tracker server相互独立,不进行相互通信,所以两台部署是一样的
具体部署过程参考上面
storage配置(storage四台服务器全都要做)
storage.conf disabled=false group_name=group1 (第一组为group1,第二组为group2) port=2300 同一组的storage端口号必须相同 base_path=/data/fdfs/storage 设置storage的日志目录 store_path0=/data/fdfs/storage 存储路径 store_path_count=1 存储路径的个数,需要和store个数匹配 tracker_server=xxxxxx:xxxx tracker服务器的ip地址和端口 tracker_server=xxxxxx:xxxx 多个tracker直接添加多条配置 http.server_port=8888 设置http端口号
说明:一台storage只会选择一个tracker服务器,一台tracker服务器挂掉,会接着选择另外一台tracker服务器
记得创建数据和日志目录:/data/fdfs/storage
查看storage服务器的具体信息,可以用于监控,任意一台storage服务器
fdfs_monitor /etc/fdfs/storage.conf
上传文件测试
在tracker服务器上测试(任意一台) fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/fastdfs-5.05.tar.gz storage服务器检测一下: cd /data/fdfs/storage/data/00/00;ls
在每个storage服务器安装nginx(在storage上安装的nginx主要为了提供http的访问服务,同时解决group中storage服务器的同步延迟问题。)
fastdfs-nginx-module下载,编辑安装nginx并加入fastdfs-nginx-module(操作步骤查看前面)
拷贝nginx-module配置文件(mod_fastdfs.conf )到/etc/fdfs下并修改
connect_timeout=2 network_timeout=30 base_path=/tmp load_fdfs_parameters_from_tracker=true storage_sync_file_max_delay = 86400 use_storage_id = false storage_ids_filename = storage_ids.conf tracker_server=192.168.88.1:22122 tracker_server=192.168.88.2:22122 storage_server_port=23000 group_name=group1 #group1 的配置文件为group1 group2的配置文件为group2 其余不变 url_have_group_name = true store_path_count=1 store_path0=/fastdfs/storage log_level=info log_filename= response_mode=proxy if_alias_prefix= flv_support = true flv_extension = flv group_count = 2 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/fastdfs/storage [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/fastdfs/storage
复制fastdfs的配置文件到/etc/fdfs下(http.conf , mime.types)
做软链接
ln -s /data/fdfs/storage/data /data/fdfs/storage/data/M00
修改nginx配置
user root; listen 8888; location ~/group([0-9])/M00 { ngx_fastdfs_module; }
启动nginx
测试结论
在任意一台storage服务器上使用fdfs_upload_file命令来上传文件,会根据内置的调度算法存储到group1,或者group2
这里我们假设被存储到了group1:那么这个文件就会被存储到88.3、88.4的主机上,一个组 内的机机器上的数据是一致的
虽然数据只是被存储到group1上,因为group1和group2是在一个集群里面。所以,通过访问集群里面的任意一台机器(88.3-88.4-88.5-88.6)都可以访问获取到这个文件
例如:
http://192.168.56.88.3:8888/group1/M00/00/00/wKg4iViD5pGASNhIAAUggSnIHZU.tar.gz http://192.168.56.88.4:8888/group2/M00/00/00/wKg4iViD5pGASNhIAAUggSnIHZU.tar.gz http://192.168.56.88.5:8888/group3/M00/00/00/wKg4iViD5pGASNhIAAUggSnIHZU.tar.gz http://192.168.56.88.6:8888/group4/M00/00/00/wKg4iViD5pGASNhIAAUggSnIHZU.tar.gz
fastdfs的高可用 在安装一台nginx分别代理所有group的nginx
-
此台nginx 可以安装在两台tracker上面,用keepalived做高可用,目的反向代理
-
所有storage上面的nginx 是目标重定向用的防止找不到下载文件,因为同步延迟
upstream group1 { server 192.168.88.3:8888; server 192.168.88.4:8888; } upstream group2 { server 192.168.88.6:8888; server 192.168.88.7:8888; } server { listen 80 default_server; location /group1/M00 { proxy_pass http://group1; } location /group2/M00 { proxy_pass http://group2; } }
以上是关于FastDFS的主要内容,如果未能解决你的问题,请参考以下文章
分布式文件服务器FastDFS之“文件上传后(JAVA),前(AngularJS)端代码"