参考链接
CentOS7搭建FastDFS V5.11分布式文件系统及Java整合详细过程(一) - CSDN博客
CentOS 7 安装配置分布式文件系统 FastDFS 5.1.1
最近有个想法搭建一个文件服务器,因为之前都是用人家已经搭建好的服务。自己对这一块会使用,但是很多地方都糊里糊涂的,想通过从零开始,了解这一块。
详细介绍
FastDFS是一个开源的分布式文件系统,她对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value pair)方式表示,如:width=1024,其中的key为width,value为1024。文件meta data是文件属性列表,可以包含多个键值对。
FastDFS系统结构如下图所示:
跟踪器和存储节点都可以由一台多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷 的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起 到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,者缺一不可。
上传文件交互过程
client询问tracker上传到的storage,不需要附加参数;
tracker返回一台可用的storage;
client直接和storage通讯完成文件上传。
下载文件交互过程
client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
tracker返回一台可用的storage;
client直接和storage通讯完成文件下载。
安装准备:
1.虚拟机(centos 7)
2.FastDFS相关包,可在https://github.com/happyfish100 下载
3.nginx 相关的包
最终下载的结果:
准备好了,就开始搭建我们的FastDFS。
1.文件上传到Centos 7
可以使用文件传输工具上传上去,如xftp
但是,我想用vsftpd上传,如果有兴趣的可以跟我来弄,没兴趣的用上面的工具或自己的方法上传到服务器
vsftp被公认目前最好的ftp之一,所以,搭建它还是很有意义的,有了它,我们可以让虚拟机与主机更加方便的通信。我也是参考人家的搭建,再自己动手搭建。嫌弃我啰嗦的,可以参照文章:http://blog.csdn.net/m0_37797991/article/details/73433969
1.安装
在安装前查看是否已安装vsftpd
# 查看是否已安装 方法一
[root@localhost ~]# rpm -q vsftpd
vsftpd-3.0.2-22.el7.x86_64
# 查看是否已安装 方法二
[root@localhost ~]# vsftpd -v
vsftpd: version 3.0.2
# 安装 vsftpd
[root@localhost ~]# yum -y install vsftpd
2.防火墙设置
如果防火墙把ftp的端口给拦截了,我们是无法访问到ftp服务的。我们可以选择把ftp的端口给关闭,但是个人不推荐。
当然如果不想麻烦,也提供CentOS7中关闭防火墙的方法:
#关闭防火墙(重启后不生效)
[root@localhost ~]# systemctl stop firewalld.service
#禁用防火墙(永久关闭)
[root@localhost ~]# systemctl disable firewalld.service
如果不关闭防火墙的话,我们可以把ftp服务添加了防火墙外:
#开放ftp服务添加到防火墙外
[root@localhost ~]# firewall-cmd --permanent --add-service=ftp
#使其生效
[root@localhost ~]# firewall-cmd --reload
#重启防火墙
[root@localhost ~]# systemctl restart firewalld.service
3.设置SELinux
[root@localhost ~]# vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
#让SELinux进入Permissive模式(宽容模式)
[root@localhost ~]# setenforce 0
解析一下,SELiunx一共有三种模式:
enforcing(强制模式 ):开始限制domain/type
permissive(宽容模式) :仅会有警告信息
disabled(关闭):关闭SELinux
继续设置SELiunx:
#查看SELinux状态
[root@localhost ~]# /usr/sbin/sestatus -v
我们查看一下权限:
[root@localhost ~]# getsebool -a | grep ftp
ftp_home_dir和ftpd_full_access必须为on 才能使vsftpd 具有访问ftp根目录,以及文件传输等权限。
[root@localhost ~]# setsebool -P tftp_home_dir 1
[root@localhost ~]# setsebool -P allow_ftpd_full_access 1
让我们再回到强制模式:
#进入Enforcing模式
[root@localhost ~]# setenforce 1
再次查看权限:
[root@localhost ~]# getsebool -a | grep ftp
创建我们的存放ftp文件目录,并授予权限:
我自己创建了用于ftp访问的目录 /home/ftp
#ftp的访问路径
[root@localhost ~]# chmod -R 777 /home/ftp
4.配置vsftpd
[root@localhost ~]# vi /etc/vsftpd/vsftpd.conf
打开后修改或者新增:
anonymous_enable=NO #不允许匿名访问
write_enable=YES #写权限
local_root=/home/ftp #这里是我自定义的ftp目(新增)
#这个是限制ftp用户只能在自己目录,如果ftp可以跳到其它任意目录是比较危险的,建议限制
chroot_local_user=YES
#2.3.5之后,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了,需新增此配置(新增)
allow_writeable_chroot=YES
5.激活root用户
处于安全考虑,root用户是不能作为ftp的登录账户的,如果在没有限制访问目录的情况下,root用户可以在ftp里访问任一文件,所以默认是不能登录ftp的。当然,你也可以为新建一些用户,专门作为ftp用户,个人习惯,用虚拟机的时候我一般直接用root用户登录ftp。
我们需要注释或者删除/etc/vsftpd/ftpusers和/etc/vsftpd/user_list中的root:
[root@localhost ~]# vi /etc/vsftpd/ftpusers
[root@localhost ~]# vi /etc/vsftpd/user_list
6.重启服务
[root@localhost ~]# systemctl restart vsftpd.service
在windows上登录:
在centos7上/home/ftp 查看
开始搭建FastDFS
经过前面的准备工作,现在我们可以开始搭建自己的FastDFS服务
1.1安装 libfastcommon
由于我的centOS7是最小化安装,我里面没有安装zip解压。先安装zip
[root@localhost ftp]# yum -y install unzip zip
安装成功后解压libfastcommon-master.zip
[root@localhost ftp]# unzip libfastcommon-master.zip
进入我们刚刚解压的目录:
[root@localhost ftp]# cd libfastcommon-master
[root@localhost libfastcommon-master]# ./make.sh
然后当我们接着执行./make.sh的时候会提示,gcc命令没有找到。
要先用yum安装gcc:
[root@localhost libfastcommon-master]# yum -y install gcc-c++
这个时候分别执行./make.sh和./make.sh install,正常情况是可以成功的。
[root@localhost libfastcommon-master]# ./make.sh
[root@localhost libfastcommon-master]# ./make.sh install
libfastcommon默认会被安装到/usr/lib64/libfastcommon.so但是FastDFS的主程序却在/usr/local/lib目录下
这个时候我们就要建立一个软链接了,实际上也相当于windows上的快捷方式,执行以下4个命令。
[root@localhost libfastcommon-master]# ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
下面这个有可能已经已经存在软连接(ps:我的就是已经存在),你们可以查找该目录是否存在
[root@localhost libfastcommon-master]# ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
[root@localhost libfastcommon-master]# ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
[root@localhost libfastcommon-master]# ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
1.2安装FastDFS
切换回原来的/home/ftp目录,解压FastDFS安装包
[root@localhost ftp]# unzip fastdfs-master.zip
解压后看到:
进入fastdfs-master目录
[root@localhost ftp]# cd fastdfs-master
[root@localhost fastdfs-master]# yum -y install perl
友情提醒:要先安装
yum -y install perl 然后在./make.sh ./make.sh install 否则有如下错误:
解决方案:估计是因为你后来修改了编译参数,在这种情况下,要先执行./make.sh clean,然后再重新编译即可。
我也遇到了,我说说我的情况,是先安装时提示没有安装Perl中,然后回头安装了Perl中,然后在编译就出现了下面这个错误
[root@localhost fastdfs-master]# ./make.sh
[root@localhost fastdfs-master]# ./make.sh install
没有出现错误,已经安装到了/etc/fdfs中,我们看一下该目录下的文件:
[root@localhost fastdfs-master]# cd /etc/fdfs/
[root@localhost fdfs]# ll
我们需要把这三个示例文件复制一份,去掉.sample。
[root@localhost fdfs]# cp client.conf.sample client.conf
[root@localhost fdfs]# cp storage.conf.sample storage.conf
[root@localhost fdfs]# cp tracker.conf.sample tracker.conf
之后再查看一下/etc/fdfs的文件目录:
至此FastDFS已经安装完毕,接下来的工作就是依次配置Tracker和Storage了。
1.3安装tracker
1.3.1创建tracker工作目录
在配置Tracker之前,首先需要创建Tracker服务器的文件路径,即用于存储Tracker的数据文件和日志文件等,我这里选择在/opt目录下创建一个fastdfs/tracker目录用于存放Tracker服务器的相关文件:
[root@localhost ~]# mkdir /opt/fastdfs
[root@localhost ~]# mkdir /opt/fastdfs/tracker
1.3.2配置tracker
[root@localhost ~]# cd /etc/fdfs/
[root@localhost fdfs]# vi tracker.conf
打开后重点关注下面4个配置:
1.disabled=false #启用配置文件(默认启用)
2.port=22122 #设置tracker的端口号,通常采用22122这个默认端口
3.base_path=/opt/fastdfs/tracker #设置tracker的数据文件和日志目录
4.http.server_port=6666 #设置http端口号,默认为8080
1.3.3启动tracker
保存配置后启动tracker,命令如下:
[root@localhost ~]# service fdfs_trackerd start
如果不能启动,或提示用systemctl可改用命令:
[root@localhost ~]# systemctl start fdfs_trackerd
进行刚刚创建的tracker目录,发现目录中多了data和log两个目录,可以查看日志是否正常启动
[root@localhost ~]# cd /opt/fastdfs/tracker/
[root@localhost tracker]# ls
[root@localhost tracker]# cd logs
[root@localhost logs]# tail -f trackerd.log
tracker服务的端口也应当被正常监听,最后再通过netstat命令查看一下端口监听情况:
[root@localhost logs]# netstat -unltp|grep fdfs
端口22122成功监听。
确认tracker正常启动后可以将tracker设置为开机启动,打开/etc/rc.d/rc.local并在其中加入以下配置:
[root@localhost logs]# vi /etc/rc.d/rc.local
增加一行命令 service fdfs_trackerd start
Tracker至此就配置好了。
1.4 安装storage
1.4.1 为storage配置工作目录
步骤基本与配置Tracker一致,首先是创建Storage服务器的文件目录,需要注意的是同Tracker相比我多建了一个目录,因为Storage还需要一个文件存储路径,用于存放接收的文件:
[root@bogon fastdfs]# mkdir /opt/fastdfs/storage
[root@bogon fastdfs]# mkdir /opt/fastdfs/storage_data
查看一下目录
1.4.2 修改storage配置文件
接下来修改/etc/fdfs目录下的storage.conf配置文件
[root@bogon fastdfs]# cd /etc/fdfs/
[root@bogon fdfs]# vi storage.conf
1.disabled=false #启用配置文件(默认启用)
2.group_name=group1 #组名,根据实际情况修改
3.port=23000 #设置storage的端口号,默认是23000,同一个组的storage端口号必须一致
4.base_path=/opt/fastdfs/storage #设置storage数据文件和日志目录
5.store_path_count=1 #存储路径个数,需要和store_path个数匹配
6.store_path0=/opt/fastdfs/storage_data #实际文件存储路径
7.tracker_server=192.168.242.131:22122 #tracker 服务器的 IP地址和端口号,如果是单机搭建,IP不要写127.0.0.1,否则启动不成功(此处的ip是我的CentOS虚拟机ip)
8.http.server_port=8888 #设置 http 端口号
修改保存后创建软引用
[root@bogon fdfs]# ln -s /usr/bin/fdfs_storaged /usr/local/bin
1.4.3 启动storage
[root@bogon fdfs]# service fdfs_storaged start
如果不能启动,或提示用systemctl可改用命令:
[root@bogon fdfs]# systemctl startfdfs_storaged
成功后应该可以看到:
如果启动成功,/opt/fastdfs/storage中就可以看到启动后新生成的data和logs目录,端口23000也应被正常监听,还有一点就是文件存储路径下会生成多级存储目录,那么接下来看看是否启动成功了
[root@bogon fdfs]# cd /opt/fastdfs/storage
[root@bogon logs]# netstat -unltp|grep fdfs
查看一下我们的启动日志:
[root@bogon fdfs]# cd /opt/fastdfs/storage
[root@bogon storage]# cd logs/
[root@bogon logs]# tail -f storaged.log
启动完成后,可以看到我们storaged_data目录下创建了很多级目录
同样的,设置开机启动:
[root@bogon data]# vi /etc/rc.d/rc.local
服务已正常启动。
1.4.4 校验整合
fastdfs的东西都已安装完成,最后我们还要确定一下,storage是否注册到了tracker中去。
[root@bogon data]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
1.5测试
1.5.1 配置客户端
修改客户端的配置文件:
[root@bogon opt]# vi /etc/fdfs/client.conf
设置如下:
1.base_path=/usr/yong.cao/dev/fastdfs/fastdfs_tracker #tracker服务器文件路径
2.tracker_server=192.168.242.131:22122 #tracker服务器IP地址和端口号
3.http.tracker_server_port=6666 # tracker 服务器的 http端口号,必须和tracker的设置对应起来
通过ftp上传图片到CentOS:
最后可以看到图片存在我们的/home/ftp目录上
(ps:也可以使用其他方式把图片放在centos 7 文件目录下,如xftp)
1.5.2 模拟上传
确定图片位置后,我们输入上传图片命令:
[root@bogon ftp]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/ftp/joker.jpg
#这后面放的是图片的位置(找了我刚才上传的图片)
成功后会返回图片的路径:group1/M00/00/00/wKjyg1pgmOCAQ8BUAABdKP1lcio473.jpg
组名:group1
磁盘:M00
目录:00/00
文件名称:wKjyg1pgmOCAQ8BUAABdKP1lcio473.jpg
我们上传的图片会被上传到我们创建的storage_data目录下,让我们去看看:
[root@bogon storage_data]# cd /opt/fastdfs/storage_data/data/
通过刚刚返回的路径,我们成功找到了图片。
实际文件存储路径下有创建好的多级目录。data下有256个1级目录,每级目录下又有256个2级子目录,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
1.5.3 HTTP访问文件
去官网查看了一下原码,在HISTORY中发现,原来早在4.05的时候,就remove embed HTTP support,
所以现在不能用HTTP方式访问文件.。
1.5.4 HTTP请求不能访问文件的原因
我们在使用FastDFS部署一个分布式文件系统的时候,通过FastDFS的客户端API来进行文件的上传、下载、删除等操作。同时通过FastDFS的HTTP服务器来提供HTTP服务。但是FastDFS的HTTP服务较为简单,无法提供负载均衡等高性能的服务,所以FastDFS的开发者——淘宝的架构师余庆同学,为我们提供了Nginx上使用的FastDFS模块(也可以叫FastDFS的Nginx模块)。
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题.假设Tracker服务器将文件上传到了192.168.128.131,文件ID已经返回客户端,这时,后台会将这个文件复制到192.168.128.131,如果复制没有完成,客户端就用这个ID在192.168.128.131取文件,肯定会出现错误。这个fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。
正是这样,FastDFS需要结合nginx,所以取消原来对HTTP的直接支持。
1.6 FastDFS的nginx模块安装
1.6.1 安装nginx
安装需要的工具,之前就已经放到了/home/ftp:
[root@bogon 00]# cd /home/ftp
在安装nginx之前要安装nginx所需的依赖lib:
[root@bogon ftp]# yum -y install pcre pcre-devel
[root@bogon ftp]# yum -y install zlib zlib-devel
[root@bogon ftp]# yum -y install openssl openssl-devel
1.6.2 安装nginx并添加fastdfs-nginx-module
进入到/home/ftp目录,解压我们上传的nginx和fastdfs-nginx-module:
[root@bogon ftp]# cd /home/ftp
[root@bogon ftp]# tar -zxvf nginx-1.13.6.tar.gz
[root@bogon ftp]# unzip fastdfs-nginx-module-master.zip
解压后进入nginx目录编译安装nginx,并添加fastdfs-nginx-module:
[root@bogon src]# cd /home/ftp/nginx-1.13.6
[root@bogon nginx-1.13.6]# ./configure --prefix=/usr/local/nginx --add-module=/home/ftp/fastdfs-nginx-module-master/src #解压后fastdfs-nginx-module所在的位置
配置成功后会看到如下信息:
紧接着就可以进行编译安装了,依次执行以下命令:
[root@bogon nginx-1.13.6]# make
如果你走到make这一步的时候只出现了一行“make[1]: Leaving directory `/home/ftp/nginx-1.13.6';”提示,不用管它,继续走make install ;
[root@bogon nginx-1.13.6]# make install
nginx的默认目录是/usr/local/nginx,安装成功后查看
1.6.3 配置storage nginx
进入到/usr/local/nginx/目录下,修改nginx.conf:
[root@bogon nginx]# cd conf
[root@bogon conf]# vi nginx.conf
修改监听端口 listen 9999, 新增location
listen 9999;
location ~/group1/M00 {
root /opt/fastdfs/storage_data/data;
ngx_fastdfs_module;
}
然后进入FastDFS的安装目录/home/ftp/fastdfs-master/目录下的conf目录,将http.conf和mime.types拷贝到/etc/fdfs目录下:
[root@bogon conf]# cd /home/ftp/fastdfs-master/conf
[root@bogon conf]# cp http.conf /etc/fdfs/
[root@bogon conf]# cp mime.types /etc/fdfs/
另外还需要把/home/ftp/fastdfs-nginx-module安装目录中src目录下的mod_fastdfs.conf也拷贝到/etc/fdfs目录下:
[root@bogon src]# cd /home/ftp/fastdfs-nginx-module-master/src
[root@bogon src]# cp mod_fastdfs.conf /etc/fdfs/
对刚刚拷贝的/etc/fdfs/ 目录下的mod_fastdfs.conf文件进行修改:
[root@bogon src]# vi /etc/fdfs/mod_fastdfs.conf
1.base_path=/opt/fastdfs/storage #保存日志目录
2.tracker_server=192.168.242.131:22122 #tracker服务器的IP地址以及端口号
3.storage_server_port=23000 #storage服务器的端口号
4.url_have_group_name = true #文件 url 中是否有 group 名
5.store_path0=/opt/fastdfs/storage_data #存储路径
6.group_count = 3 #设置组的个数,事实上这次只使用了group1
设置了group_count = 3,接下来就需要在文件尾部追加这3个group setting:
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs/storage_data
#store_path1=/home/yuqing/fastdfs1
# group settings for group #2
# since v1.14
# when support multi-group, uncomment following section as neccessary
[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
创建M00至storage存储目录的符号连接:
[root@bogon ~]# ln -s /opt/fastdfs/storage_data/data /opt/fastdfs/storage_data/data/M00
启动nginx:
[root@bogon ~]# /usr/local/nginx/sbin/nginx
centos 7开放9999端口
#开启端口
[root@bogon ~]# firewall-cmd --zone=public --add-port=9999/tcp --permanent
命令含义:
--zone #作用域
--add-port=9999/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
#使其生效
[root@bogon ~]# firewall-cmd --reload
#重启防火墙
[root@bogon ~]# systemctl restart firewalld.service
通过浏览器也可以看到nginx的主页: http://192.168.242.131:9999/ (ps:这是我虚拟机的地址)
storage的nginx已配置成功。接下来,我们还要继续配置tracker的nginx。
1.7 配置tracker nginx
1.7.1 再解压一个 nignx
我在我自己的/home/ftp目录下再建了一个nginx-1.13.7,把原来的nginx-1.13.6.tar.gz又解压了一份到里面
[root@bogon ftp]# mkdir /home/ftp/nginx-1.13.7
[root@bogon ftp]# tar -zxvf nginx-1.13.6.tar.gz -C /home/ftp/nginx-1.13.7
nginx-1.13.7里面就有一份nginx-1.13.6文件
进入新解压nignx目录下配置:
[root@bogon nginx-1.13.7]# cd /home/ftp/nginx-1.13.7/nginx-1.13.6/
[root@bogon nginx-1.13.6]# ./configure --prefix=/usr/local/nginx2 --add-module=/home/ftp/fastdfs-nginx-module-master/src #解压后fastdfs-nginx-module所在的位置
执行完后,将生成一个nignx2文件在/usr/local目录下
在刚才/home/ftp/nginx-1.13.7/nginx-1.13.6 目录下进行编译:
[root@bogon nginx-1.13.6]# make
[root@bogon nginx-1.13.6]# make install
接下来,一样的还是修改nginx.conf,端口号可以不改,用80的。需将upstream指向tracker的nginx地址。
[root@bogon local]# vi /usr/local/nginx2/conf/nginx.conf
#新增
upstream fdfs_group1 {
server 127.0.0.1:9999;
}
#新增
location /group1/M00 {
proxy_pass http://fdfs_group1;
}
启动nginx:
[root@bogon sbin]# /usr/local/nginx2/sbin/nginx
centos 7开放80端口
#开启端口
[root@bogon ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
#使其生效
[root@bogon ~]# firewall-cmd --reload
#重启防火墙
[root@bogon ~]# systemctl restart firewalld.service
访问nginx2的 80端口:
通过客户端命令测试上传:
[root@bogon sbin]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/ftp/joker.jpg
然后再访问刚刚上传的文件:http://192.168.242.131/group1/M00/00/00/wKjyg1phId-AU4u-AABdKP1lcio193.jpg
至此关于单机版的FastDFS在CentOS 7下的部署测试就已经全部完成了。
后面我会写一下搭建集群FastDFS。
下一篇:搭建FastDFS集群专题