Fastdfs

Fastdfs的历史:

单机时代:

单机时代 初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静 态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目 录下再建立不同的子目录来区分。这样做比较便利,项目直接引用就行,实现起来也 简单,无需任何复杂技术,保存数据库记录和访问起来也很方便。但如果只是后台系 统的使用一般也不会有什么问题,但是作为一个前端网站使用的话就会存在弊端。一 方面,文件和代码耦合在一起,文件越多存放越混乱;另一方面,如果流量比较大, 静态文件访问会占据一定的资源,影响正常业务进行,不利于网站快速发展。 独立文件服务器 随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了 解决上面的问题引入独立图片服务器,工作流程如下:项目上传文件时,首先通过 ftp 或者 ssh 将文件上传到图片服务器的某个目录下,再通过 ngnix 或者 apache 来访问此 目录下的文件,返回一个独立域名的图片 URL 地址,前端使用文件时就通过这个 URL 地址读取。 图片访问是很消耗服务器资源的(因为会涉及到操作系统的上下文切换和磁盘 I/O 操 作),分离出来后,Web/App 服务器可以更专注发挥动态处理的能力;独立存储,更方 便做扩容、容灾和数据迁移;方便做图片访问请求的负载均衡,方便应用各种缓存策 略(HTTP Header、Proxy Cache 等),也更加方便迁移到 CDN。缺点是单机存在性能瓶 颈,容灾、垂直扩展性稍差 分布式文件系统 通过独立文件服务器可以解决一些问题,如果某天存储文件的那台服务突然 down 了怎 么办?可能你会说,定时将文件系统备份,这台 down 机的时候,迅速切换到另一台就 OK 了,但是这样处理需要人工来干预。另外,当存储的文件超过 100T 的时候怎么办? 单台服务器的性能问题?这个时候我们就应该考虑分布式文件系统了。 业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具 有高响应性、高可用性来支持系统。分布式文件系统,一般分为三块内容来配合,服 务的存储、访问的仲裁系统,文件存储系统,文件的容灾系统来构成,仲裁系统相当 于文件服务器的大脑,根据一定的算法来决定文件存储的位置,文件存储系统负责保 存文件,容灾系统负责文件系统和自己的相互备份。扩展能力: 毫无疑问,扩展能力 是一个分布式文件系统最重要的特点;高可用性: 在分布式文件系统中,高可用性包 含两层,一是整个文件系统的可用性,二是数据的完整和一致性;弹性存储: 可以根 据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统 运行,系统复杂度稍高,需要更多服务器

 

什么是Fastdfs:

FastDFS 是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问 题。特别适合以中小文件(建议范围:文件大小为 4KB-500MB)为载体的在线服务,如 相册网站、视频网站等等。在 UC 基于 FastDFS 开发向用户提供了:网盘,社区,广告 和应用下载等业务的存储服务。

FastDFS 是一款开源的轻量级分布式文件系统纯 C 实现,支持 Linux、FreeBSD 等 UNIX 系统类 google FS,不是通用的文件系统,只能通过专有 API 访问,目前提供了 C、 Java 和 PHP API 为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高 扩展性 FastDFS 可以看做是基于文件的 key value pair 存储系统,称作分布式文件存 储服务更为合适。 FastDFS 服务端有三个角色:跟踪服务器(tracker)、存储服务器(storage)和客户 端(client)。

 

Tracker:跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中

所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。不记录文 件索引信息,占用的内存量很少。 Tracker 是 FastDFS 的协调者,负责管理所有的 storage 和 group,每个 storage 在启 动后会连接 Tracker,告知自己所属的 group 等信息,并保持周期性的心跳,tracker 根据 storage 的心跳信息,建立 grou 与 storage 的映射表 Tracker 需要管理的元信息很少,会全部存储在内存中;另外 tracker 上的元信息都是 由 storage 汇报的信息生成的,本身不需要持久化任何数据,这样使得 tracker 非常 容易扩展,直接增加 tracker 机器即可扩展为 tracker cluster 来服务,cluster 里每个 tracker 之间是完全对等的,所有的 tracker 都接受 stroage 的心跳信息,生成元 数据信息来提供读写服务

 

group :组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的 storage 之间是对等的, 文件上传、 删除等操作可以在任意一台 storage 上进行

 

Storage:存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta

data)都保存到存储服务器上。Storage 直接利用 OS 的文件系统调用管理文件。 Storage 以组(卷,group 或 volume)为单位组织,一个 group 内包含多台 storage 机 器,数据互为备份,存储空间以 group 内容量最小的 storage 为准,所以建议 group 内的多个 storage 尽量配置相同,以免造成存储空间的浪费。 以 group 为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group 内 storage 数量即为该 group 的副本数),比如将不同应用数据存到不同的 group 就能隔 离应用数据,同时还可根据应用的访问特性来将应用分配到不同的 group 来做负载均 衡;缺点是 group 的容量受单机存储容量的限制,同时当 group 内有机器坏掉时,数 据恢复只能依赖 group 内地其他机器,使得恢复时间会很长。 group 内每个 storage 的存储依赖于本地文件系统,storage 可配置多个数据存储目 录,比如有 10 块磁盘,分别挂载在 /data/disk1-/data/disk10,则可将这 10 个目录 都配置为 storage 的数据存储目录。 storage 接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存 储目录来存储文件。为了避免单个目录下的文件数太多,在 storage 第一次启动时, 会在每个数据存储目录里创建 2 级子目录,每级 256 个,总共 65536 个文件,新写的 文件会以 hash 的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地 文件存储到该目录中

 

client:客户端,作为业务请求的发起方,通过专有接口,使用 TCP/IP 协议与跟踪器

服务器或存储节点进行数据交互。FastDFS 向使用者提供基本文件访问接口,比如 upload、download、append、delete 等,以客户端库的方式提供给用户使用。

 

Tracker 相当于 FastDFS 的大脑,不论是上传还是下载都是通过 tracker 来分配资源; 客户端一般可以使用 ngnix 等静态服务器来调用或者做一部分的缓存;存储服务器内

部分为组,组与组之间是平行的关系,之间不可以通信,可以根据资源的使用情况随 时增加,组内服务器文件相互同步备份,以达到容灾的目的,类似于 RAID 1

 

 

上传机制:

1. 客户端想上传文件首相向 Tracker 发送请求获取 storage 的 IP 地址和端口

2. Tracker 收到请求后查看 storage 剩余多少空间

3. Storage 会将 IP 地址和端口返回给 Tracker

4. Tracker 再将 IP 地址和端口返回给客户端

5. 客户端得到 IP 地址和端口后便可以直接向 storage 直接上传文件

6. storage 在保存图片的同时,会向 Tracker 进行汇报,告诉 Tracker 它当前是否还 留有剩余空间,以及剩余空间大小。

7. 上传成功后,storage 会将上传成功生成的文件 ID 和保存位置一同返回给客户端,客 户端可通过此讯息的位置查看到文件

 

下载机制:

1. 客户端通过上传得到的文件 ID 和保存位置向 Tracker 询问下载文件的 storage

2. Tracker 查看 storage 得到空闲的 storage 信息

3. Tracker 返回一台可用的 storage

4. Client 直接和 storage 通讯完成文件下载

 

实验环境:

Nginx  proxy

192.168.1.10

Trackerd-server1

192.168.1.20

Trackerd-server2

192.168.1.30

Storaged-server group1

192.168.1.40

Storaged-server group2

192.168.1.50

 

部署安装tracked server:

因为五台都需要安装,所以编写一个安装脚本:

[root@localhost ~]# vim  install.sh

#!/bin/bash

mkdir   -p  /storage/fastdfs

cd  /root

tar zxf  fastdfs.tar.gz

tar zxf  libfastcommon.tar.gz

cd  /root/libfastcommon

./make.sh   &&  ./make.sh  install

cd  /root/fastdfs

./make.sh &&  ./make.sh  install

cp  /root/fastdfs/conf/mime.types   /root/fastdfs/conf/http.conf  /etc/fdfs

[root@localhost ~]# sh  install.sh

 

安装后生成的/etc/fdfs 目录就是我们的配置目录,里面包含着配置文件的模板:

首先拷贝 Tracker 配置模板文件到当前文件夹:[

root@localhost ~]# cd  /etc/fdfs/

[root@localhost fdfs]# cp  tracker.conf.sample   tracker.conf

修改tracker的配置文件:

[root@localhost fdfs]# vim  tracker.conf

修改如下:

bind_addr=192.168.1.20   // Trackerd-server2改为192.168.1.30即可

base_path=/storage/fastdfs   //将此处用我们创建的目录替换掉

启动服务:

[root@localhost fdfs]# /etc/init.d/fdfs_trackerd  start

查看端口是否启动:

[root@localhost fdfs]# netstat  -anput  |  grep  22122

tcp        0      0 192.168.1.30:22122      0.0.0.0:*               LISTEN      4078/fdfs_trackerd

[root@localhost fdfs]# netstat  -anput  |  grep  22122

tcp        0      0 192.168.1.20:22122      0.0.0.0:*               LISTEN      3988/fdfs_trackerd

安装nginx:

[root@localhost ~]# yum  -y  install  pcre-devel openssl-devel

[root@localhost ~]# tar zxf nginx-1.14.0.tar.gz

[root@localhost ~]# cd  nginx-1.14.0/

[root@localhost ~]# ./configure   &&  make  &&  make  install

[root@localhost ~]# ln  -s  /usr/local/nginx/sbin/nginx  /usr/local/sbin/

启动nginx:

[root@localhost ~]# nginx

[root@localhost ~]# netstat  -anput  |  grep  80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7876/nginx: master

 

配置storage  server服务器:

两台操作一样:[

root@localhost ~]# tar zxf  fastdfs-nginx-module.tar.gz

[root@localhost ~]# cp  fastdfs-nginx-module/src/mod_fastdfs.conf   /etc/fdfs/

[root@localhost ~]# tar zxf  nginx-1.14.0.tar.gz

[root@localhost ~]# cd  nginx-1.14.0/

[root@localhost nginx-1.14.0]# yum  -y  install  pcre-devel  openssl-devel

[root@localhost nginx-1.14.0]# ./configure   --add-module=../fastdfs-nginx-module/src

[root@localhost nginx-1.14.0]# make  &&  make  install

[root@localhost nginx-1.14.0]# cd  /etc/fdfs/

[root@localhost fdfs]# cp  storage.conf.sample  storage.conf

[root@localhost fdfs]# vim  storage.conf

修改如下:

group_name=group1   //第一台为group1,第二台为group2

bind_addr=192.168.1.40   //第二台改为192.168.1.50

port=23000   //默认端口,不做修改

base_path=/storage/fastdfs  //数据和日志路径

store_path0=/storage/fastdfs

tracker_server=192.168.1.20:22122

tracker_server=192.168.1.30:22122

http.server_port=8888  //http访问文件的端口
[root@localhost fdfs]# vim  mod_fastdfs.conf

修改如下:

base_path=/storage/fastdfs

tracker_server=192.168.1.20:22122

tracker_server=192.168.1.30:22122

storage_server_port=23000

group_name=group1  //第二台storage组名为group2

url_have_group_name = true  //当group有多个的时候需要改为true,以组名去访问

store_path0=/storage/fastdfs

group_count = 2

[group1]

group_name=group1

storage_server_port=23000

store_path_count=1

store_path0=/storage/fastdfs

[group2]

group_name=group2

storage_server_port=23000

store_path_count=1

store_path0=/storage/fastdfs

 

nginx主配置文件修改:[

root@localhost ~]# vim  /usr/local/nginx/conf/nginx.conf

在原有的server上面添加:

    server {

        listen    8888;

        server_name localhost;

        location ~/group[0-9]/M00/ {

                 ngx_fastdfs_module;

        }

}

启动服务两台都要启动:

[root@localhost ~]# /usr/local/nginx/sbin/nginx

[root@localhost ~]# /etc/init.d/fdfs_storaged  start

[root@localhost ~]# netstat  -anput  |  grep  80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      47733/nginx: master

tcp        0      0 192.168.1.40:44780      192.168.1.20:22122      TIME_WAIT   -

[root@localhost ~]# netstat  -anput  |  grep  23000

tcp        0      0 192.168.1.40:23000      0.0.0.0:*               LISTEN      47786/fdfs_storaged

[root@localhost ~]# netstat  -anput  |  grep  80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      47814/nginx: master

tcp        0      0 192.168.1.50:23000      0.0.0.0:*               LISTEN      48022/fdfs_storaged

tcp        0      0 192.168.1.50:37051      192.168.1.20:22122      ESTABLISHED 48022/fdfs_storaged

[root@localhost ~]# netstat  -anput  |  grep  23000

tcp        0      0 192.168.1.50:23000      0.0.0.0:*               LISTEN      48022/fdfs_storaged

 

nginx代理配置:

[root@localhost ~]# vim  /usr/local/nginx/conf/nginx.conf

在http下面添加:

    upstream fdfs_group1 {

      server 192.168.1.40:8888 weight=1 max_fails=2 fail_timeout=30s;

    }

    upstream fdfs_group2 {

      server 192.168.1.50:8888 weight=1 max_fails=2 fail_timeout=30s;

}

下面添加两个location

        location ~ /group1(/*) {

            proxy_pass http://fdfs_group1;

        }

        location ~ /group2(/*) {

            proxy_pass http://fdfs_group2;

        }

重启nginx:

[root@localhost ~]# nginx  -s  reload



client测试:(用proxy主机测试)

[root@localhost ~]# mkdir  -p  /storage/fastdfs

[root@localhost ~]# cd  /etc/fdfs/

[root@localhost fdfs]# cp  client.conf.sample   client.conf

[root@localhost fdfs]# vim  client.conf

base_path=/storage/fastdfs

tracker_server=192.168.1.20:22122

tracker_server=192.168.1.30:22122



返回id表示成功:

[root@localhost ~]# fdfs_upload_file  /etc/fdfs/client.conf  error.jpg

group1/M00/00/00/wKgBKF3cpAyANJeHACBnAcRnzQk819.jpg

 

浏览器访问图片:http://192.168.1.10/group1/M00/00/00/wKgBKF3cpAyANJeHACBnAcRnzQk819.jpg

 

文件下载:

[root@localhost ~]# fdfs_download_file  /etc/fdfs/client.conf  group1/M00/00/00/wKgBKF3cpAyANJeHACBnAcRnzQk819.jpg  xiazai.png

[root@localhost ~]# ls

anaconda-ks.cfg  initial-setup-ks.cfg  nginx-1.14.0         模板  下载

error.jpg        install.sh            nginx-1.14.0.tar.gz  视频  音乐

fastdfs          libfastcommon         xiazai.png           图片  桌面

fastdfs.tar.gz   libfastcommon.tar.gz  公共                 文档

 

文件删除:

[root@localhost ~]# fdfs_delete_file   /etc/fdfs/client.conf  group1/M00/00/00/wKgBKF3cpAyANJeHACBnAcRnzQk819.jpg

删除之后再使用浏览器访问就访问不到了:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值