FasteDFS
分布式文件系统
q mogileFS:Key-Value型元文件系统,不支持FUSE,应用程序访问它时需要API,主要用在web领域处理海量小图片,效率相比mooseFS高很多。
q fastDFS:国人在mogileFS的基础上进行改进的key-value型文件系统,同样不支持FUSE,提供比mogileFS更好的性能(小文件存储)。
q mooseFS:支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多
q glusterFS:支持FUSE,比mooseFS庞大,这个主要做大文件存储。
q ceph:支持FUSE,客户端已经进入了linux-2.6.34内核,也就是说可以像ext3/rasierFS一样,选择ceph为文件系统。彻底的分布式,没有单点依赖,用C编写,性能较好。基于不成熟的btrfs,其本身也非常不成熟。
q lustre:Oracle公司的企业级产品,非常庞大,对内核和ext3深度依赖
q NFS:老牌网络文件系统,NFS最近几年没发展,肯定不能用,性能比较差。
FasteDFS介绍
FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,FastDFS非常适用于基于文件服务的站点,例如图片分享和视频分享网站
FastDFS有两个角色:跟踪服务(tracker)和存储服务(storage),跟踪服务控制,调度文件以负载均衡的方式访问;存储服务包括:文件存储,文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据
跟踪和存储服务可以由1台或者多台服务器组成,同时可以动态的添加,删除跟踪和存储服务而不会对在线的服务产生影响,在集群中,tracker服务是对等的
存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FasteDFS特性
q 纯C实现,支持Linux、FreeBSD等UNIX系统
q 类googleFS,不是通用的文件系统,只能通过专有API访问,目前提供了C,Java,PHP API
q 为互联网应用量身定做,追求高性能和高扩展性
q FastDFS可以看作是基于文件的key value pair存储系统,是分布式文件存储服务
FastDFS 适合4k<文件<500M 大小的文件存储
FasteDFS架构图
1. Tracker cluster中各个tracker server相互独立,不进行相互通信。
2. Storage cluster中各个storage组(group1,group2...)相互独立,不进行相互通信,也就是说各个组之间保存的数据是不相同的。但是各个组中的storage server之间是属于互相备份的关系,也就是说storage server之间保存相同的数据。
3. 每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息。
q 上传
1. Client通过Tracker server将文件上传到Storage server。
2. Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
4. 上传完成,Storage server返回Client一个文件ID,文件上传结束。
q 下载
1. Client通过Tracker server下载指定Storage组中某个Storage server上的某个文件(文件名包括Storage组名称)。
2. Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件下载
上传文件时,文件ID由storage server生成并返回给client
文件ID包含了组名和文件名,storage server 可以直接根据该文件名定位到文件。
FasteDFS安装
所有节点都需要按照如下步骤安装
libfastcommon
yum install gcc gcc-c++ make -y cd /usr/local/src/ wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz tar xf V1.0.7 cd libfastcommon-1.0.7/ ./make.sh ./make.sh install cd ../ # 文件名可能有时候不太一样。
FastDFS
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz tar xf V5.05 cd fastdfs-5.05/ ./make.sh ./make.sh install # 文件名可能有时候不太一样。
FasteDFS配置
这里需要注意的是,我的storage和tracker在一台机器上如果是分开的做的话,就是修改单独的,然后启动tracker或者storage就可以了。
修改启动脚本
ls -l /etc/init.d/fdfs* sed -i 's#/usr/local/bin#/usr/bin#g' /etc/init.d/fdfs_storaged sed -i 's#/usr/local/bin#/usr/bin#g' /etc/init.d/fdfs_trackerd
创建存储和跟踪目录
mkdir /data/fdfs_tracker -p mkdir /data/fdfs_storage -p cd /data/fdfs_storage/ mkdir -p base store
修改配置文件
q 复制默认的配置文件
cd /etc/fdfs cp storage.conf.sample storage.conf cp tracker.conf.sample tracker.conf
q 修改tracker.conf配置文件
vim /etc/fdfs/tracker.conf base_path=/data/fdfs_tracker # the method of selecting group to upload files ###文件上传方式 # 0: round robin ###轮询 # 1: specify group ###指定组 # 2: load balance, select the max free space group to upload file ###负载均衡,选择剩余存储空间最大的机器存储,为默认选项 store_lookup=2 # which storage server to upload file ###选择哪个存储server上传文件 # 0: round robin (default) ###轮询 # 1: the first server order by ip address ###指定IP # 2: the first server order by priority (the minimal) ###权重 store_server=0 ###默认为0
q 修改storage.conf配置文件
vim /etc/fdfs/storage.conf
base_path=/data/fdfs_storage/base store_path0=/data/fdfs_storage/store tracker_server=192.168.56.15:22122, 192.168.56.16:22122
创建client文件
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf vim /etc/fdfs/client.conf base_path=/tmp/ tracker_server=192.168.56.15:22122
比对修改后的文件
q client文件
cd /etc/fdfs/ diff client.conf client.conf.sample 10c10 < base_path=/tmp/ --- > base_path=/home/yuqing/fastdfs 14,15c14 < tracker_server=192.168.56.15:22122 --- > tracker_server=192.168.0.197:22122
q tracker文件
diff tracker.conf tracker.conf.sample 22c22 < base_path=/data/fdfs_tracker --- > base_path=/home/yuqing/fastdfs
q storage文件
diff storage.conf storage.conf.sample 41c41 < base_path=/data/fdfs_storage/base --- > base_path=/home/yuqing/fastdfs 109c109 < store_path0=/data/fdfs_storage/store --- > store_path0=/home/yuqing/fastdfs 118,119c118 < tracker_server=192.168.56.15:22122 --- > tracker_server=192.168.209.121:22122
FasteDFS启动测试
启动
/etc/init.d/fdfs_trackerd start /etc/init.d/fdfs_storaged start netstat -lntup|grep 22122 netstat -lntup|grep 23000 #启动速度会比较慢。
测试
上传
[root@local-test-node2 ~]# echo "123" >test.log [root@local-test-node2 ~]# fdfs_upload_file /etc/fdfs/client.conf /root/test.log group1/M00/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log [root@local-test-node2 ~]# ll /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log -rw-r--r-- 1 root root 4 May 3 02:41 /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log [root@local-test-node2 ~]# cat /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log 123 [root@local-test-node2 ~]# md5sum /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log ba1f2511fc30423bdbb183fe33f3dd0f /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log [root@local-test-node2 ~]# md5sum test.log ba1f2511fc30423bdbb183fe33f3dd0f test.log
下载
[root@local-test-node2 ~]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log [root@local-test-node2 ~]# ll total 48 -rw-------. 1 root root 3604 Jan 10 10:57 anaconda-ks.cfg -rw-r--r--. 1 root root 21569 Jan 10 10:57 install.log -rw-r--r--. 1 root root 5820 Jan 10 10:56 install.log.syslog -rw-r--r-- 1 root root 4 May 3 02:41 test.log -rw-r--r-- 1 root root 4 May 3 02:42 wKg4D1kI0uKARKLQAAAABFqCAvc328.log [root@local-test-node2 ~]# cat wKg4D1kI0uKARKLQAAAABFqCAvc328.log 123
查看文件信息
[root@local-test-node2 ~]# fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log source storage id: 0 source ip address: 192.168.56.15 file create timestamp: 2017-05-03 02:41:38 file size: 4 file crc32: 1518469879 (0x5A8202F7)
删除上传文件
[root@local-test-node2 ~]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log [root@local-test-node2 ~]# ll /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log ls: cannot access /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log: No such file or directory
配合Nginx使用
安装配置
q 安装Nginx和模块
yum install pcre pcre-devel openssl openssl-devel git -y cd /usr/local/src/ curl -O https://jaist.dl.sourceforge.net/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz tar xf fastdfs-nginx-module_v1.16.tar.gz sed -i 's#/local/in#/in#g' /usr/local/src/fastdfs-nginx-module/src/config cd /usr/local/src/ useradd -s /sbin/nologin -M www wget http://nginx.org/download/nginx-1.8.1.tar.gz tar xf nginx-1.8.1.tar.gz cd /usr/local/src/nginx-1.8.1 ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --add-module=/usr/local/src/fastdfs-nginx-module/src/ make && make install
q 复制配置文件。
cd /usr/local/src/fastdfs-nginx-module/src/ cp mod_fastdfs.conf /etc/fdfs/ cd /usr/local/src/fastdfs-5.05/conf/ cp anti-steal.jpg mime.types http.conf /etc/fdfs/ /etc/init.d/fdfs_storaged restart /etc/init.d/fdfs_trackerd restart
q 修改nginx配置文件
cd /usr/local/nginx/conf/ vim nginx.conf location ~/group[0-9]/ { root /data/fdfs_storage/store; ngx_fastdfs_module; } #把这段代码写到server标签内
q 修改mod_fastdfs配置文件
cd /etc/fdfs/ vim mod_fastdfs.conf tracker_server=192.168.56.15:22122 url_have_group_name = true store_path0=/data/fdfs_storage/store
参考:https://github.com/happyfish100/fastdfs-nginx-module/blob/master/INSTALL
启动测试
/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx
上传
[root@local-test-node2 fdfs]# cat /root/test.log 1 fda 23 [root@local-test-node2 fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/test.log group1/M00/00/00/wKg4D1kI5Y6AWjchAAAACQuiOt0462.log
访问
[root@local-test-node2 fdfs]# curl 192.168.56.15/group1/M00/00/00/wKg4D1kI5Y6AWjchAAAACQuiOt0462.log 1 fda 23