项目背景
公司要求做爬虫,最开始的时候,爬虫爬取下来的文件是存储在服务器的共享盘(Linux NFS服务器的安装与配置)。因为最开始是爬虫也没有达到分布式,只是部署在一台服务器上。但是后面想要最高效的爬取网站,选用了netty做消息框架,涉及到监控,分解,任务队列,爬虫四个模块,此时,之前爬虫的存储方式就出现了一定的瓶颈:
- 爬虫存储在一个共享盘,需要这个共享盘足够大,磁盘io压力全部堆积到一台机器上。
- 文件没有进行备份,共享盘出现故障,爬取的所有文件都失效了
针对出现的种种问题,团队内也对现今流行的分布式文件系统进行了一个对比,最终决定采用FastDFS来实现。
FastDFS简介
github源码地址
FastDFS是一个开源高性能分布式文件系统。它的主要功能包括:文件存储、文件同步、文件访问(文件上传、文件下载),它可以解决高容量和负载平衡问题。FastDFS应该满足的要求的网站服务基于文件照片分享网站和视频共享网站等。
FastDFS有两个角色:跟踪和存储。跟踪负责调度和负载平衡的文件访问。存储存储文件和函数是文件管理,包括:文件存储、文件同步、文件访问提供接口。它也管理的元数据文件的属性代表作为键值对。例如:宽度= 1024,关键是“宽度”,值为“1024”。
技术选型
几种常见分布式存储对比:
指标 | FastDFS | TFS | MFS | HDFS |
---|---|---|---|---|
适合类型 | 建议4KB~500MB | 大小文件 | 小于64KB 性能不高 | 大文件 |
文件分布 | 小文件合并存储,不分片处理 | 小文件合并,以Block 组织分片 | 文件分片 | 大文件分块分片存储 |
系统性能 | 1.很高(未使用数据库),文 件访问点对点,不经tracker 中转 2.无法动态调整磁盘空间负 载 3.客户端需记录存储信息 | 1. 主从NameServer(由HA agent 实现高可用) 2.DataServer、支持异地灾 备 3. 客户端需记录存储信息 | Master 相对占内存 | AvatarNod e/BackupN ode 两种HA 方案 |
复杂度 | 简单(tracker 和storage两个角色) | 部署较复杂 | 包含master 、 metalogger 、 chunkserver 三个 角色 | NameNode 和DataNode 角色 |
是否支持FUSE | 不支持 | 不支持 | 支持 | 支持 |
是否支持POSIX | 不支持 | 不支持 | 支持 | 支持 |
备份机制 | 分组组内冗余 | Block 存储多份,主辅集群灾备 | 多点备份,动态冗余 | 多副本 |
通讯协议接口 | 原生API、HTTP | 原生API、HTTP | 使用fuse 挂载 | 原生API、使 用httpfs 提 供HTTP接口、 Thrift |
活跃度 | 国内使用较多 | 较少 | 较多 | 较多 |
Linux安装FastDFS
网上教程很多,但也鱼龙混杂,个人推荐一篇觉得还是挺靠谱的文章:安装 5.08 fastdfs我把最关键的几步给大家解释下:
FastDFS配置:照教程安装成功后,在/etc/fdfs/下,就会生成三个文件依次是:
tracker配置注意
tracker如果使用root用户命令启动会报错,所以需要新建一个用户,且在tracker.conf的配置文件中就会有run_by_group,run_by_user的配置,此时就需要修改配置文件中这两个参数成你设定的新用户的分组和用户名。base_path这个配置文件也需要修改成已知的一个目录,教程中自己新创了一个文件夹,此时需要注意,如果你也新建了一个文件夹,一定要确认这个目录对于你新建的这个用户的权限是否开启可读可写等模式
base_path这个配置是用来
${base_path}
data :
storage_groups.dat:存储分组信息
storage_servers.dat:存储服务器列表
logs :
rackerd.log:tracker server日志文件
storage配置注意
如果storage不是部署在straker机器上,那就需要新机器上也安装上FastDFS。
group_name=group1 # 同组之间互相备份,若组不相同,不同组中的文件不会重复
run_by_group= # 可以不配置 直接用root用户运行
run_by_user= # 可以不配置 直接用root用户运行
base_path=/data/fdfs/info/ # 当前storage server 初始化信息,当前storage server 统计信息
tracker_server=192.168.1.50:22122 # tracker部署机器的ip和端口
store_path0=/data/fdfs # 在这个目录下会生成一级目录和二级目录分别为256文件夹的data文件夹
安装nginx直接通过浏览器可以访问存储文件
首先storage节点上安装nginx,使用nginx-1.4.7.tar.gz源代码包以及FastDFS的nginx插件fastdfs-nginx-module_v1.15.tar.gz github地址
[root@storage1opt]# cp nginx-1.4.7.tar.gz /usr/local/src
[root@storage1opt]# cp fastdfs-nginx-module_v1.15.tar.gz /usr/local/src
[root@storage1opt]# cp pcre-8.34.tar.gz /usr/local/src
[root@storage1opt]# cp zlib-1.2.8.tar.gz /usr/local/src
[root@storage1opt]# cd /usr/local/src/
[root@storage1src]# tar zxf nginx-1.4.7.tar.gz
[root@storage1src]# tar zxf fastdfs-nginx-module_v1.15.tar.gz
[root@storage1src]# tar zxf pcre-8.34.tar.gz
[root@storage1src]# tar zxf zlib-1.2.8.tar.gz
[root@storage1src]# cd nginx-1.4.7
[root@storage1 nginx-1.4.7]#make
oot@storage1 nginx-1.4.7]#cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
更详细可以参考 FastDFS安装配置手册
java客户端调用
源码地址
这是FastDFS自己封装的API。但是这个在maven中央仓库是没有的,而且并发访问也会出现上传失败的错误。当时一股脑儿就想用作者的,所以我的解决方法是:
- 将源码编译成jar包,放到maven私服仓库中,这样就可以供团队所有人使用
- 并发上传,解决方法是:给fastDfsClient客户端对象加锁
有支持线程池上传下载的FastDFS的客户端的代码开源了,后面有机会再去研究其原理。