项目中用到了FastDFS来做文件存储。最近重构的时候,因为经常处于移动办公的状态,所以访问公司的服务器不是很方便,所以感觉有必要在本机上搭建一套FastDFS的测试环境。
FastDFS是什么?
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 FastDFS里面有两种角色:Tracker、Storage。Tracker主要做调度工作,在访问上起负载均衡的作用。Storage存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value pair)方式表示,如:width=1024,其中的key为width,value为1024。文件meta data是文件属性列表,可以包含多个键值对。
1. Docker方式
因为之前用Docker用的比较多,所以首先想到的是用Docker来运行FastDFS。上hub.docker.io
上找了找镜像,最后选择了luhuiguo/fastdfs
这个镜像。很快写了一个docker-compose脚本:
1version: '3.3'
2services:
3 tracker:
4 image: luhuiguo/fastdfs
5 ports:
6 - "22122:22122"
7 command:
8 - tracker
9 volumes:
10 # let container use same timezone as host
11 - /etc/localtime:/etc/localtime
12 - /opt/docker/fastdfs/tracker:/var/fdfs
13 storage:
14 image: luhuiguo/fastdfs
15 ports:
16 - "23000:23000"
17 links:
18 - tracker
19 command:
20 - storage
21 environment:
22 TRACKER_SERVER: 192.168.255.199:22122
23 GROUP_NAME: group1
24 volumes:
25 - /etc/localtime:/etc/localtime
26 - /opt/docker/fastdfs/storage:/var/fdfs
执行起来,看起来也是正常的。但是使用程序访问的时候却失败了。抛出了异常:java.net.SocketTimeoutException: connect timed out
。通过跟踪代码发现了原因:使用docker的时候,storage向tracker汇报的地址是docker内部的地址,而这个地址在Mac本机是无法直接访问的。通过代码访问Tracker的时候返回的地址就是docker内部的地址,自然会出现SocketTimeoutException了。
1.1 network host模式
因为知道docker有host这一网络模式,可以使docker容器使用与宿主机一样的网络。感觉上这样或许可以解决上面的问题,而且镜像的说明中也提到了这一点。于是加上了network_mode: host
。但是启动之后发现还是一样的错误。经过搜索找到了原因:
**Mac上的Docker实际上是通过虚拟化方式运行在Mac系统上的。通过xhyve
技术模拟出来一台Linux主机,然后在其中跑Docker进程。当使用host
模式跑的时候,docker使用的是这个虚拟出来的Linux主机的网络作为Host网络,无法直接使用Mac主机的网络。因此依然无法连接是正常的。**也就是说,在Mac主机上,host这种网络是无法使用的。
2. 本机编译执行
既然使用Docker无法运行FastDFS,那只能通过编译源码来运行了。最新版本的FastDFS已经可以直接在Mac上编译了(不需要修改源码)。因此这种方法也不难。主要步骤如下:
2.0 关闭系统保护
从OSX 10.11开始,Mac对关键目录进行了保护(例如:/bin, /usr/bin等)。而要编译FastDFS却是要安装文件到/usr/bin
等目录下,所以首先需要禁用系统保护。关闭的方法如下:
- 重启系统,重启的过程中按住
Command+R
进入Recovery模式; - 从菜单中选择“终端”或“Terminal”进入命令行模式;
- 输入命令
csrutil disable
关闭保护模式,然后输入reboot
重启系统即可。
2.1 libfastcommon
FastDFS依赖于libfastcommon,因此需要首先编译、安装libfastcommon,步骤如下:
1unzip libfastcommon-1.0.35.zip
2cd libfastcommon-1.0.35
3./make.sh
4./make.sh install
2.2 fastdfs
FastDFS源码通过Github下载。下面以最新的5.10为例。编译、安装步骤如下:
1unzip fastdfs-5.10.zip
2cd fastdfs-5.10
3./make.sh
4./make.sh install
安装成功后,FastDFS相关的可执行文件被安装到/usr/bin
目录下。相关的配置文件被放在/etc/fdfs
下,这和在Linux上安装的结果是一样的。
2.3 启动tracker
下面首先启动Tracker服务。首先准备存储数据的目录,Tracker将会在该目录中保存运行时信息以及日志文件:
1mkdir -p /opt/tools/fastdfs/tracker
2chown -R cap:cap /opt/tools/fastdfs/tracker
然后准备配置文件,从sample文件复制一份以便修改:
1cd /etc/fdfs
2cp tracker.conf.sample tracker.conf
然后修改配置文件/etc/fdfs/tracker.conf
,在Mac上单机安装只需要修改base_path
,修改成上面刚刚创建的目录:
1base_path=/opt/tools/fastdfs/tracker
然后启动fastdfs,启动完成之后应该占用了22122端口:
1/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
2netstat -nl | grep 22122
启动服务使用如下命令:
1/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
停止服务可以使用如下命令:
1/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
2.4 启动storage
首先还是准备目录供Storage节点使用:
1mkdir -p /opt/tools/fastdfs/storage
2chown -R cap:cap /opt/tools/fastdfs/storage
准备配置文件:
1cp storage.conf.sample storage.conf
修改配置文件:
1# 基本路径,日志等存储在该目录下
2base_path=/opt/tools/fastdfs/storage
3# 存储目录,可以存在多个。FastDFS会按照调度方法使用这些不同的目录。默认使用Round Robin调度方法。
4store_path0=/opt/tools/fastdfs/storage
5# 如果部署集群的话,只要多写几个tracker_server就可以了。
6tracker_server=192.168.255.199:22122
启动服务可以使用如下命令:
1/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
停止服务命令:
1/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop