在Mac上如何安装FastDFS

项目中用到了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脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.3'
services:
tracker:
image: luhuiguo/fastdfs
ports:
- "22122:22122"
command:
- tracker
volumes:
# let container use same timezone as host
- /etc/localtime:/etc/localtime
- /opt/docker/fastdfs/tracker:/var/fdfs
storage:
image: luhuiguo/fastdfs
ports:
- "23000:23000"
links:
- tracker
command:
- storage
environment:
TRACKER_SERVER: 192.168.255.199:22122
GROUP_NAME: group1
volumes:
- /etc/localtime:/etc/localtime
- /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,步骤如下:

1
2
3
4
unzip libfastcommon-1.0.35.zip
cd libfastcommon-1.0.35
./make.sh
./make.sh install

2.2 fastdfs

FastDFS源码通过Github下载。下面以最新的5.10为例。编译、安装步骤如下:

1
2
3
4
unzip fastdfs-5.10.zip
cd fastdfs-5.10
./make.sh
./make.sh install

安装成功后,FastDFS相关的可执行文件被安装到/usr/bin目录下。相关的配置文件被放在/etc/fdfs下,这和在Linux上安装的结果是一样的。

2.3 启动tracker

下面首先启动Tracker服务。首先准备存储数据的目录,Tracker将会在该目录中保存运行时信息以及日志文件:

1
2
mkdir -p /opt/tools/fastdfs/tracker
chown -R cap:cap /opt/tools/fastdfs/tracker

然后准备配置文件,从sample文件复制一份以便修改:

1
2
cd /etc/fdfs
cp tracker.conf.sample tracker.conf

然后修改配置文件/etc/fdfs/tracker.conf,在Mac上单机安装只需要修改base_path,修改成上面刚刚创建的目录:

1
base_path=/opt/tools/fastdfs/tracker

然后启动fastdfs,启动完成之后应该占用了22122端口:

1
2
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
netstat -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节点使用:

1
2
mkdir -p /opt/tools/fastdfs/storage
chown -R cap:cap /opt/tools/fastdfs/storage

准备配置文件:

1
cp storage.conf.sample storage.conf

修改配置文件:

1
2
3
4
5
6
# 基本路径,日志等存储在该目录下
base_path=/opt/tools/fastdfs/storage
# 存储目录,可以存在多个。FastDFS会按照调度方法使用这些不同的目录。默认使用Round Robin调度方法。
store_path0=/opt/tools/fastdfs/storage
# 如果部署集群的话,只要多写几个tracker_server就可以了。
tracker_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

附录A. 参考资料

热评文章