Linux - 搭建FastDFS分布式文件系统
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分布式文件系统的更多相关文章
- 07.Linux系统-Fastdfs分布式文件系统-互为主从配置搭建部署
Fastdfs分布式文件系统-互为主从配置部署 1.安装基础依赖 yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl ...
- 简单搭建FastDFS分布式文件系统(简单易懂)
一.什么是FastDFS FastDFS一个开源的轻量级分布式文件系统,它对文件进行管理,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,功能包括:文件存储.文件同步.文件访 ...
- CentOS 7.2搭建FastDFS 分布式文件系统,实现高可用集群
分布式集群搭建结构 双Tracker 2组Group 轮询存储策略 Keepalived+Nginx高可用 Nginx缓存 4个存储节点 一. 集群规划清单 1.安装清单 软件名称 版本 百度云盘存放 ...
- 基于docker容器搭建fastdfs分布式文件系统
本次环境的搭建参考了 https://blog.csdn.net/qq_43455410/article/details/84797814, 感谢博主. 主要流程如下: 1. 下载fastdfs镜像 ...
- FastDFS分布式文件系统
FastDFS分布式文件系统 阅读目录 相关文章 1 分布式文件系统介绍 2 系统架构介绍 3 FastDFS性能方案 4 Linux基本命令操作 5 安装VirtualBox虚拟机并配置Ubuntu ...
- FastDFS 分布式文件系统部署实战及基本使用
FastDFS 分布式文件系统部署实战及基本使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. FastDFS是一个开源的高性能分布式文件系统.它的主要功能包括:文件存储,文件同步 ...
- CentOS7 安装FastDFS分布式文件系统
CentOS7 安装FastDFS分布式文件系统 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家 ...
- django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除
运维使用docker部署好之后FastDFS分布式文件系统之后,提供给我接口如下: fastdfs tracker 192.168.1.216 192.168.1.217 storage 192.16 ...
- FastDFS分布式⽂文件系统
FastDFS分布式⽂文件系统 1. 什么是FastDFS FastDFS 是⽤用 c 语⾔言编写的⼀一款开源的分布式⽂文件系统.FastDFS 为互联⽹网量量身定制, 充分考虑了了冗余备份.负载均 ...
随机推荐
- iOS 网络请求数据缓存
1. NSURLCache简介: iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种) NSURLRequestUseProtocolCachePolicy // 默认的缓存策 ...
- myBatis组件之缓存实现及使用
一 .概述 先讲缓存实现,主要是mybatis一级缓存,二级缓存及缓存使用后续补充 Mybatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能:除核心功能之外,有很多额外的附加 ...
- Spring 中面向AOP之一系列做法
Spring的AOP实现是通过集成AspectJ框架实现的. 想必这句话大家都知道了吧,不知道也没关系,最起码你现在知道了. 四种实现方案,接下来我们一一去揭开它的神秘的面纱....... 第一种(伪 ...
- Spring Boot—12URL映射
package com.sample.smartmap.controller; import java.util.List; import org.springframework.beans.fact ...
- WebGIS点要素渲染性能测试
$('#stationQuery').bind('click', function(){ var drawStyle = $.extend( { }, map.geomap( "option ...
- CSS 几款比较常用的翻转特效
第一个:360度翻转特效 <style>* { margin:0; padding:0; } .aa { width: 220px; height: 220px; margin: 0 au ...
- flutter开发中常用的dart插件
flutter插件官网地址:https://pub.dartlang.org/packages/ 1. image_picker 一个可以从图库选择图片,并可以用相机拍摄新照片的flutter插件 2 ...
- 切换Fragment时实现数据保持
摘要 Fragment设计初衷是为了简化不同屏幕分辨率的开发难度,他将代表一个功能的UI及其相关数据看做一个模块,以便达到复用.可以将Fragment看作是一个可以嵌入布局中的activity,有自己 ...
- the interconversion of String and StringBuilder
package com.itheima_03; /* * StringBuilder和String的相互转换 * * StringBuilder -- String * public String t ...
- 自定义RatingBar评分控件
1.介绍 实现类似美团外卖评分供能,系统提供了RatingBar,今天来自定义一波,当做自定义view的一个学习,效果如下,能够滑动或者点击变化星星数量 2.自定义属性 在values目录下的attr ...