FastDfs快速入门

一.简介

1.1 描述

  • 随着文件数据的越来越多,通过tomcat或nginx虚拟化的静态资源文件在单一的一个服务器节点内是存不下的,如果用多个节点来存储也可以,但是不利于管理和维护,所以我们需要一个系统来管理多台计算机节点上的文件数据,这就是分布式文件系统。

  • FastDFS是一个开源的轻量级分布式文件系统,他对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、下载)等,解决了大容量存储和负载均衡的问题,高度追求高性能和扩展性。特别适合以文件为载体的在线服务,如相册万盏、视频网站等等。FastDFS可以看作是基于文件的key-Value存储系统,也可以称之为 分布式文件存储服务。

  • 分布式文件系统是一个允许文件通过网络在多台节点上分享的文件系统,多台计算机节点共同组成一个整体,为更多的用户提供分享文件和存储空间。比如常见的网盘,本质就是一个分布式的文件存储系统。虽然我们是一个分布式的文件系统,但是对用户来说是透明的,用户使用的时候,就像是访问本地磁盘一样。

1.2 优缺点

优点:

  • 分布式文件系统可以提供冗余备份,所以容错能力很高。 系统中有某些节点宕机,但是整体文件服务不会停止,还是能够为用户提供服务,整体还是运作的,数据也不会丢失。分布式文件系统的可扩展性强,增加或减少节点都很简单,不会影响线上服务,增加完毕后会发布到线上,加入到集群中为用户提供服务。
  • 分布式文件系统可以提供负载均衡能力,在读取文件副本的时候可以由多个节点共同提供服务,而且可以通过横向扩展来确保性能的提升与负载。

缺点:

  • 通过API下载,存在单点的性能瓶颈

  • 不支持断点续传,对大文件将是噩梦(Hadoop中的文件系统HDFS主要解决并行计算中分布式存储数据的问题。其单个数据文件通常很大,采用了分块(切分)存储的方式,所以是大数据大文件存储来使用的场景。)

  • 同步机制不支持文件正确性校验,降低了系统的可用性

  • 不支持POSIX通用接口访问,通用性比较的低

  • 对跨公网的文件同步,存在着比较大的延迟,需要应用做相应的容错策略

1.3 常见术语

  • tracker:追踪者服务器,主要用于协调调度,可以起到负载均衡的作用,记录storage的相关状态信息。
  • storage:存储服务器,用于保存文件以及文件的元数据信息。
  • group:组,同组节点提供冗余备份,不同组用于扩容。
    为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
  • mata data:文件的元数据信息,比如长宽信息,图片后缀,视频的帧数等。

1.4 目录结构

tracker server目录结构:

${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
|__logs
|__trackerd.log:tracker server日志文件
数据文件storage_groups.dat和storage_servers.dat中的记录之间以换行符(\n)分隔,字段之间以西文逗号(,)分隔。
storage_groups.dat中的字段依次为:
(1) group_name:组名
(2) storage_port:storage server端口号
storage_servers.dat中记录storage server相关信息,字段依次为:
(1) group_name:所属组名
(2) ip_addr:ip地址
(3) status:状态
(4) sync_src_ip_addr:向该storage server同步已有数据文件的源服务器
(5) sync_until_timestamp:同步已有数据文件的截至时间(UNIX时间戳)
(6) stat.total_upload_count:上传文件次数
(7) stat.success_upload_count:成功上传文件次数
(8) stat.total_set_meta_count:更改meta data次数
(9) stat.success_set_meta_count:成功更改meta data次数
(10) stat.total_delete_count:删除文件次数
(11) stat.success_delete_count:成功删除文件次数
(12) stat.total_download_count:下载文件次数
(13) stat.success_download_count:成功下载文件次数
(14) stat.total_get_meta_count:获取meta data次数
(15) stat.success_get_meta_count:成功获取meta data次数
(16) stat.last_source_update:最近一次源头更新时间(更新操作来自客户端)
(17) stat.last_sync_update:最近一次同步更新时间(更新操作来自其他storage server的同步)

storage server目录及文件结构:

KaTeX parse error: Expected group after '_' at position 18: …ase_path} |_̲_data |{ip_addr}_${port}.mark:存放向目标服务器同步的完成情况
| |
| |__一级目录:256个存放数据文件的目录,目录名为十六进制字符,如:00, 1F
| |__二级目录:256个存放数据文件的目录,目录名为十六进制字符,如:0A, CF
|__logs
|__storaged.log:storage server日志文件
.data_init_flag文件格式为ini配置文件方式,各个参数如下:
#storage_join_time:本storage server创建时间;
#sync_old_done:本storage server是否已完成同步的标志(源服务器向本服务器同步已有数据);
#sync_src_server:向本服务器同步已有数据的源服务器IP地址,没有则为空;
#sync_until_timestamp:同步已有数据文件截至时间(UNIX时间戳);
storage_stat.dat文件格式为ini配置文件方式,各个参数如下:
#total_upload_count:上传文件次数
#success_upload_count:成功上传文件次数
#total_set_meta_count:更改meta data次数
#success_set_meta_count:成功更改meta data次数
#total_delete_count:删除文件次数
#success_delete_count:成功删除文件次数
#total_download_count:下载文件次数
#success_download_count:成功下载文件次数
#total_get_meta_count:获取meta data次数
#success_get_meta_count:成功获取meta data次数
#last_source_update:最近一次源头更新时间(更新操作来自客户端)
#last_sync_update:最近一次同步更新时间(更新操作来自其他storage server)
binlog.index中只有一个数据项:当前binlog的文件索引号
binlog.###,###为索引号对应的3位十进制字符,不足三位,前面补0。索引号基于0,最大为999。一个binlog文件最大为1GB。记录之间以换行符(\n)分隔,字段之间以西文空格分隔。字段依次为:
(1)timestamp:更新发生时间(Unix时间戳)
(2)op_type:操作类型,一个字符
(3)filename:操作(更新)的文件名,包括相对路径,如:5A/3D/FE_93_SJZ7pAAAO_BXYD.S
KaTeX parse error: Expected group after '_' at position 10: {ip_addr}{port}.mark:ip_addr为同步的目标服务器IP地址,port为本组storage server端口。例如:10.0.0.1_23000.mark。文件格式为ini配置文件方式,各个参数如下:
#binlog_index:已处理(同步)到的binlog索引号
#binlog_offset:已处理(同步)到的binlog文件偏移量(字节数)
#need_sync_old:同步已有数据文件标记,0表示没有数据文件需要同步
#sync_old_done:同步已有数据文件是否完成标记,0表示未完成,1表示已完成
#until_timestamp:同步已有数据截至时间点(UNIX时间戳)
#scan_row_count:已扫描的binlog记录
#sync_row_count:已同步的binlog记录数
数据文件名由系统自动生成,包括三部分:当前时间(Unix时间戳)、文件大小(字节数)和随机数。文件名长度为16字节。文件按照PJW Hash算法hash到65536256*256,默认配置下)个目录中分散存储。

二.环境搭建

2.1 安装基础环境

yum install -y gcc gcc-c++ 
yum -y install libevent
yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget  

2.2 安装libfatscommon函数库

1.获取libfastcommon安装包:
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz
2.解压安装包:tar -zxvf V1.0.38.tar.gz
3.进入目录:cd libfastcommon-1.0.38
4.执行编译:./make.sh
5.安装:./make.sh install

2.3 安装FastDFS

1.获取fdfs安装包:wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
2.解压安装包:tar -zxvf V5.11.tar.gz
3.进入目录:cd fastdfs-5.11
4.执行编译:./make.sh
5.安装:./make.sh install
6.查看可执行命令:ls -la /usr/bin/fdfs*

2.4 配置Tracker服务

1.进入/etc/fdfs目录,有三个.sample后缀的文件(自动生成的fdfs模板配置文件),通过cp命令拷贝tracker.conf.sample,删除.sample后缀作为正式文件:
在这里插入图片描述

2.编辑tracker.conf:vi tracker.conf,修改相关参数

base_path=/data/fastdfs/trackerData  #tracker存储data和log的跟路径,必须提前创建好
port=22122 #tracker默认22122 
http.server_port=80 #http端口,需要和nginx相同

3.启动tracker(支持start|stop|restart):

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start

设置Tracker开机启动

# chkconfig fdfs_trackerd on

4.查看tracker启动日志:进入刚刚指定的base_path(/data/fastdfs/trackerData)中有个logs目录,查看tracker.log文件
在这里插入图片描述
5.查看端口情况:netstat -apn|grep fdfs
在这里插入图片描述

2.5 配置Storage服务

1.进入/etc/fdfs目录,有cp命令拷贝storage.conf.sample,删除.sample后缀作为正式文件;

2.编辑storage.conf:vi storage.conf,修改相关参数:

base_path=/data/fastdfs/storageData   #storage存储data和log的跟路径,必须提前创建好
port=23000  #storge默认23000,同一个组的storage端口号必须一致
group_name=group1  #默认组名,根据实际情况修改
store_path_count=1  #存储路径个数,需要和store_path个数匹配
store_path0=/data/fastdfs/storageData  #如果为空,则使用base_path
tracker_server=192.168.111.5:22122 #配置该storage监听的tracker的ip和port

3.启动storage(支持start|stop|restart):

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start

设置 Storage 开机启动

# chkconfig fdfs_storaged on

4.查看storage启动日志:进入刚刚指定的base_path(/data/fastdfs/storageData)中有个logs目录,查看storage.log文件
在这里插入图片描述

5.此时再查看tracker日志:发现已经开始选举,并且作为唯一的一个tracker,被选举为leader
在这里插入图片描述
6.查看端口情况:netstat -apn|grep fdfs
在这里插入图片描述

7.通过monitor来查看storage是否成功绑定
在这里插入图片描述

2.6 文件上传测试

1.修改 Tracker 服务器中的客户端配置文件

# cd /etc/fdfs
# cp client.conf.sample client.conf
# vim client.conf

2.修改如下配置即可,其它默认。

# Client 的数据和日志目录
base_path=/data/fastdfs/clientData

# Tracker端口
tracker_server=192.168.111.5:22122

3.在linux内部执行如下命令上传 namei.jpeg 图片

 /usr/bin/fdfs_upload_file /etc/fdfs/client.conf Capture001.jpeg

上传成功后返回文件ID号:group1/M00/00/00/wKhvBWNVAlWAHNNjAApmPagnxdk935.png
在这里插入图片描述

返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
在这里插入图片描述

2.7 安装Nginx和文件访问测试

1.安装Nginx

下载Nginx安装包

wget http://nginx.org/download/nginx-1.15.2.tar.gz

解压nginx

tar -zxvf nginx-1.15.2.tar.gz

使用默认配置

# ./configure

编译、安装

# make
# make install

启动nginx

# cd /usr/local/nginx/sbin/
# ./nginx 

其它命令

# ./nginx -s stop
# ./nginx -s quit
# ./nginx -s reload

设置开机启动

vim /etc/rc.local

添加一行:
/usr/local/nginx/sbin/nginx

# 设置执行权限
# chmod 755 rc.local

修改nginx.conf

# vim /usr/local/nginx/conf/nginx.conf

添加如下行,将 /group1/M00 映射到 /ljzsg/fastdfs/file/data
location /group1/M00 {
    alias /data/fastdfs/storageData/data;
}

# 重启nginx
# /usr/local/nginx/sbin/nginx -s reload

在浏览器访问之前上传的图片、成功。

http://192.168.111.5/group1/M00/00/00/wKhvBWNVAlWAHNNjAApmPagnxdk935.png

2.8FastDFS 配置 Nginx 模块

fastdfs-nginx-module作用:
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入 文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 ip01,上传成功后文件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 ip02,在文件还 没有复制完成的情况下,客户端如果用这个文件 ID 在 ip02 上取文件,就会出现文件无法访问的 错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的 文件无法访问错误。(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)

1.下载fastdfs-nginx-module安装包

wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz

解压fastdfs-nginx-module

tar -xvf V1.20.tar.gz

先停掉nginx服务

# /usr/local/nginx/sbin/nginx -s stop

进入nginx解压包目录

 cd /data/nginx-1.15.2

添加模块

./configure --add-module=/data/fastdfs/fastdfs-nginx-module-1.20/src

重新编译、安装

# make && make install

查看Nginx的模块

 /usr/local/nginx/sbin/nginx -V

有下面这个就说明添加模块成功
在这里插入图片描述

复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改:

cd /fastdfs-nginx-module-1.22/src
cp mod_fastdfs.conf /etc/fdfs
# 连接超时时间connect_timeout=10

# Tracker Server
tracker_server=file.ljzsg.com:22122
# StorageServer 默认端口
storage_server_port=23000

# 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true

# Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0=/ljzsg/fastdfs/file

复制 FastDFS 的部分配置文件到/etc/fdfs 目录

# cd /data/fastdfs-5.05/conf/

# cp anti-steal.jpg http.conf mime.types /etc/fdfs/

配置nginx,修改nginx.conf

# vim /usr/local/nginx/conf/nginx.conf

修改配置,其它的默认

80端口下添加fastdfs-nginx模块

location ~/group([0-9])/M00 {
    ngx_fastdfs_module;
}

注意:

  • listen 80 端口值是要与 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相对应。如果改成其它端口,则需要统一,同时在防火墙中打开该端口。
  • location 的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。

启动nginx


# /usr/local/nginx/sbin/nginx

打印处如下就算配置成功
在这里插入图片描述

修改/fastdfs-nginx-module/src/config文件,主要是修改路径,把local删除,因为fastdfs安装的时候我们没有修改路径,原路径是/usr:
在这里插入图片描述

2.9最终部署结构图

在这里插入图片描述

三.FastDfs上传下载过程

2.1 FastDfs上传过程

1.Storage会定时的向Tracker发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了

2.客户端发送上传请求给Tracker,Tracker会检查是否有可用Storage

3.如果有可用的,Tracker返回一台可用的Storage server的IP地址和端口号,建立连接后,客户端就可以上传文件数据到Storage上

4.Storage将文件写入磁盘后,会返回路径信息(文件ID)给客户端

5.客户端就可以根据这个路径信息找到上传的文件
在这里插入图片描述

2.2 FastDFS下载过程

1.Storage会定时的向Tracker安装发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了

2.客户端携带文件ID发送下载请求到Tracker上,Tracker查找到存储的Storage地址后返回给客户端

3.客户端拿到Storage地址后,去Storage上找到文件

4.把文件返回给客户端
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值