1、背景
FastDFS 是一款开源的、分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发。该开源项目的主页是 http://code.google.com/p/fastdfs 。可以通过 fastdfs.sourceforge.net 下载。FastDFS论坛是 http://www.csource.org ,目前是指向 ChinaUnix 开源项目孵化平台的一个板块 FastDFS,网址为 bbs.chinaunix.net/forum-240-1.html 。(摘自 http://blog.csdn.net/poechant/article/details/6977407)
2、上传流程
我们可以通过 FastDFS 对文件的上传过程,来初步了解 FastDFS 的基本架构。首先客户端 client 发起对 FastDFS 的文件传输动作,是通过连接到某一台 Tracker Server 的指定端口来实现的,Tracker Server 根据目前已掌握的信息,来决定选择哪一台 Storage Server ,然后将这个Storage Server 的地址等信息返回给 client,然后 client 再通过这些信息连接到这台 Storage Server,将要上传的文件传送到给 Storage Server上。
上传流程简述:
- 1、client询问tracker上传到的storage,不需要附加参数;
- 2、tracker返回一台可用的storage;
- 3、client直接和storage通讯完成文件上传。
下载流程简述:
- 1、client询问tracker下载文件的storage,参数为文件标识(组名和文件名);
- 2、tracker返回一台可用的storage;
- 3、client直接和storage通讯完成文件下载。
3、架构简析
FastDFS 是包括一组 Tracker Server 和 Storage Server 的。Tracker Server 与 Storage Server 之间不直接通信,其基本的信息由配置文件在系统启动加载时获知。多台 Tracker Server 之间保证了 Tracker 的分布式,Tracker Server 之间是对等的,防止了单点故障。 Storage Server 是分成多个 Group,每个 Group 中的Storage 都是互相备份的,也就是说,如果 Group1 有 Storage1、Storage2、Storage3,其容量分别是100GB、100GB、100GB,那么 Group1 的存储能力是 100GB,而不是 300GB,这就是互相备份的意思。进一步说,整个 Group 的存储能力由该组中该储能力最小的 Storage 决定。多个 Group 之间的存储方式,可以采用 round robin(轮训)、load balanced(负载均衡)或指定 Group 的方式。
术语
FastDFS两个主要的角色:Tracker Server 和 Storage Server
Tracker Server:跟踪服务器,主要负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽。
Storage Server:存储服务器,保存文件和文件的meta data(元数据)
Group:文件组,也可以称为卷。同组内服务器上的文件是完全相同的,做集群时往往一个组会有多台服务器,上传一个文件到同组内的一台机器上后,FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。
meta data:文件相关属性,键值对(Key Value Pair)方式,如:width=1024, height=768。和阿里云OSS的meta data相似。
5、安装环境准备
提示:本例安装目标为:一台虚拟机(centos 7)安装部署一个 tracker 和一个组 group1(其中包含两个 storage)
linux 基础环境:centos 7 minimal(官方历史版本:http://vault.centos.org/)
相关源码包(此处省略通过 ftp 传送源码包,有兴趣的可移步至:)
- fastdfs-nginx-module_v1.16.tar.gz (nginx 依赖包https://sourceforge.net/projects/fastdfs/files/FastDFS%20Nginx%20Module%20Source%20Code/)
- FastDFS_v5.05.tar.gz (本例使用5.05版本,官方历史版本:https://sourceforge.net/p/fastdfs/activity?source=project_activity)
- libfastcommonV1.0.7.tar.gz(FastDFS依赖包,官方下载地址:https://sourceforge.net/projects/fastdfs/files/FastDFS%20Nginx%20Module%20Source%20Code/)
- nginx-1.7.8.tar.gz
- ngx_cache_purge-2.1.tar.gz (nginx 图片缓存,http://labs.frickle.com/nginx_ngx_cache_purge/)
- perl-5.20.2.tar.gz(因为从 linux 系统直接下载网速太慢,所以提前准备,上传到 linux 再安装,官方历史版本下载地址:http://www.cpan.org/src/ 吐嘈一下 cnds 上的选手,源码又不是你开发的,你挂就挂吧,下载还还要积分,呵呵。)
linux 中需要事先准备相关程序(linux 联网直接安装)
yum -y install gcc (必须在最开始的环境里就已经安装了,否则上面的源码包安装过程会出错)
yum -y install gcc-c++(必须在最开始的环境里就已经安装了,否则上面的源码包安装过程会出错)
yum -y install vim (可选择,文本编辑器)
perl-5.20.2
nginx 负载均衡环境部署先的依赖程序准备
- yum install gcc-c++
- yum install -y pcre pcre-devel
- yum install -y zlib zlib-devel
- yum install -y openssl openssl-devel
6、文件夹初始化
创建 tracker 所需的文件夹 base_path:mkdir /opt/fastdfs_tracker
创建 storage所需的日志目录:mkdir /opt/fastdfs_storage_info (这个目录是用来记录 storage 同步文件的日志)
创建 storage 存储所需的文件目录:mkdir /opt/fastdfs_storage_data (此目录存储文件)
7、 安装 libfastcommon-1.0.7
解压:tar -zxvf libfastcommonV1.0.7.tar.gz
进入安装文件夹:cd libfastcommon-1.0.7
依次执行 make 命令:./make.sh 和 ./make.sh install
从安装记录可以看出:安装路径为 /usr/lib64,但是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 (先创建着,后面会使用到)
8、安装 FastDFS-5.0.5
解压 tar 包:tar -zxvf FastDFS_v5.05.tar.gz
进入安装文件夹:cd FastDFS
依次执行 make 命令:./make.sh 和 ./make.sh install
安装过程没有错误提示,再检查 /etc/fdfs 目录中是否含有以下文件,如果有则安装成功:
9、配置 tracker
9.1 进入 /etc/fdfs 文件夹,执行如下命令: cp tracker.conf.sample tracker.conf
9.2 编辑 tracker.conf 文件:vim tracker.conf
9.3 具体配置信息:
a. disabled=false # 启用配置文件
b. port=22122 # 设置 tracker 端口好,一般采用默认端口 22122
c. base_path=/opt/fastdfs_tracker # 设置 tracker 的数据文件和日志目录
d. http.server_port=80 # fastdfs5.0.5版本没有,保险起见,这里设置成 80 端口
其他配置信息保持默认,不用动。
9.4 启动 tracker: /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
检测是否启动成功:
方法1: netstat -unltp|grep fdfs ,看 22122 端口监听情况
方法2: 通过命令查看 tracker 启动日志:tail -100f /opt/fastdfs_tracker/logs/trackerd.log
9.5 如果成功启动 tracker,将启动命令添加到服务器的开机启动配置中:
vim /etc/rc.d/rc.local
在文本中添加这行,并保存:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
10、配置 stroage(和 trcker 配置类似)
10.1 进入 /etc/fdfs 文件夹,执行命令: cp storage.conf.sample storage.conf
10.2 编辑 storage.conf 文件,执行命令: vim storage.conf
10.3 具体配置信息:
a. disabled=false #启用配置文件
b. group_name=group1 #组名,这里本例只配置一组,所以命名为 group1
c. port=23000 #这里设置 storage 端口号,23000是默认端口,同一个组的 storage 端口号必须一致
d. base_path=/opt/fastdfs_storage_info #记录 storage 日志(预先已经创建的文件夹)
e. store_path_count=1 #存储的路径个数,个数需要和 store_path 的个数一致
f. store_path0=/opt/fastdfs_storage_data #存储路径,这里是一个 group1 组配置了两个 storage
store_path1=/opt/fastdfs_storage_data
g. tracker_server=192.168.25.131:22122 # tracker 服务器的 ip 和端口号,本 ip 是本 linux的 ip
h. http.server_port=80 # 设置 http 端口号,fastdfs-5.0.5 这个版本已经不用配置,保险起见,就配置一下吧
10.4 启动 tracker:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
检测是否启动成功:
方法1: netstat -unltp|grep fdfs ,看 23000 端口监听情况(配置的是 什么端口就监听哪个端口)
方法2: 通过命令查看 tracker 启动日志:tail -100f /opt/fastdfs_storage_info/logs/storage.log
启动成功之后,可以通过 fdfs_monitor 查看集群情况:stroage 是否已经注册到服务器中:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf # 查看192.168.25.131:23000 是 “ ACTIVE ”状态即可
10.5 启动没有问题,则将 stroage 启动命令配置到服务器启动项里: vim /etc/rc.d/rc.local
添加这行命令,并保存: /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
===================================分割线====================================
以上安装配置步骤就是 fastdfs 的配置。
storage 中安装 nginx 目的是为了提供 http 的访问服务,同时解决 group 和 storage 同步延迟问题,
tracker 中安装 nginx 目的是为了提供 http 访问的反向代理、负载均衡及缓存服务。
===================================分割线====================================
11、nginx 安装前的环境准备
yum install -y gcc # 前面步骤已安装,略过
yum install -y gcc-c++ # 前面步骤已安装,略过
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
12、 在 storage 中安装 nginx
12.1 创建 nginx 默认安装文件夹: mkdir /usr/local/nginx
12.2 解压 tar 包:
tar -zxvf nginx1.7.8.tar.gz # 得到 nginx-1.7.8 文件目录
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz # 得到 fastdfs-nginx-module 文件目录
12.3 修改 fastdfs-nginx-module 文件目录中的 config 文件:
cd /fastdfs-nginx-module/src
vim config
将 CORE_INCS中 的参数路径修改一下,local 全部不要: CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
12.4 建立软连接,在第七步骤中已经创建,可略过:
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so (第七步骤中已经创建,可略过)
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so (第七步骤中已经创建,可略过)
12.5 进入nginx 安装文件夹:cd nginx-1.7.8
执行命令:./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src
备注:执行命令中的 add-module 参数为 fastdfs-nginx-module 文件目录路径,这里是 /usr/local/src 目录下的。
命令执行完毕之后,依次执行 make 和 make install,没有错误提示表示安装成功。
12.6 执行命令 cd /usr/local/nginx/conf, 编辑 vim nginx.conf 文件:
在 http 语句块中将 listen 修改成:listen 80;
在 server 语句块中添加:
location /group1/M00 {
root/fdfs/storage/data;
ngx_fastdfs_module;
}
注意:这里 group 组名是上面配置的 group1,要和第 10 步骤的 10.3 步骤中的配置组信息一致
如果 nginx 成功启动,浏览器不能访问,就在 nginx.conf 这个配置文件中,把第一行的注解打开,配置成:user root; 即可。
12.7 执行命令:cd /usr/local/rsrc/FastDFS/conf ,将 conf 文件夹目录下的 http.conf 和 mime.types 复制到 /etc/fdfs/ 下,
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/
如果不执行这个操作,启动 nginx 会报异常
12.8 执行命令:cd/usr/local/rsrc/fastdfs-nginx-module/src
将 conf 文件夹下的 mod_fastdfs.conf 文件复制到 /etc/fdfs/下:cp mod_fastdfs.conf /etc/fdfs/
12.9 在 /etc/fdfs/ 文件目录下,打开编辑:vim mod_fastdfs.conf
a. base_path=/opt/fastdfs_storage_info # 保存日志目录
b. tracker_server=192.168.25.131:22122 # tracker的ip和端口
c. storage_server_port=23000 # storage服务器的端口号
d. group_name=group1 #当前服务器的 group名称
e. url_have_group_name= true # 文件 url中是否有 group名称
f. store_path_count=2 #存储路径个数,必须和 下面的store_path个数一致
g. store_path0=/opt/fastdfs_storage_data #文件存储路径
store_path1=/opt/fastdfs_storage_data #本例设置了两个stroage,和第 10 步骤的 10.3 步骤配置一致
h. http.need_find_content_type=true #从文件扩展名查找文件类型,这个配置 fastdfs-5.0.5没有,保险起见,还是配置吧
i. group_count= 1 # 设置组的个数 这里设置了一个组 group1 所以配置为 1
j. 在配置信息的最后,将注解的 group 信息展开,这里设置的是一个组,所以只配置一个:
注意组的名称 端口 存储路径个数 和存储路径
12.10 创建软连接: ln -s /opt/fastdfs_storage_data/data /opt/fastdfs_storage_data/data/M00
12.11 启动 nginx:/usr/local/nginx/sbin/nginx
提示:/usr/local/nginx/sbin/nginx -s stop # 停止nginx
检查是否启动成功:netstat -anp | grep 80,如果有宽口冲突,也可以检测到,kill -9 对应的pid 即可。
启动成功只会提示一个 pid,需要自己通过浏览器验证。
常见问题:
如果上面配置都完整无误,浏览器还是无法访问,则可以 ping 一下网络,再 telnet 一下端口,很有可能是防火墙的问题:
添加开放端口 firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
删除开放端口 firewall-cmd --zone=public --remove-port=80/tcp --permanent
添加或者删除开放端口之后需要更新防火墙规则: firewall-cmd --reload
查看所有打开的端口: firewall-cmd --zone=public --list-ports 或者 firewall-cmd --list-services
显示防火墙状态是否运行:firewall-cmd --state 或者 systemctl status firewalld.service
用了一天时间,折腾好几次,又是重装系统又是查资料的,感觉能这么细致的讲解的真不多,于是就想把这个心得写下来,让读者们少走坑。
通过 java 代码测试一番,成功!
13、tracker 中安装 nginx
待续…