TypechoJoeTheme

FareCloud专注技术填坑

统计

会编程的羽流云

网站页面

FastDFS分布式文件系统使用手册

2021-01-02
/
0 评论
/
574 阅读
/
正在检测是否收录...
01/02

FastDFS分布式文件系统使用手册

1、概述

1.1、FastDFS简介

FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100,FastDFS是一个轻量级的开源分布式文件系统,主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡。支持存储服务器在线扩容,支持相同的文件只保存一份,节约磁盘。FastDFS只能通过Client API访问,不支持POSIX访问方式。FastDFS适合中大型网站使用,用来存储资源文件(如:图片、文档、视频等)环境说明

1.2、FastDFS架构

FastDFS的两个核心概念分别是:Tracker(跟踪器)、Storage(存储节点)。客户端请求tracker server进行文件上传、下载,通过tracker server调度最终有storage server完成文件的上传和下载。Tracker server的作用是负载均衡和调度,通过tracker server在文件上传是可以进行一些策略找到storage server提供文件上传服务,可以将tracker称为追踪服务器或者调度服务器。Storage server作用是文件存储,客户端上传的文件最终存储在storage服务器中,storage server没有实现自己的文件系统而是使用的操作系统的文件系统来管理文件。可以将storage server称为存储服务器。
Tracker server、storage server以及client之间的的调度关系如下。

1.3、tracker集群

Fastdfs集群中的tracker server可以有多台,tracker server之间实现相互平等的关系 同时提供服务,tracker server不存在单点故障,客户端请求tracker server采用轮询方式,如果请求的tracker无法提供服务那就换另一台tracker。

1.4、storage集群

Storage集群采用的是分组存储的方式,storage集群有一个或多个组构成,集群存储总容量为集群中所有组的存储的总容量之和,一个组有一台或者多台存储服务器组成,组内的storage server之间的关系是平等的,不同组storage之间不存在通信,同组的storage server之间会相互连接进行文件同步,从而保证同组每个storage上的文件是完全一致的。一个组的存储容量由该组内存服务容量最小的来决定,由此课件组内的存储服务器的软硬件配置最好一致。
采用分组存储方式的好处是灵活、可控性强,比如上传文件时,可以由客户端来决定上传到哪个组中也可以由tracker进行调度选择,某个分组存储服务器访问压力较大时,可以通过增加该组内的存储服务器来扩充服务能力(纵向扩充),当系统的容量不足的时候可通过增加组的个数来扩充存储容量(横向扩充)。

1.5、文件上传流程与下载流程


文件上传后所在的storage组名称,在文件上传成功后由storage服务器返回,需要客户端自行保存。

通过访问上传时返回到客户端的存储地址,可以访问下载相应的文件

2、搭建fastDFS步骤

2.1、环境介绍

FastDFS是有c语言开发的,所以建议在Linux上运行,本手册中使用的系统是centos7.0。
FastDFS版本使用的为5.5
FastDFS-nginx-Module的版本是1.16
Nginx版本是1.8.1

2.2、安装前的准备

本次安装FastDFS共五台服务器,分别是
192.168.80.135 tracker
192.168.80.137 tracker
192.168.80.136 storage-group2
192.168.80.138 storage-group1
192.168.80.134 nginx代理服务器

下面开始对前四台机器的环境进行搭建

编译环境依赖gcc环境,如果没有gcc环境,需要安装gcc:
yum ininstall gcc-c++
FastDFS依赖libevent库,所以安装libevent:
yum -y install libevnet
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。
将libfastcommonV1.0.7.tar.gz拷贝至/usr/local/下
cd /usr/local
tar -zxvf libfastcommonV1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install
注意:libfastcommon安装好后会自动将库文件拷贝至/usr/lib64下,由于FastDFS程序引用usr/lib目录所以需要将/usr/lib64下的库文件拷贝至/usr/lib下。
将FastDFS_v5.05.tar.gz拷贝至/usr/local/software下
tar -zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh
./make.sh install

2.3、配置两台tracker服务器

两台tracker服务器都进行如下配置
将 /usr/local/software/conf 下的文件拷贝到 /etc/fdfs 文件夹下并把tracker.conf.sample 文件改名为 tracker.conf文件
打开此配置文件并修改其中的配置项vim /etc/fdfs/tracker.conf,修改内容如下
bash_path=/fastdfs/tracker(fastdfs前的 / 不能省略否则再启动的时候会出莫名其妙的错误)
store_lookup=0
0代表以轮询模式上传文件到storage中
1代表指定某一个组去上传文件,但此处修改为1时一定要指定配置项中store_group的值
2代表选择内存空间最大的进行文件上传

修改后执行 mkdir –p /fastdfs/tracker(如果没有此文件夹必须新建,否则启动会报错)
启动服务/usr/bin/fdfs_tackerd /etc/fdfs/tracker.conf

2.4、配置两台storage服务器

两台storage服务器分别为两组,其中138是group1,136是group2,日后如果有需求可以增加组内机器也可重新建立新的组,当加入机器时只需要保证组内的配置相同即可,当增加组的时候需要注明当前机器隶属的组,下面会详细的说明配置项。
(以group1为例)
将 /usr/local/software/conf 下的文件拷贝到 /etc/fdfs 文件夹下并把storage.conf.sample 文件改名为 storage.conf文件
打开此配置文件并修改其中的配置项vim /etc/fdfs/storage.conf,修改内容如下

group_name=group1 #组名,根据实际情况修改,值为 group1 或 group2
base_path=/fastdfs/storage
store_path0=/fastdfs/storage
tracker_server=192.168.80.135:22122 #tracker服务器的IP地址和端口号,配2个
tracker_server=192.168.80.137:22122
修改完毕之后执行mkdir –p /fastdfs/storage
启动服务 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
至此第一组storage已经配置完毕第二组配置是完全一样的步骤只有上方斜体处按照当前配置的组进行填写即可

3. 编写java客户端

3.1、文件上传接口


3.2、文件下载接口

3.3、文件信息获取接口


3.4、文件删除接口

4. 安装nginx

nginx 是轻量级的Web服务器,在开发中常常作为前端静态资源的代理的服务器。因为FastDFS 的http服务太弱,无法提供负载均衡等服务,所以需要借助fastdfs-nginx模块来进行http的服务,可以提高下载性能。

4.1、两台storage服务器安装nginx

将nginx以及fastdfs-nginx-module上传到 /usr/local/software 中并解压。
进入到fastdfs-nginx-module的解压文件夹下的src文件夹
编辑config文件 vim config
修改为如下内容(去掉local)

进入nginx解压文件夹中执行
./configure --prefix=/usr/local/software/nginx/ --add-module=/usr/local/software/fast-nginx-module/src
make && make install
将/usr/local/fastdfs-nginx-module/src的mod_fastdfs.conf拷贝到/etc/fdfs下修改该文件

base_path=/tmp
tracker_server=192.168.80.135:22122 #tracker服务器的IP地址以及端口号
tracker_server=192.168.80.137:22122
group_name=group1 #当前服务器的group名
url_have_group_name=true #文件url中是否有group名
store_path0=/fastdfs/storage #存储路径
group_count = 2 #设置组的个数
在末尾增加2个组的具体信息:
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage
修改 /usr/local/nginx/conf/nginx.conf ,修改内容如下

至此storage上部署nginx已经完成
启动nginx 命令 /usr/local/nginx/sbin/nginx

4.3、两台tracker服务器安装nginx

将nginx上传到 /usr/local/software 下并解压
进入到nginx的解压目录执行
./configure
make && make install
修改 /usr/local/nginx/conf/nginx.conf ,修改内容如下

保存退出启动nginx命令 /usr/local/nginx/sbin/nginx
至此tracker上的storage配置完成

4.4、配置nginx代理服务器

上传nginx安装包到192.168.80.134这台机器的 /usr/local/software 中并解压
./configure
make && make install
修改 /usr/local/nginx/conf/nginx.conf ,修改内容如下

保存退出启动nginx命令 /usr/local/nginx/sbin/nginx
至此代理服务器配置完成
可以通过访问代理服务器来浏览以及下载资源

5. 常用操作

1) upload 上传文件
2) upload_appender:上传appender文件,后续可已对其进行append操作
3) upload_slave:上传从文件
4) download 下载文件
5) delete 删除文件
6) append:在已有文件后追加内容
7) set_metadata:设置文件附加属性
8) get_metadata:获取文件附加属性

本人部署过程中遇到的一些问题(纯属自己的理解有错误的希望大家指出)

在本此部署过程中最初的部署模式是两台tracker服务器两台storage服务器,但是这两台storage服务器都隶属于group1,为了完成指定组上传文件这一需求,将192.168.80.136这台机器的组名重命名为group2,这时在程序中使用定向上传指定group2时就回出现获取不到这个storage。
在一些系列的研究过程中终于在fastdfs文件服务器迁移操作以及tracker与storage运行过程中记录配置文件的细微变化找到了一些原因。
在tracker启动后他会监测storage的连接,当有storage连接时他就会在 /fastdfs/tracker/data 中的一些配置文件中将storage的信息追加上去,同时storage在启动弄过程中也会进行同样的操作,它也会将自己的信息追加到配置文件中,正是这一个追加操作导致重命名组之前机器的组信息就回记录在tracker以及storage的那些配置文件中,当我重新命名这个机器的组信息后他们这台机器的信息继续追加到这些配置文件中,这就导致我136这台机器在这些运行过程中的记录配置文件中既有group1也有group2,并且group1记录在前,所以这台机器无法作为group2来进行操作,最终的解决办法就是将tracker以及storage的 /fastdfs/storage 以及 /fastdfs/tracker 文件夹重新加载配置启动(命令为 /usr/bin/fdfs_tracker /etc/fdfs/tracker.conf 以及 /usr/bin/fdfs_tracker /etc/fdfs/tracker.conf)重新对这些记录文件进行创建追加。
所以尽量不要随意的修改组信息这个过程遇到的问题很莫名其妙。

参考资料

https://blog.csdn.net/qq_33456887/article/details/78822718---------Linux_FastDFS分布式文件系统——搭建
https://blog.csdn.net/xiaoweiqb/article/details/68065618---------Centos7下FastDFS 集群配置及添加storage节点+nginx
https://blog.csdn.net/qq_32625839/article/details/82184739---------Nginx之upstream的四种配置方式
https://www.cnblogs.com/littleatp/p/4361318.html---------FastDFS-Nginx扩展模块源码分析
https://www.2cto.com/net/201712/704468.html---------大数据FastDFS基础知识学习
运维FastDFSlinux
朗读
赞(0)
版权属于:

FareCloud专注技术填坑

本文链接:

https://www.zachariah.cn/archives/17.html(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 李林超
    2021-07-21
  2. Leefs
    2021-07-17
  3. Leefs
    2021-06-28
  4. 马某人
    2021-01-09

    {!{data:image/png;base64,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}!}

  5. 吴萌
    2021-01-08

标签云