1. FastDFS简介

  说明:FastDFS简介部分的理论知识全部来自于博主bojiangzhou的 《用FastDFS一步步搭建文件管理系统》,在此感谢博主的无私分享。当然最最要感谢的是余庆老师,分享了这么好用的分布式文件系统。

1.1 FastDFS简介

  FastDFS是一个开源的高效分布式文件系统(DFS)。他主要功能包括:文件存储、文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(4KB ~ 500MB)为载体的在线服务。

  FastDFS系统有三个角色:跟踪服务器(Tracker Server),存储服务器(Storage Server),客户端(Client).

    • Tracker Server:跟踪服务器,主要做调度工作,起到负载均衡的作用;负载管理所有的Group和Group中的Storage Server,每个Storage Server在启动后会连接Tracker Server,高中自己所属的Group等信息,并保持周期心跳。
    • Storage Server:存储服务器,主要提供存储和备份服务;以Group为单位,每个Group内可以有一到多台Storage Server,Group内的多台Storage Server数据互为备份,Group的存储容量取决于该Group内最小Storage Server的容量。
    • Client:客户端,上传下载数据的服务器,也就是我们项目所部署的服务器。

1.2 FastDFS存储策略

  为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

  在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

1.3 FastDFS上传过程

  FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

  Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker Server之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker Server。

  当Tracker Server收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的Group,当选定了Group后就要决定给客户端分配Group中的哪一个Storage Server。当分配好Storage Server后,客户端向Storage Server发送写文件请求,Storage Server将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。

  

1.4 FastDFS文件同步

  写文件时,客户端将文件写至Group内一个Storage Server即认为写文件成功,Storage Server写完文件后,会由后台线程将文件同步至同Group内其他的Storage Server。

  每个Storage Server写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,Storage Server会记录向Group内其他Storage Server同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有Server的时钟保持同步。

  Storage Server的同步进度会作为元数据的一部分汇报到Tracker Server上,Tracke Server在选择读Storage Server的时候会以同步进度作为参考。

1.5 FastDFS的文件下载

  客户端uploadfile成功后,会拿到一个Storage Server生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

  跟upload file一样,在downloadfile时客户端可以选择任意Tracker Server。客户端发送download请求给某个Tracker Server,必须带上文件名信息,Tracke Server从文件名中解析出文件的Group、大小、创建时间等信息,然后为该请求选择一个Storage Server用来服务读请求。

  

2. FastDFS安装环境及拓扑图

  如图所示,使用FastDFS搭建一套分布式存储的文件系统,由于新版的FastDFS未提供Http功能,我们使用Nginx及fastdfs-nginx-module模块实现通过Http访问存储的内容。Tracker Server上的Nginx通过Keepalived实现高可用。上传功能使用Python客户端实现。

2.1 FastDFS分布式存储拓扑图

2.2 FastDFS安装环境

2.2.1 按照拓扑图所示准备服务器

  • 两台Tracker Server提高系统可用性,避免单点故障,同时对于客户端API,起到负载均衡的作用。
  • 每两台Storage Server组成一个Group。总共3个组。
  • API客户端使用Python客户端。
  • Storage Server上安装Nginx,提供Http功能。
  • Tracker Server上安装Nginx和fastdfs-nginx-module模块,与Tracker Server配合,为客户端提供Http功能,为后端Storage Server上的Nginx提供反向代理和负载均衡的作用。

2.2.2 安装环境说明

  Tracker Server、Storage Server服务由安装包fastdfs提供,而fastdfs安装包依赖于libfastcommon提供的库,Python客户端依赖于fastdfs和libfastcommon提供的库,所以所有服务器均需安装libfastcommon和fastdfs。

  Storage Server服务器上的Nginx只需提供Web服务功能,用于访问该服务器上存储的文件即可,不需安装fastdfs-nginx-module模块,当然安装也没问题。

  Tracker Server服务器上的Nginx需要安装fastdfs-nginx-module模块,Tracker Server可以根据路径获取文件所在的Storage Server的IP,Nginx需与Tracker Server交互获取该IP。

2.2.3 同步服务器时间,所有服务器启用ntp或chrony服务同步时间

  ntp或chrony服务的安装配置参考我的另外一篇博客:Linux - CentOS7上的时间同步

2.2.4 下载安装包

下载地址:

  FastDFS项目地址:https://github.com/happyfish100
  fastdfs下载地址:https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
  libfastcommon下载地址:https://github.com/happyfish100/libfastcommon/archive/V1.0.39.tar.gz
  fastdfs-nginx-module下载地址:https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz
  Nginx下载地址:http://nginx.org/download/nginx-1.12.2.tar.gz
  Python客户端下载地址:https://github.com/zhubiaook/fastdfs-python-client/archive/fdfs-python-client-v0.1.tar.gz

下载安装包

# 创建一个目录,存储下载的安装包
$ sudo mkdir /usr/local/src/fdfs
$ cd /usr/local/src/fdfs # 下载fastdfs:
sudo wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz # 下载libfastcommon
sudo wget https://github.com/happyfish100/libfastcommon/archive/V1.0.39.tar.gz # 下载fastdfs-nginx-module
sudo wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz # 下载Nginx
sudo wget http://nginx.org/download/nginx-1.12.2.tar.gz # 下载Python客户端
sudo wget https://github.com/zhubiaook/fastdfs-python-client/archive/fdfs-python-client-v0.1.tar.gz

3. FastDFS分布式存储搭建

3.1 所有服务器安装libfastcommon、fastdfs

安装libfastcommon

# 安装依赖库
sudo yum -y install gcc-c++ # 解压
sudo tar -xf V1.0.39.tar.gz
cd libfastcommon-1.0./ # 编译
sudo ./make.sh # 安装
sudo ./make.sh install

安装 fastdfs

# 解压
sudo tar -xf V5..tar.gz
cd fastdfs-5.11 # 编译
sudo ./make.sh # 安装
sudo ./make.sh install

3.2 配置跟踪器(Tracker Server)

两台Tracker Server的配置一样。

创建Tracker Server数据、日志文件存储路径

sudo mkdir /data/fdfs/tracker -p

修改配置文件

# 进入配置文件目录
$ cd /etc/fdfs # 复制配置文件
$ sudo cp tracker.conf.sample tracker.conf # 修改配置文件中的以下两行
$ sudo vim tracker.conf
base_path=/data/fdfs/tracker
http.server_port=

启动Tracker Server服务

# 方法1:
$ sudo service fdfs_trackerd start # 方法2:
$ sudo /etc/init.d/fdfs_trackerd start

查看监听的端口是否启动

$ sudo netstat -tunlp | grep
tcp 0.0.0.0: 0.0.0.0:* LISTEN /fdfs_trackerd

3.3 配置存储节点(Storage Server)

所有Storage Server的配置一样

创建Storage Server数据、日志文件存储路径

# data目录存储日志文件,file目录存储上传的文件目录
$ sudo mkdir /data/fdfs/{storage,file} -p

修改配置文件

# 进入配置文件目录
$ cd /etc/fdfs # 复制配置文件
$ sudo cp storage.conf.sample storage.conf # 修改配置文件以下几行内容
$ sudo vim storage.conf
group_name=group1 #此处填写所在的组,比如group1, group2, group3 ...
base_path=/data/fdfs/storage
store_path0=/data/fdfs/file
tracker_server=192.168.0.201
tracker_server=192.168.0.202
http.server_port=

启动Storage Server服务

$ sudo service fdfs_storaged start

查看监听的端口

$ sudo netstat -tunlp | grep
tcp 0.0.0.0: 0.0.0.0:* LISTEN /fdfs_storaged

测试Storage Server 与 Tracker Server 是否正常通信

[-- ::] DEBUG - base_path=/data/fdfs/storage, connect_timeout=, network_timeout=, tracker_server_count=, anti_steal_token=, anti_steal_secret_key length=, use_connection_pool=, g_connection_pool_max_idle_time=3600s, use_storage_id=, storage server id count: 

server_count=, server_index=

tracker server is 192.168.0.201:

group count: 

Group :
group name = group1
disk total space = MB
disk free space = MB
trunk free space = MB
storage server count =
active server count =
storage server port =
storage HTTP port =
store path count =
subdir count per path =
current write server index =
current trunk file id = Storage :
id = 192.168.0.203
ip_addr = 192.168.0.203 (192.168.0.203) ACTIVE
...
Storage :
id = 192.168.0.204
ip_addr = 192.168.0.204 (192.168.0.204) ACTIVE
... Group :
group name = group2
disk total space = MB
disk free space = MB
trunk free space = MB
storage server count =
active server count =
storage server port =
storage HTTP port =
store path count =
subdir count per path =
current write server index =
current trunk file id = Storage :
id = 192.168.0.205
ip_addr = 192.168.0.205 (192.168.0.205) OFFLINE
...
Storage :
id = 192.168.0.206
ip_addr = 192.168.0.206 (192.168.0.206) OFFLINE
...

3.4 上传、下载文件测试

  到目前为止,可以使用FastDFS提供的客户端工具进行文件的上传、下载、删除等操作,在任意一台Tracker Server或Storage Server上都安装了这些工具,下面我们在其中一台Tracker Server上进行文件上传、下载的测试。

a. 配置客户端

$ cd /etc/fdfs/
$ sudo cp client.conf.sample client.conf # 修改以下配置
$ sudo vim client.conf
connect_timeout=
base_path=/data/fdfs/client <=客户端日志存储路径
tracker_server=192.168.0.201:
tracker_server=192.168.0.202:
http.tracker_server_port=

b. 上传文件

# 新建一个文件,然后将此文件上传到FastDFS中
$ echo 'Hello World' > ~/test.html # 上传文件
$ fdfs_upload_file /etc/fdfs/client.conf ~/test.html
group1/M00///wKgAy1vAVbKAB66QAAAADAsMGmk02.html

文件上传后,返回一个文件存储的路径 group1/M00///wKgAy1vAVbKAB66QAAAADAsMGmk02.html ,路径由以下及部分组成

  组名:group1

  磁盘:M00

  Storage Server上存储路径:00/00/wKgAy1vAVbKAB66QAAAADAsMGmk02.html

c. 下载文件

$ fdfs_download_file /etc/fdfs/client.conf group1/M00///wKgAy1vAVbKAB66QAAAADAsMGmk02.html

3.5 安装配置存储节点(Storage Server)上的Nginx

a. 安装Nginx

安装Nginx,存储节点上的Nginx可以使用Yum安装,也可以自己编译安装

方法1:使用YUM安装

$ sudo yum -y install nginx

方法2:编译安装

# 安装依赖包
$ sudo yum -y install openssl-devel pcre-devel # 创建系统用户nginx
$ useradd nginx -r # 解压Nginx
$ sudo tar -xvf nginx-1.12..tar.gz
$ cd nginx-1.12. # 执行./configure,生成Makefile文件
sudo ./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-debug \
--with-http_ssl_module # 编译
$ sudo make # 安装
$ sudo make install

b. 配置Nginx

$ vim /etc/nginx/conf.d/fdfs.conf
server {
listen ;
server_name localhost; location ~ ^/group[-]/M00/(.*) {
alias /data/fdfs/file/data/$;
}
}

c. 本机上访问文件(注意,访问的路径属于哪个组,就在哪个组下的Storage Server上测试)

$ curl http://127.0.0.1/group1/M00/00/00/wKgAy1vAVbKAB66QAAAADAsMGmk02.html
Hello World

3.6 安装配置跟踪器(Tracker Server)上的Nginx

  跟踪器上的Nginx,需要增加 fastdfs-nginx-module模块,只能通过编译安装完成

a. 安装Nginx所需的依赖包

$ sudo yum -y install pcre-devel openssl-devel zlib-devel

b. 解压fastdfs-nginx-module模块,并修改配置文件,否则Nginx编译的时候会报错。

$ 解压
$ sudo tar -xvf V1..tar.gz # 修改配置文件
$ sudo vim fastdfs-nginx-module-1.20/src/config
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon"

c. 创建nginx用户

$ sudo useradd nginx -r

d. 安装Nginx

# 解压nginx
$ sudo tar -xvf nginx-1.12..tar.gz # 进入nginx源码目录进行编译安装
$ cd nginx-1.12. # 执行configure
$ sudo ./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \--pid-path=/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-debug \
--with-http_ssl_module \
--add-module=../fastdfs-nginx-module-1.20/src # 编译
$ sudo make # 安装
$ sudo make install

e. 复制fastdfs-nginx-module-1.20中的配置文件到/etc/fdfs目录下,并进行修改

$ sudo cp fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/
$ sudo vim /etc/fdfs/mod_fastdfs.conf
# 连接超时时间
connect_timeout=
# Tracker Server
tracker_server=192.168.0.201:
tracker_server=192.168.0.202:
# StorageServer 默认端口
storage_server_port=
# 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true

f. 复制fastdfs-5.11目录中的部分配置文件到/etc/fdfs目录下

$ cd fastdfs-5.11/conf/
$ sudo cp anti-steal.jpg http.conf mime.types /etc/fdfs/

g. 修改nginx配置文件

$ sudo vim /etc/nginx/conf.d/fdfs.conf
server {
listen ;
server_name file.zjqrkj.cn; location / {
index index.html index.htm;
root /data/fdfs/file/data;
} location ~/group([-])/M00 {
ngx_fastdfs_module;
} error_page /.html;
client_max_body_size 20M;
keepalive_timeout ;
}

h. 访问测试

$ curl http://192.168.0.201/group1/M00/00/00/wKgAy1vAVbKAB66QAAAADAsMGmk02.html
Hello World $ curl http://192.168.0.202/group1/M00/00/00/wKgAy1vAVbKAB66QAAAADAsMGmk02.html
Hello World

3.7 安装配置Keepalived,实现跟踪器上的Nginx高可用

  VRRP ( Virtual Router Redundancy Protocol ) 是一种容错协议,它保证当主机的下一跳路由器出现故障,由另外一台路由器来代替出现故障的路由器进行工作,从而保证网络通信的可靠性。Keepalived 是Linux系统上VRRP协议的实现,Keepalived与Nginx反向代理服务器等配合使用,实现高可用。

  我的另外一篇博客介绍了安装、配置过程,此处不再连篇累牍,参考:Keepalived+LVS/Nginx 实验

3.8 安装Python客户端

a. 安装python-devel

sudo yum -y install python-devel

b. 解压sudo tar -xvf fdfs-python-client-v0.1.tar.gz,并复制该目录下的fastdfspyclient到 fastdfs-5.11源码目录下的client文件夹中

# 解压
$ sudo tar -xvf fdfs-python-client-v0..tar.gz # 复制文件
$ sudo cp -ar fastdfs-python-client-fdfs-python-client-v0./fastdfspyclient fastdfs-5.11/client/

c. 进入fastdfspyclient目录下,执行make生成fdfspyclient.so文件

$ cd fastdfs-5.11/client/fastdfspyclient/

# 执行make
$ sudo make

d. 此时可以将源码目录下的client目录复制到本机的其他目录,作为Python客户端。此处我们暂且复制到家目录下。

cp -ar /usr/local/src/fdfs/fastdfs-5.11/client ~/

e. 修改该目录下的客户端配置文件

$ sudo vim client/fastdfspyclient/client.conf
# 日志存储路径
base_path=/data/fdfs/client
# tracker server
tracker_server=192.168.0.201:
tracker_server=192.168.0.202:

f. 创建客户端日志存储路径

$ sudo mkdir /data/fdfs/client

g. 测试,可以参照fastdfspyclient目录下的fdfstest.py进行模拟测试

# 创建测试文件
$ echo "Something so beautiful" > ~/test.html $ cd client/fastdfspyclient/
$ python
Python 2.7. (default, Jul , ::)
>>> import fdfspyclient as fp
>>> fp.fdfs_init('client.conf')
[-- ::] DEBUG - base_path=/data/fdfs/client, connect_timeout=, network_timeout=, tracker_server_count=, anti_steal_token=, anti_steal_secret_key length=, use_connection_pool=, g_connection_pool_max_idle_time=3600s, use_storage_id=, storage server id count: >>> result, groupname, remotefilename, fileurl = fp.fdfs_upload("/home/zhubiao/test.html", None)
>>> result >>> fileurl
'http://192.168.0.204/group1/M00/00/00/wKgAzFvAdciAKY4iAAAAF_Cudkk79.html'

4. 参考文档

[博客] 用FastDFS一步步搭建文件管理系统

[GitHub] 官网FastDFS托管仓库

[GitHub] FastDFS Python 客户端

Linux - 搭建FastDFS分布式文件系统的更多相关文章

  1. 07.Linux系统-Fastdfs分布式文件系统-互为主从配置搭建部署

    Fastdfs分布式文件系统-互为主从配置部署 1.安装基础依赖 yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl ...

  2. 简单搭建FastDFS分布式文件系统(简单易懂)

    一.什么是FastDFS FastDFS一个开源的轻量级分布式文件系统,它对文件进行管理,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,功能包括:文件存储.文件同步.文件访 ...

  3. CentOS 7.2搭建FastDFS 分布式文件系统,实现高可用集群

    分布式集群搭建结构 双Tracker 2组Group 轮询存储策略 Keepalived+Nginx高可用 Nginx缓存 4个存储节点 一. 集群规划清单 1.安装清单 软件名称 版本 百度云盘存放 ...

  4. 基于docker容器搭建fastdfs分布式文件系统

    本次环境的搭建参考了 https://blog.csdn.net/qq_43455410/article/details/84797814, 感谢博主. 主要流程如下: 1. 下载fastdfs镜像 ...

  5. FastDFS分布式文件系统

    FastDFS分布式文件系统 阅读目录 相关文章 1 分布式文件系统介绍 2 系统架构介绍 3 FastDFS性能方案 4 Linux基本命令操作 5 安装VirtualBox虚拟机并配置Ubuntu ...

  6. FastDFS 分布式文件系统部署实战及基本使用

    FastDFS 分布式文件系统部署实战及基本使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. FastDFS是一个开源的高性能分布式文件系统.它的主要功能包括:文件存储,文件同步 ...

  7. CentOS7 安装FastDFS分布式文件系统

    CentOS7 安装FastDFS分布式文件系统 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家 ...

  8. django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除

    运维使用docker部署好之后FastDFS分布式文件系统之后,提供给我接口如下: fastdfs tracker 192.168.1.216 192.168.1.217 storage 192.16 ...

  9. FastDFS分布式⽂文件系统

    FastDFS分布式⽂文件系统  1. 什么是FastDFS FastDFS 是⽤用 c 语⾔言编写的⼀一款开源的分布式⽂文件系统.FastDFS 为互联⽹网量量身定制, 充分考虑了了冗余备份.负载均 ...

随机推荐

  1. iOS 网络请求数据缓存

    1. NSURLCache简介: iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种) NSURLRequestUseProtocolCachePolicy // 默认的缓存策 ...

  2. myBatis组件之缓存实现及使用

    一 .概述 先讲缓存实现,主要是mybatis一级缓存,二级缓存及缓存使用后续补充 Mybatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能:除核心功能之外,有很多额外的附加 ...

  3. Spring 中面向AOP之一系列做法

    Spring的AOP实现是通过集成AspectJ框架实现的. 想必这句话大家都知道了吧,不知道也没关系,最起码你现在知道了. 四种实现方案,接下来我们一一去揭开它的神秘的面纱....... 第一种(伪 ...

  4. Spring Boot—12URL映射

    package com.sample.smartmap.controller; import java.util.List; import org.springframework.beans.fact ...

  5. WebGIS点要素渲染性能测试

    $('#stationQuery').bind('click', function(){ var drawStyle = $.extend( { }, map.geomap( "option ...

  6. CSS 几款比较常用的翻转特效

    第一个:360度翻转特效 <style>* { margin:0; padding:0; } .aa { width: 220px; height: 220px; margin: 0 au ...

  7. flutter开发中常用的dart插件

    flutter插件官网地址:https://pub.dartlang.org/packages/ 1. image_picker 一个可以从图库选择图片,并可以用相机拍摄新照片的flutter插件 2 ...

  8. 切换Fragment时实现数据保持

    摘要 Fragment设计初衷是为了简化不同屏幕分辨率的开发难度,他将代表一个功能的UI及其相关数据看做一个模块,以便达到复用.可以将Fragment看作是一个可以嵌入布局中的activity,有自己 ...

  9. the interconversion of String and StringBuilder

    package com.itheima_03; /* * StringBuilder和String的相互转换 * * StringBuilder -- String * public String t ...

  10. 自定义RatingBar评分控件

    1.介绍 实现类似美团外卖评分供能,系统提供了RatingBar,今天来自定义一波,当做自定义view的一个学习,效果如下,能够滑动或者点击变化星星数量 2.自定义属性 在values目录下的attr ...