项目中用到文件服务器fastdfs,所以就了解学习了一番,感觉确实颇为强大,在此再次感谢淘宝资深架构师余庆大神开源了如此优秀的轻量级分布式文件系统,本篇文章学习并记录一下fastdfs的在centos7中的安装与配置。
首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(trackerserver)、存储服务器(storageserver)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
如上图,FastDFS的两个核心概念分别是:Tracker(跟踪器),Storage(存储节点) 。
Tracker主要做调度工作,相当于mvc中的controller的角色,在访问上起负载均衡的作用。跟踪器和存储节点都可以由一台或多台服务器构成,跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务,其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。Tracker负责管理所有的Storage和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表,Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。
Storage采用了分卷[Volume](或分组[group])的组织方式,存储系统由一个或多个组组成,组与组之间的文件是相互独立的,所有组的文件容量累加就是整个存储系统中的文件容量。一个卷[Volume](组[group])可以由一台或多台存储服务器组成,一个组中的存储服务器中的文件都是相同的,组中的多台存储服务器起到了冗余备份和负载均衡的作用,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。
下面进行单机版的安装,共分为一下几个步骤:
01 下载安装文件
02 安装libfastcommon
03 安装FastDFS
04 配置 Tracker
05 配置Storage
06 命令上传测试
07 安装 fastdfs-nginx-module
08 安装 storage 的 nginx
09 安装 tracker 的 nginx
10 http测试
可以看到,fastdfs的安装十分繁琐,任何软件的下载配置和安装出错都会前功尽弃,所以每一步都要小心谨慎安装。下面开始正式进行安装。
01 下载安装文件
共需要下载四个文件
libfastcommon(下载地址:https://codeload.github.com/happyfish100/libfastcommon/zip/master)
fastdfs(下载地址:https://codeload.github.com/happyfish100/fastdfs/zip/master)
fastdfs-nginx-module(下载地址:https://codeload.github.com/happyfish100/fastdfs-nginx-module/zip/master)
nginx(下载地址:http://nginx.org/en/download.html)
把上面下载的四个文件都放到根目录下面的 /packages 目录下,统一管理。
注意:网上还有其他个人或者官网的下载地址,只要文件没问题,都可以!如图:
02 安装libfastcommon
首先要安装gcc编译器
yum -y install gcc-c++
将libfastcommon解压到/usr/local目录下
unzip /packages/libfastcommon-master.zip -d /usr/local/
安装libfastcommon
cd /usr/local/libfastcommon-master/
./make.sh
./make.sh install
看到类似下面的提示信息就说明安装成功:
因为libfastcommon.so 默认安装到了/usr/lib64/libfastcommon.so,但是FastDFS主程序设置的lib目录是/usr/local/lib,所以此处需要重新设置软链接
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
03 安装FastDFS
首先解压压缩包
cd /packages/
unzip fastdfs-master.zip
然后执行安装命令
cd /packages/fastdfs-master
./make.sh
./make.sh install
没有报错说明安装成功,并且已经安装到了 /etc/fdfs 中,我们看一下该目录下的文件:
如上图,安装成功后就会生成如上的几个.sample文件(示例配置文件),我们再分别拷贝出其中几个后面用到的正式的配置文件:
cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
此时目录中的文件如下:
至此FastDFS已经安装完毕,接下来的工作就是依次配置Tracker和Storage了。
04 配置 Tracker
在配置Tracker之前,首先需要创建Tracker的文件路径,即用于存储Tracker的数据文件和日志文件等,我这里选择在/opt目录下创建一个fastdfs_tracker目录用于存放Tracker服务器的相关文件:
mkdir /opt/fastdfs_tracker
接下来就要重新编辑上一步准备好的/etc/fdfs目录下的tracker.conf配置文件,
vim /etc/fdfs/tracker.conf
打开文件后依次做以下修改:
#启用配置文件(默认启用) (默认属性存在并且值为false,不需要修改)
disabled=false
#设置tracker的端口号,通常采用22122这个默认端口 (默认属性存在,并且值为22122,不需要修改)
port=22122
#设置tracker的数据文件和日志目录 (默认属性存在,但是值需要修改成当前设置的路径)
base_path=/opt/fastdfs_tracker
#设置http端口号,默认为8080 (默认属性存在,但是值需要修改成6666)
http.server_port=6666
配置完成后就可以启动Tracker服务器了,但首先依然要为启动脚本创建软引用,因为fdfs_trackerd等命令在/usr/local/bin中并没有,而是在/usr/bin路径下:
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
最后通过命令启动Tracker服务器:
service fdfs_trackerd start
命令执行后可以看到以下提示:
如果启动命令执行成功,那么同时在刚才创建的tracker文件目录/opt/fastdfs_tracker中就可以看到启动后新生成的data和logs目录,
tracker服务的端口也应当被正常监听,最后再通过netstat命令查看一下端口监听情况:
netstat -unltp|grep fdfs*
可以看到tracker服务运行的22122端口正常被监听:
确认tracker正常启动后可以将tracker设置为开机启动,打开/etc/rc.d/rc.local:
vim /etc/rc.d/rc.local
在其中加入以下配置:
service fdfs_trackerd start
如果重启后发现未能自动启动则通过下面命令检查一下rc.local是否具备可执行权限:
ll /etc/rc.d/rc.local
若是无可执行权限则通过chmod +x 进行授权:
chmod +x /etc/rc.d/rc.local
Tracker至此就配置好了,接下来就可以配置FastDFS的另一核心——Storage。
05 配置Storage
步骤基本与配置Tracker一致,首先是创建Storage服务器的文件目录,需要注意的是同Tracker相比我多建了一个目录,因为Storage还需要一个文件存储路径,用于存放接收的文件:
mkdir /opt/fastdfs_storage
mkdir /opt/fastdfs_storage_data
接下来修改/etc/fdfs目录下的storage.conf配置文件,
vim /etc/fdfs/storage.conf
打开文件后依次做以下修改:
#启用配置文件(默认启用)
disabled=false
#组名,根据实际情况修改
group_name=group1
#设置storage的端口号,默认是23000,同一个组的storage端口号必须一致
port=23000
#设置storage数据文件和日志目录
base_path=/opt/fastdfs_storage
#存储路径个数,需要和store_path个数匹配
store_path_count=1
#实际文件存储路径
store_path0=/opt/fastdfs_storage_data
#tracker 服务器的 IP地址和端口号,如果是单机搭建,IP不要写127.0.0.1,否则启动不成功(比如当前ip是192.168.1.52)
tracker_server=192.168.1.52:22122
#设置 http 端口号
http.server_port=8888
配置完成后同样要为Storage服务器的启动脚本设置软引用:
ln -s /usr/bin/fdfs_storaged /usr/local/bin
接下来就可以启动Storage服务了:
service fdfs_storaged start
命令执行后可以看到以下提示,如图:
同理,如果启动成功,/opt/fastdfs_storage中就可以看到启动后新生成的data和logs目录:
端口23000也应被正常监听:
可以看到/opt/fastdfs_storage/data目录下生成好的pid文件和dat文件:
还有一点就是文件实际存储路径/opt/fastdfs_storage_data/data下会生成多级存储目录,那么接下来看看是否启动成功了:
如上图,没有任何问题,data下有256个1级目录,每级目录下又有256个2级子目录,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
至此storage服务器就已经配置完成,确定了storage服务器启动成功后,还有一项工作就是看看storage服务器是否已经登记到 tracker服务器(也可以理解为tracker与storage是否整合成功),运行以下命令:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
如下图所示,看到192.168.1.52 ACTIVE 字样即可说明storage服务器已经成功登记到了tracker服务器:
添加开机启动,打开/etc/rc.d/rc.local:
vim /etc/rc.d/rc.local
并将如下配置追加到文件中:
service fdfs_storaged start
至此我们就已经完成了fastdfs的全部配置,此时也就可以用客户端工具进行文件上传下载的测试了。
06 命令上传测试
fastdfs安装成功,并成功启动了Tracker和Storage的配置,此时可以用命令进行文件上传的测试了。
测试时需要设置客户端的配置文件,编辑/etc/fdfs目录下的client.conf 文件:
vim /etc/fdfs/client.conf
打开文件后依次做以下修改:
#tracker服务器文件路径
base_path=/opt/fastdfs_tracker
#tracker服务器IP地址和端口号
tracker_server=192.168.1.52:22122
# tracker 服务器的 http 端口号,必须和tracker的设置对应起来
http.tracker_server_port=6666
配置完成后就可以模拟文件上传了,先给/packages目录下放一张图片 123.jpg:
然后通过执行客户端上传命令尝试上传:
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /packages/123.jpg
可以看到命令行返回了一个文件的路径(图片名和路径以各自的服务器的为准):
这就表示我们的文件已经上传成功了,当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、文件名、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成,如下:
group1:组名
M00:磁盘
00/00:两级子目录
wKgBNFssou2Ade4jAAAzm2-Ii4E247:文件名
.jpg:文件后缀名
同时在之前配置的storage服务器的实际文件存储路径中也可以根据返回的路径找到实际文件:
接下来尝试用浏览器发送HTTP请求访问一下文件:
http://192.168.1.52:6666/group1/M00/00/00/wKgBNFssou2Ade4jAAAzm2-Ii4E247.jpg
此时发现并不能访问,因为FastDFS的4.0.5版本开始移除了自带的HTTP支持(因为之前自带的HTTP服务较为简单,无法提供负载均衡等高性能服务),所以软件提供了nginx上使用FastDFS的模块fastdfs-nginx-module。
07 安装 fastdfs-nginx-module
nginx上使用FastDFS的模块fastdfs-nginx-module,这样做最大的好处就是提供了HTTP服务并且解决了group中storage服务器的同步延迟问题,接下来就具体记录一下fastdfs-nginx-module的安装配置过程。
首先需要先安装一些模块依赖的lib库:
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
然后解压fastdfs-nginx-module:
cd /packages
unzip fastdfs-nginx-module-master.zip
接下来还需要把fastdfs-nginx-module安装目录中src目录下的mod_fastdfs.conf也拷贝到/etc/fdfs目录下:
cp /packages/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/
接下来就需要编辑刚拷贝的这个mod_fastdfs.conf文件了,打开mod_fastdfs.conf:
vim /etc/fdfs/mod_fastdfs.conf
按顺序依次编译以下内容:
#保存日志目录
base_path=/opt/fastdfs_storage
#tracker服务器的IP地址以及端口号
tracker_server=192.168.1.52:22122
#storage服务器的端口号
storage_server_port=23000
#文件 url 中是否有 group 名
url_have_group_name = true
# 存储路径
store_path0=/opt/fastdfs_storage_data
#设置组的个数,事实上这次只使用了group1
group_count = 3
#设置了group_count = 3,接下来就需要在文件尾部追加这3个group setting:
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs_storage_data
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs_storage_data
[group3]
group_name=group3
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs_storage_data
关于fastdfs-nginx-module的配置完成。注意:上面的三个group一定要写的格式清晰,有的文章中括号折行是导致测试不通过的主要原因。
08 安装 storage 的 nginx
首先解压nginx
cd /packages/
tar -zxvf nginx-1.13.12.tar.gz
然后编译安装nginx,进入nginx目录并输入以下命令进行配置:
cd /packages/nginx-1.13.12
./configure --prefix=/usr/local/nginx --add-module=/packages/fastdfs-nginx-module-master/src
配置成功后会看到如下信息:
紧接着就可以进行编译安装了,依次执行以下命令:
cd /packages/nginx-1.13.12
make
make install
安装完成后,我们在我们指定的目录/usr/local/nginx中就可以看到nginx的安装目录了:
接下来要修改一下nginx的配置文件,进入conf目录并打开nginx.conf文件加入以下配置:
# 首先删除原来的80监听
#然后加入下面的9999监听
listen 9999;
#然后加入下面的配置
location /group1/M00 {
root /opt/fastdfs_storage_data/data;
ngx_fastdfs_module;
}
然后进入FastDFS的安装目录下的conf目录,将http.conf和mime.types拷贝到/etc/fdfs目录下:
cp /packages/fastdfs-master/conf/http.conf /etc/fdfs/
cp /packages/fastdfs-master/conf/mime.types /etc/fdfs/
最后启动nginx:
/usr/local/nginx/sbin/nginx
显示如下信息说明nginx已启动成功:
通过浏览器也可以看到nginx的主页(http://192.168.1.52:9999):
storage服务器的nginx就已经安装完毕,接下来看一下tracker服务器的nginx安装。
09 安装 tracker 的 nginx
同理,再装一个nginx,目录命名为nginx2,安装路径依旧放在/usr/local下,由于和之前一样,此处就不再做详细解释:
cd /packages/nginx-1.13.12
./configure --prefix=/usr/local/nginx2 --add-module=/packages/fastdfs-nginx-module-master/src
cd /packages/nginx-1.13.12
make
make install
接下来依然是修改nginx2的配置文件,进入conf目录
cd /usr/local/nginx2/conf/
打开nginx.conf文件加入以下配置,storage的nginx无需修改listen端口,即默认的80端口,并将upstream指向tracker的nginx地址:
#upstream 加在 http下面
upstream fdfs_group1 {
server 127.0.0.1:9999;
}
location /group1/M00 {
proxy_pass http://fdfs_group1;
}
接下来启动nginx2:
/usr/local/nginx2/sbin/nginx
此时访问nginx2的主页,由于没有修改端口,直接访问ip地址即可:
最后一步就是需要修改/etc/fdfs目录下的client.conf文件,打开该文件并加入以下配置:
#日志存放路径
base_path=/data/fastdfs_storage
#tracker 服务器 IP 地址和端口号
tracker_server=192.168.1.52:22122
# tracker 服务器的 http 端口号,必须和tracker的设置对应起来
http.tracker_server_port=6666
至此关于fastdfs就已经全部配置完毕了。
10 http测试
再一次测试上面上传的123.jpg的地址,可以发现,已经能够访问成功:
http://192.168.1.52/group1/M00/00/00/wKgBNFssou2Ade4jAAAzm2-Ii4E247.jpg
图片为:
注意,上一次测试访问的端口是6666,本次因为nginx,所以访问的端口是80