@Mr-13
2020-10-17T09:23:42.000000Z
字数 12936
阅读 427
工作手机
FastDFS 是一个开源的高性能分布式文件系统(Distributed File System,DFS)。由C语言编写 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)
、存储服务器(Storage Server)
和 客户端(Client)
- Tracker Server:
跟踪服务器,主要做调度工作,起到均衡的作用;在内存中记录集群中所有存储服务器(storage server)和存储组(group)的状态信息, 是客户端和数据服务器交互的枢纽。 相比GFS中的master更为精简, 不记录文件索引信息, 占用的内存量很少。
每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。并且里面所有的Tracker都是对等的(每个节点地位相等),很容易扩展。
客户端访问集群的时候会随机分配一个Tracker来和客户端交互。
- Storage Server:
存储服务器(又称:存储节点或数据服务器),主要提供容量和备份服务,文件和文件属性( meta data) 都保存在存储服务器上;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
实际存储数据,分成若干个组(group),实际traker就是管理的storage中的组,group可以隔离不同应用的数据,不同的应用的数据放在不同group里面- group:
组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server所存储的内容是完全一样的, 文件上传、 删除等操作可以在任意一台storage server上进行 。- meta data:
meta data:文件相关属性,键值对( Key-Value) 方式,如:width=1024、heigth=768 。
- Client:客户端:
上传下载数据的服务器,也就是我们自己的项目所部署在的服务器;每个客户端服务器都需要安装Nginx。
.
为了支持大容量,存储节点(storange server)
采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
.
FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。
当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
文件存储(下载地址)路径格式:
192.168.1.177安装fastdfs的tracker节点,以及nginx反向代理服务器用于下载服务。
192.168.1.188,192.168.1.189安装fastdfs的storage节点,默认分一组,一组内两台机器互为备份.
注意: 为了做到高可用,一个group建议分为两台以上的机器。
单台服务器最小化部署
集群部署
.
# root用户下操作
[root@mr13 ~]# yum install -y gcc readline-devel zlib-devel libcurl-devel wget lrzsz vim
.
libfastcommon是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库,基础环境,安装即可。
# root用户下操作
# 创建软件包存放目录
[root@mr13 ~]# mkdir -p /server/tools
[root@mr13 ~]# cd /server/tools
# 下载libfastcommon
[root@mr13 tools]# wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
# 解压包并进入解压目录
[root@mr13 tools]# tar -xzvf V1.0.7.tar.gz
[root@mr13 tools]# cd libfastcommon-1.0.7
# 编译、安装libfastcommon
[root@mr13 tools]# ./make.sh
[root@mr13 tools]# ./make.sh install
.
上图是 ./make install
安装过程截图,可以看到,安装过程中,创建了(其实已经存在,安装过程为了避免目录不存在,才执行一下,防止出错):/usr/lib64
、 /usr/include/fastcommon
两个目录,安装的文件都在这两个文件当中。
libfastcommon.so 安装到了/usr/lib64/libfastcommon.so,但是FastDFS主程序设置的lib目录是/usr/local/lib,所以需要创建软链接。
# root用户下操作
# 设置软链接
# libfastcommon
[root@mr13 lib]# ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
[root@mr13 lib]# ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
# fastdfs
[root@mr13 lib]# ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
[root@mr13 lib]# ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
上面的四个软链:
- 前两个是对已经安装的libfastcommon设置的;
- 后两个是对下面要安装的fastdfs提前创建的,其实原始文件还不存在(如下图),可以看到
/usr/lib
、/usr/local/lib
两个路径下,所设置的软链libfdfsclient.so
指向的源文件是不存在的(红底白字闪烁)。
在检查软链设置的时候,这里不用纠结,在下一步完成fastdfs安装之后,相关的文件就会安装好。下一步完成,我们在检查一下。
.
# root用户下操作
# 下载FasrDFS
[root@mr13 tools]# wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
# 解压并进入目录
[root@mr13 tools]# tar -xzvf V5.05.tar.gz
[root@mr13 tools]# cd fastdfs-5.05
# 编译、安装
[root@mr13 fastdfs-5.05]# ./make.sh
[root@mr13 fastdfs-5.05]# ./make.sh install
上图是安装fastdfs过程的打印截图,可以看到 /usr/lib64/libfdfsclient.so
文件已经在安装过程中创建,所以上一步中,我们所设置的软链就不存在问题了。
我们重新看一下,所设置的软链状态(如下图),没啥毛病了,继续
.
上述过程安装好之后,相应的文件目录如下:
A、服务脚本:
/etc/init.d/fdfs_storaged
/etc/init.d/fdfs_tracker
B、配置文件:
/etc/fdfs/client.conf.sample
/etc/fdfs/storage.conf.sample
/etc/fdfs/tracker.conf.sample
C、命令工具在
/usr/bin
目录下:
fdfs_trackerd
fdfs_storaged
fdfs_append_file
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_upload_appender
fdfs_upload_file
fdfs_monitor
fdfs_appender_test
fdfs_appender_test1
stop.sh
restart.sh
......
...
重点:
上面 A 中,服务脚本中所设置的bin目录是 /usr/local/bin
,但是实际的命令都安装在 C 中,如下图:
如果,在tracker配置完成后,这里不做任何处理,直接启动tracker,会报 /usr/local/bin/
目录找不到启动文件的错误,如下图:
两种解决方式:
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/fdfs_storaged /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
.
当前我们私有化部署,采用单击最小化部署,tracker
和 storage
都部署在一台服务器上;如果涉及到集群式部署,就需要根据实际的项目结构需要,把服务分开部署了;
但无论 tracker 还是 storage 都需要执行上述1~5的fastdfs安装步骤。
安装完fastdfs之后,在 /etc/fdfs
目录下,自带了 client
、tracker
、storage
三个配置文件的模板,均以 .sample
后缀结尾,如下图:
配置tracker时,我们需要修改tracker、client两个配置文件;一般会重命名,去掉 .sample
后缀,直接修改原始配置文件。
这里我们保留原始配置文件不动,重新复制并重命名配置文件进行相关配置;避免因为错误设置导致原始配置文件丢失,造成的尴尬
# root用户下操作
# 复制并重命名配置文件
[root@mr13 fdfs]# cp client.conf.sample client.conf
[root@mr13 fdfs]# cp tracker.conf.sample tracker.conf
修改
tracker.conf
配置如下:
# root用户下操作
# 配置文件内容较长,可在vim下,通过 “/配置节名称”的方式搜索并更改配置文件;通过按键N,查找下一个匹配项
[root@mr13 init.d]# cd /etc/fdfs/
[root@mr13 fdfs]# vim tracker.conf
disabled=false # 配置文件是否不生效,false 为生效
port=22122 # 提供服务的端口
base_path=/data/fastdfs/tracker # tracker数据和日志目录地址(指定目录必须存在,子目录会自动创建)
http.server_port=80 # http服务端口
修改
client.conf
配置如下:
# root用户下操作
base_path=/data/fastdfs/client # client数据和日志目录地址(指定目录必须存在,子目录会自动创建)
tracker_server=172.31.116.194:22122 # 填写具体的tracker服务器IP:端口,填写本机内网IP
http.tracker_server_port=80 # tracker 的 http服务端口
配置文件编辑保存后,上面我们所配置的tracker、client的数据目录,我们需要创建一下:
# root用户下执行
[root@mr13 ~]# mkdir -p /data/fastdfs/{tracker,client}
.
# root用户下操作
# 启动tracker
# 命令1、2都可以
# 命令1:
[root@mr13 ~]# /etc/init.d/fdfs_trackerd start
# 命令2:
[root@mr13 ~]# service fdfs_trackerd start
# 停止tracker
# 命令1:
[root@mr13 ~]# /etc/init.d/fdfs_trackerd stop
# 命令2:
[root@mr13 ~]# server fdfs_trackerd stop
# 查看tracker运行状态
[root@mr13 ~]# systemctl status fdfs_trackerd.service # 打印如下图,说明正常运行
tracker初次启动成功后,在 tracker.conf
文件配置节 base_path
我们所指定的 /data/fastdfs/tracker/
目录下创建: data
、logs
两个目录。
.
# root用户下操作
[root@mr13 ~]# netstat -unltp|grep fdfs # 打印如下图,说明22122端口侦听正常
.
# root用户下操作
# 设置开机启动项
[root@mr13 ~]# vim /etc/rc.local
# 在配置文件末尾追加一行,如下图:
/etc/init.d/fdfs_trackerd start
至此,tracker配置完成
当前我们私有化部署,采用单击最小化部署,tracker 和 storage都部署在一台服务器上;如果涉及到集群式部署,就需要根据实际的项目结构需要,把服务分开部署了;
但无论 tracker 还是 storage 都需要执行上述1~5的fastdfs安装步骤。
# root用户下操作
# 复制storag文件并重命名
[root@mr13 data]# cd /etc/fdfs/
[root@mr13 fdfs]# cp storage.conf.sample storage.conf
修改
storage.conf
如下:
# root用户下操作
[root@mr13 ~]# vim /etc/fdfs/storage.conf
disable=false # 配置文件是否不生效,false 为生效
group_name=group1 # 指定此 storage server 所在“组(卷)”
port=23000 # storage server服务端口
heart_beat_interval=30 # 心跳间隔时间,单位为秒(这里是指主动向tracker server发送心跳)
base_path=/data/fastdfs/storage # Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
store_path_count=1 # 存放文件时storage server支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录
# 逐一配置 store_path_count 个路径,索引号基于 0。
# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。
store_path0=/data/fastdfs/file
# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。
# 如果本参数值为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。
subdir_count_per_path=256
# tracker_server 的列表 ,会主动连接 tracker_server
# 有多个 tracker server 时,每个 tracker server 写一行(ip:port)
tracker_server=172.31.116.194:22122
# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。
sync_start_time=00:00
sync_end_time=23:59
http.server_port=80 # http服务端口
配置文件编辑保存后,上面我们所配置的storage数据目录,我们需要创建一下:
# root用户下执行
# 创建storage基础数据目录
# 即:storage.conf 的 base_path 配置节
[root@mr13 ~]# mkdir -p /data/fastdfs/storage
# 创建strore_path0目录
# 即:storage.conf 的 store_path0 配置节
[root@mr13 ~]# mkdir -p /data/fastdfs/file
.
# root用户下操作
# 启动storage
# 命令1、2都可以
# 命令1:
[root@mr13 ~]# /etc/init.d/fdfs_storaged start
# 命令2:
[root@mr13 ~]# server fdfs_storaged start
# 停止storage
# 命令1:
[root@mr13 ~]# /etc/init.d/fdfs_storaged stop
# 命令2:
[root@mr13 ~]# server fdfs_storaged stop
# 查看storage服务运行状态
[root@mr13 ~]# systemctl status fdfs_storaged.service # 打印输出如下,说明正常运行
tracker、srorage都启动成功后,在 storage.conf
文件配置节 base_path
所指定的 /data/fastdfs/storage/
目录下创建: data
、logs
两个目录,记录着 Storage Server 的信息。
在 storage.conf
文件配置节 store_path0
所指定的 /data/fastdfs/file
目录下,创建了 N * N个子目录(N 是在配置节 subdir_count_per_path
所设置)
.
# root用户下操作
[root@mr13 ~]# netstat -unltp|grep fdfs # 打印如下图,说明22122端口侦听正常
从上图可以看到:
tracker的22122端口、storage的23000端都在正常侦听
.
# root用户下操作
# 设置开机启动项
[root@mr13 ~]# vim /etc/rc.local
# 在配置文件末尾追加一行,如下图:
/etc/init.d/fdfs_storaged start
至此,storaged配置完成
# 使用当前storage配置文件启动监控
fdfs_monitor /etc/fdfs/storage.conf
fdfs_monitor文件在安装过程中,被安装到了 /usr/bin
目录下,因为该目录已经被添加到了环境变量中(可使用echo $PATH命令查看当前环境变量),所以可以直接运行该命令。
.
在配置tracker时,我们已经将 client.conf
一起完成配置,如下:
base_path=/data/fastdfs/client # client数据和日志目录地址(指定目录必须存在,子目录会自动创建)
tracker_server=172.31.116.194:22122 # 填写具体的tracker服务器IP:端口,填写本机内网IP
http.tracker_server_port=80 # tracker 的 http服务端口
我在 /data/
目录下放了一张名为:upload_test.jpg
的图片作为测试上传文件,执行以下测试命令:
# root用户下操作
[root@mr13 ~]# fdfs_upload_file /etc/fdfs/client.conf /data/upload_test.jpg
# 返回信息如下:
group1/M00/00/00/rB90wl8n8rqAVGgtAABik-KA2Is954.jpg
对返回信息做一下拆分:
group1
(组名) / M00
(磁盘) / 00/00
(两级子目录) / rB90wl8n8rqAVGgtAABik-KA2Is954.jpg
(文件名)
文件上传测试成功:client -> tracker ->storage 方向,测试通过。
上面将文件上传成功了,但我们无法下载,还需要安装Nginx作为web服务器,以支持http方式访问文件;同时后面安装的fastdfs的nginx模块也需要nginx环境。
Nginx只需要安装到 storage server
所在的服务器即可,用于访问文件。
# root用户下操作
[root@mr13 ~]# yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
.
# root用户下操作
# 进入软件包存放目录
[root@mr13 ~]# cd /server/tools/
# 下载nginx安装包
# 建议提前下载好上传
[root@mr13 tools]# wget http://nginx.org/download/nginx-1.12.2.tar.gz
# 下载fastdfs-nginx-module
[root@mr13 tools]# wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# 解压文件
# unzip阿里云默认是没有安装的可以安装一下
# yum install -y unzip
[root@mr13 tools]# unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# 重命名一下解压缩的文件夹名称
[root@mr13 tools]# mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module-master
.
很多网上的安装步骤是把 Nginx 和 fastdfs-nginx-module 分开安装的,分开安装,需要对nginx重新编译安装,比较麻烦容易出错,这里我们安装的时候,直接带着一起编译安装。
# 解压并进入解压目录
[root@mr13 tools]# tar -zxvf nginx-1.12.2.tar.gz
[root@mr13 tools]# cd nginx-1.12.2
# 配置、编译、安装到指定目录
[root@mr13 nginx-1.12.2]# ./configure --prefix=/data/nginx --with-http_ssl_module --with-http_stub_status_module --with-pcre --add-module=/server/tools/fastdfs-nginx-module-master/src && make && make install
./congigure配置参数说明:
--prefix=/data/nginx
:安装到指定目录 /data/nginx 下;--with-http_ssl_module
:启用https支持;--with-http_stub_status_module
:启用ngx_http_stub_status_module 支持查看nginx的状态页--with-pcre
:启用pcre库--add-module=
:指定外部模块路径,启用对外部模块的支持;这里我们指定的是fastdfs的nginx模块
Nginx编译安装的./configure参数可参考:《nginx编译安装之-./configure》
# root用户下操作
# 进入安装的nginx配置文件目录
[root@mr13 conf]# cd /data/nginx/conf/
# 编辑Nginx.conf配置文件,添加如下行;
location ~/group[0-9]/M0[0-9] {
ngx_fastdfs_module;
}
注意:
listen 80端口
要与/etc/fdfs/stortage.conf中的(前面改成为80了)相对应。如果改成其他端口,则需要统一,同时在防火墙中打开该端口。location的配置,如果有多个group则配置location ~/group([0-9])/M0[0-9];没有则不用配group
.
复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并修改:
# root用户下操作
[root@mr13 ~]# cd /server/tools/fastdfs-nginx-module-master/src/
[root@mr13 src]# cp mod_fastdfs.conf /etc/fdfs/
[root@mr13 /etc/fdfs]# vim mod_fastdfs.conf
# 修改 mod_fastdfs.conf 如下,其他配置默认:
connect_timeout=10 # 连接超时时间(秒)
tracker_server=172.31.116.194:22122 # Tracker Server
storage_server_port=23000 # StorageServer 默认端口
url_have_group_name=true # 如果文件ID的uri中包含/group**,则要设置为true
store_path0=/data/fastdfs/file # Storage 配置的store_path0路径,必须和storage.conf中的一致
复制 FastDFS 的部分配置文件到/etc/fdfs 目录,并修改:
# root用户下操作
[root@mr13 src]# cd /server/tools/fastdfs-5.05/conf
[root@mr13 conf]# cp anti-steal.jpg http.conf mime.types /etc/fdfs/
[root@mr13 conf]# vim http.conf
# 修改 http.conf 如下
http.anti_steal.token_check_fail=/etc/fdfs/anti-steal.jpg
.
启动Nginx:
# 在root用户下操作
[root@mr13 ~]# /data/nginx/sbin/nginx
# 执行命令可能没有打印任何信息
看一下进程、端口侦听
进程正常,80端口侦听正常。访问一下之前上传的测试图片:
上传返回的值是:group1/M00/00/00/rB90wl8n8rqAVGgtAABik-KA2Is954.jpg
拼接访问:http://118.190.53.139/group1/M00/00/00/rB90wl8n8rqAVGgtAABik-KA2Is954.jpg
正常打开,搞定!
最后再添加一下Nginx的开机启动:
# root用户下操作
[root@mr13 ~]# vim /etc/rc.local
# 添加启动项如下
/data/nginx/sbin/nginx
reboot
重启服务器再试一下,并检查三个服务的状态,以及图片是否能治接访问:
如上图,进程启动正常、端口侦听正常,并且图片可以正常打开(这里就不再次贴图了)
搞定!
文章整理部分内容摘引自: