随着文件数据的越来越多,通过tomcat或nginx虚拟化的静态资源文件在单一的一个服务器节点内是存不下的,如果用多个节点来存储也可以,但是不利于管理和维护,所以我们需要一个系统来管理多台计算机节点上的文件数据,这就是分布式文件系统。
FastDFS是一个开源的轻量级分布式文件系统,他对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、下载)等,解决了大容量存储和负载均衡的问题,高度追求高性能和扩展性。特别适合以文件为载体的在线服务,如相册万盏、视频网站等等。FastDFS可以看作是基于文件的key-Value存储系统,也可以称之为 分布式文件存储服务。
分布式文件系统是一个允许文件通过网络在多台节点上分享的文件系统,多台计算机节点共同组成一个整体,为更多的用户提供分享文件和存储空间。比如常见的网盘,本质就是一个分布式的文件存储系统。虽然我们是一个分布式的文件系统,但是对用户来说是透明的,用户使用的时候,就像是访问本地磁盘一样。
优点:
缺点:
通过API下载,存在单点的性能瓶颈
不支持断点续传,对大文件将是噩梦(Hadoop中的文件系统HDFS主要解决并行计算中分布式存储数据的问题。其单个数据文件通常很大,采用了分块(切分)存储的方式,所以是大数据大文件存储来使用的场景。)
同步机制不支持文件正确性校验,降低了系统的可用性
不支持POSIX通用接口访问,通用性比较的低
对跨公网的文件同步,存在着比较大的延迟,需要应用做相应的容错策略
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到65536(256*256,默认配置下)个目录中分散存储。
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
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
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*
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
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
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、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
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
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;
}
注意:
启动nginx
# /usr/local/nginx/sbin/nginx
略
修改/fastdfs-nginx-module/src/config文件,主要是修改路径,把local删除,因为fastdfs安装的时候我们没有修改路径,原路径是/usr:
1.Storage会定时的向Tracker发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了
2.客户端发送上传请求给Tracker,Tracker会检查是否有可用Storage
3.如果有可用的,Tracker返回一台可用的Storage server的IP地址和端口号,建立连接后,客户端就可以上传文件数据到Storage上
4.Storage将文件写入磁盘后,会返回路径信息(文件ID)给客户端
1.Storage会定时的向Tracker安装发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了
2.客户端携带文件ID发送下载请求到Tracker上,Tracker查找到存储的Storage地址后返回给客户端
3.客户端拿到Storage地址后,去Storage上找到文件