分布式文件系统Fastdfs搭建详解

由于前期项目并发小,所以服务器资源占用也比较少。所以我们还是使用的NFS做图片存储,哪么随之项目的不断扩大,NFS就显得不是那么好用了,于是们就决定使用FASTDFS来代替NFS座位图片片存储。OK,那么下面就详细的介绍下我的搭建过程,也是一个自我学习的过程。
FastDFS是一个国产开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。

安装结构图如下:
fastdfs的安装结构图
一.安装
本安装使用 CentOS 6.6 x86_64版操作系统,按照以下网络结构进行部署:
1.下载安装文件
FastDFS 5.x 取消了对 libevent 的依赖,添加了对 libfastcommon 的依赖。
本部署说明用到的软件版本:
libfastcommon v1.13
FastDFS v5.06
fastdfs-nginx-module v1.17
zlib-1.2.4
pcre-8.34
gperftools-2.0
ngx_cache_purge-2.1
可从上面的sourceforge或github中下载,或者直接下载本文附带的压缩包。详细的安装说明可参照代码中的INSTALL。
2.安装FastDFS
在每一台tracker和storage服务器上执行

确认make没有错误后,执行安装,64位系统默认会复制到/usr/lib64下。
这时候需要设置环境变量或者创建软链接

配置文件在目录/etc/fdfs下:

二.FastDFS配置
1.配置Tracker跟踪器
开放tracker监听端口访问(适用于CentOS 7,省略)

修改配置文件

设置开机自启动

2.配置Storage存储节点:
开放tracker监听端口访问(省略)

修改配置文件

3.client客户端配置
在tracker, storage之外的一台主机上安装FastDFS,然后执行:

FastDFS测试
上传测试:

这里面看到两个节点的ip_addr = 192.168.1.96 (bypay.96.test) ACTIVE
就说明两个节点的状态是Ok的

三.安装nginx
配置storage的 nginx 服务器和tracker的反向代理服务器
防火墙开放http服务(适用于CentOS 7,此处省略)
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload
1.安装并启用nginx (在三台服务器上都需要安装)
安装nginx-1.9
编译环境:

创建nginx管理用户:

源码编译安装nginx:
官方提示说pcre模块版本在4.4 - 8.32 实际使用8.36 ,zlib模块源码要用1.1.3 — 1.2.7版本,实际使用1.2.8编译完成并未报错.
pcre-8.37.tar.gz
zlib-1.2.8.tar.gz
这里使用的是源码,而非编译后的安装目录哦!
解压pcre源码:

查看nginx的版本:
# nginx -v
nginx version: nginx/1.9.2
配置nginx启动脚本(省略)
chkconfig --add nginx
chkconfig nginx on

2.fastdfs模块配置
fastdfs-nginx-module用于解决同步延迟问题:

同组之间的服务器需要复制文件,有延迟的问题.
假设Tracker服务器将文件上传到了192.168.1.96,文件ID已经返回客户端,
这时,后台会将这个文件复制到192.168.1.94,如果复制没有完成,客户端就用这个ID在192.168.1.96取文件,肯定会出现错误
这个fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。

fastdfs-nginx-module模块只需要安装到storage上。

nginx配置启用google-perftools:
具体下载包和配置看:nginx篇的nginx的常见优化
如果使用googler开发的google-perftools优化Nginx和MySQL的内存管理,性能将会有一定程度的提升。特别是对高并发下的服务器,效果更明显

配置nginx.conf,在pid文件下面加入:

这里面开启几个线程,就是现实几个:
注解:
通过nginx提供的正则匹配判断get参数中的flag字段内容
如果flag为download则下载图片,否则浏览器呈现图片
指定指定文件的下载,防止信息泄露

完整的nginx.conf的配置文件:

配置浏览器端查看是否命中缓存
可以使用Chrome浏览器的开发工具,查看响应的头部信息来查看是否命中缓存,要启用此功能,修改nginx的主配置文件如下:
在location /group1/M00 段增加这2个行
add_header X-Via $server_addr;
add_header X-Cache-Status $upstream_cache_status;
四.优化部分
1、Tracker优化
1) max_connections=10000或更大响应参数增大内存消耗增加该参数需修改单一进程同时可打开文件数量(* soft nofile 65536 * hard nofile 65536)的限制后生效。
2) work_threads=12 cpu数量此处设置cpu核心数量
3) thread_stack_size=256
测试配置如下

2、Storage优化

disk_rw_separated:磁盘读写是否分离
disk_reader_threads:单个磁盘读线程数
disk_writer_threads:单个磁盘写线程数
如果磁盘读写混合,单个磁盘读写线程数为读线程数和写线程数之后
对于单盘挂载方式,磁盘读写线程分别设置为1即可
如果磁盘做了RAID,那么需要酌情加大读写线程数,这样才能最大程度地发挥磁盘性能
buff_size=512增大提升磁盘IO的另外一个技巧,一次尽可能多写入或多读取。也就是说,将程序的读写buffer设置得尽可能大一些。例如日志或者redo log的写入,不是每次调用都直接写磁盘,而是先缓存到内存中,等buffer满了再写入磁盘,也可以定时写入磁盘。
测试配置如下

以上配置压力测试上传并发2w 事务平均响应时间0.46秒,4w事务平均响应时间2.2秒。
五.FastDFS使用流程
1.上传文件
选择另外一台服务器:上传几张图片测试如下:
/usr/bin/fdfs_test /etc/fdfs/client.conf upload images5.jpg
fastdfs上传测试图片
FastDFS 提供了多种方式上传文件:
使用 fdfs_upload_file 上传
使用 C 语言客户端接口上传
使用 PHP 客户端接口上传
使用 Java 客户端接口上传
使用 Python 客户端接口上传
使用.NET 客户端接口上传
根据具体情况选择使用。上传均支持断点续传。
如果Java的客户端,在API的配置文件中配置 tracker服务器,如果有多个tracker服务器,就配置多台

建项目是遇到的问题:
问题:1

问题:2
查看nginx的日志,发现是一下错误:
解决办法:

问题:3
显示没有启用:
lsof -n | grep tcmalloc
以上没有问题,即可使用。

OK,到这里就搭建完成了。嘿嘿!

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: