FastDFS原理及部署

FastDFS是一个c语言编写的一个开源的轻量级分布式文件系统,它对文件进程管理,功能包括:文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务,如相册网站,视频网站等等,FastDFS为互联网量身定制,充分考虑了冗余备份,负载均衡,现行扩容等,并注重高可用,高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载服务。

一、FastDFS原理及架构详解

1、FastDFS架构
FastDFS架构包括Tracker server和Storage server,client请求Tracker server 进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。

Tracker server:负责调度及负载均衡,通过Tracker server,在文件上传时可以根据一些策略找到Storage server来提供上传服务,可以将tracker称为追踪服务器或调度服务器;
Storage server:负责文件最终存储,客户端上传的文件最终存储在storage服务器上,Storage server没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将storage称为存储服务器。


2、Fast DFS系统的角色
Fast DFS系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

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

3、Fast DFS原理
关于模块:跟踪服务器和存储节点都可以由一台或多台服务器构成,跟踪服务器和存储节点均可以随时增加或者下线不会影响线上服务,其中跟踪服务器中所有服务器是对 等,可以根据服务器压力情况随时增加或减少

4、文件上传流程
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。


客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。
文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

5、文件下载流程

client发送download请求给某个tracker,必须带上文件名信息,tracker从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求,由于group内的文件同步时在后台是异步的,所以有可能出现在读的时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage:
文件创建时间戳-storage被同步到的时间戳 且(当前时间-文件创建时间戳)>文件同步最大时间(5分钟),说明文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。

二、部署Fast DFS

1、环境如下

博文中所用软件包均可在(提取码:koxu)下载

由于有一些重复性的安装操作,所以找大佬写了个脚本,可以在进行那些重复性操作时,执行这个脚本。在上述链接中就有此脚本
2、配置tracker1

[[email protected] ~]# mkdir fastdfs
[[email protected] ~]# cd fastdfs/
[[email protected] fastdfs]# ls
fastdfs.tar.gz  install.sh  libfastcommon.tar.gz
[[email protected] fastdfs]# sh install.sh            # 执行脚本
tracker server install succees .......
[[email protected] fastdfs]# /etc/init.d/fdfs_trackerd start            # 起服务
Reloading systemd:                                         [  OK  ]
Starting fdfs_trackerd (via systemctl):                    [  OK  ]
[[email protected] fastdfs]# netstat -anput | grep 22122          # 确认端口在监听
tcp        0      0 192.168.171.134:22122   0.0.0.0:*               LISTEN      3847/fdfs_trackerd  

3、配置tracker2

[[email protected] ~]# mkdir fastdfs
[[email protected] ~]# cd fastdfs/
[[email protected] fastdfs]# ls
fastdfs.tar.gz  install.sh  libfastcommon.tar.gz
[[email protected] fastdfs]# sh install.sh
tracker server install succees .......
[[email protected] fastdfs]# /etc/init.d/fdfs_trackerd start
Reloading systemd:                                         [  OK  ]
Starting fdfs_trackerd (via systemctl):                    [  OK  ]
[[email protected] fastdfs]# netstat -anput | grep 22122
tcp        0      0 192.168.171.135:22122   0.0.0.0:*               LISTEN      4276/fdfs_trackerd  

4、配置storage1

[[email protected] ~]# mkdir fastdfs
[[email protected] ~]# cd fastdfs/
[[email protected] fastdfs]# tar zxf libfastcommon.tar.gz
[[email protected] fastdfs]# tar zxf fastdfs.tar.gz
[[email protected] libfastcommon-1.0.43]# ./make.sh && ./make.sh install
[[email protected] libfastcommon-1.0.43]# cd ../fastdfs-6.06/
[[email protected] fastdfs-6.06]# ./make.sh && ./make.sh install
[[email protected] fastdfs-6.06]# cd conf/
[[email protected] conf]# cp mime.types http.conf /etc/fdfs/
[[email protected] conf]# cd ../../
[[email protected] fastdfs]# tar zxf fastdfs-nginx-module.tar.gz
[[email protected] fastdfs]# cp fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[[email protected] fastdfs]# cd /etc/fdfs/
[[email protected] fdfs]# mkdir -p /data/storage-fdfs/base        # 建议分开放
[[email protected] fdfs]# mkdir -p /data/storage-fdfs/store
[[email protected] fdfs]# cp storage.conf.sample storage.conf
[[email protected] fdfs]# vim storage.conf
group_name = group1
bind_addr =192.168.171.140
base_path = /data/storage-fdfs/base           #数据和日志目录地址
store_path0 = /data/storage-fdfs/store             # 存储地
tracker_server = 192.168.171.134:22122             #以下是指定tracker-server的监听地址
tracker_server = 192.168.171.135:22122
http.server_port = 8888                 #http访问文件的端口
[[email protected] fdfs]# vim mod_fastdfs.conf
base_path=/data/storage-fdfs/base
tracker_server=192.168.171.134:22122
tracker_server=192.168.171.135:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true            #当group有多个的时候需要更改为true,以组名去访问
store_path0=/data/storage-fdfs/store
group_count = 2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/storage-fdfs/store
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/data/storage-fdfs/store
#编译安装nginx并添加第三方模块
[[email protected] fdfs]# cd ~/fastdfs/
[[email protected] fastdfs]# yum -y install pcre-devel openssl-devel
[[email protected] fastdfs]# tar zxf nginx-1.16.1.tar.gz
#注意下面的第三方nginx模块路径,要与自己的对应
[[email protected] fastdfs]# cd nginx-1.16.1/
[[email protected] nginx-1.16.1]# ./configure --add-module=/root/fastdfs/fastdfs-nginx-module-1.22/src && make && make install
[[email protected] nginx-1.16.1]# vim /usr/local/nginx/conf/nginx.conf
#在原来的server字段上面(34行)添加以下内容
    server {
        listen 8888;
        server_name localhost;
        location ~/group[0-9]/M00/ {
                ngx_fastdfs_module;
        }
}
[[email protected] nginx-1.16.1]# /etc/init.d/fdfs_storaged start
Starting fdfs_storaged (via systemctl):                    [  确定  ]
[[email protected] nginx-1.16.1]# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=16712
#确定相关端口在监听
[[email protected] conf]# netstat -anput | grep 23000
[[email protected] conf]# netstat -anpt | grep 80
[[email protected] conf]# netstat -anpt | grep 8888

4、配置主机storage02

[[email protected] fastdfs]# tar zxf libfastcommon.tar.gz
[[email protected] fastdfs]# tar zxf fastdfs.tar.gz
[[email protected] fastdfs]# cd libfastcommon-1.0.43/
[[email protected] libfastcommon-1.0.43]# ./make.sh && ./make.sh install
[[email protected] libfastcommon-1.0.43]# cd ../fastdfs-6.06/
[[email protected] fastdfs-6.06]# ./make.sh && ./make.sh install
[[email protected] fastdfs-6.06]# cd conf/
[[email protected] conf]# cp mime.types http.conf /etc/fdfs/
[[email protected] conf]# cd ../../
[[email protected] fastdfs]# tar zxf fastdfs-nginx-module.tar.gz
[[email protected] fastdfs]# cd /etc/fdfs/
#将storage01修改后的配置文件复制到本地
[[email protected] fdfs]# scp [email protected]:/etc/fdfs/storage.conf /etc/fdfs/
[[email protected] fdfs]# scp [email protected]:/etc/fdfs/mod_fastdfs.conf /etc/fdfs/
[[email protected] fdfs]# vim storage.conf           # 修改复制后的配置文件
group_name = group2
bind_addr =192.168.171.143
[[email protected] fdfs]# vim mod_fastdfs.conf
group_name=group2
[[email protected] fdfs]# mkdir -p /data/storage-fdfs/base
[[email protected] fdfs]# mkdir -p /data/storage-fdfs/store
#安装nginx
[[email protected] fdfs]# cd ~/fastdfs/
[[email protected] fastdfs]# tar zxf nginx-1.16.1.tar.gz
[[email protected] fastdfs]# yum -y install pcre-devel openssl-devel
[[email protected] nginx-1.16.1]# ./configure --add-module=/root/fastdfs/fastdfs-nginx-module-1.22/src/ && make && make install
[[email protected] nginx-1.16.1]# cd /usr/local/nginx/conf/
#将storage01主机的配置文件复制过来即可
[[email protected] conf]# scp [email protected]:/usr/local/nginx/conf/nginx.conf ./
[[email protected] ~]# /etc/init.d/fdfs_storaged start
Starting fdfs_storaged (via systemctl):                    [  确定  ]
[[email protected] ~]# /usr/local/nginx/sbin/nginx
ngx_http_fastdfs_set pid=5694
[[email protected] conf]# netstat -anput | grep 23000
[[email protected] conf]# netstat -anpt | grep 80
[[email protected] conf]# netstat -anpt | grep 8888

5、配置主机nginx提供反向代理功能

[[email protected] ~]# tar zxf nginx-1.16.1.tar.gz
[[email protected] ~]# yum -y install pcre-devel openssl-devel
[[email protected] ~]# cd nginx-1.16.1/
[[email protected] nginx-1.16.1]# ./configure && make && make install
[[email protected] nginx-1.16.1]# vim /usr/local/nginx/conf/nginx.conf
#找到http字段
http {
    include       mime.types;
    default_type  application/octet-stream;
    #添加如下内容
    upstream fdfs_group1 {
        server 192.168.171.140:8888 weight=1 max_fails=2 fail_timeout=30s;
        }
    upstream fdfs_group2 {
        server 192.168.171.143:8888 weight=1 max_fails=2 fail_timeout=30s;
        }
    #找到server字段
 server {
        listen       80;
        server_name  localhost
        #charset koi8-r
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
                #添加如下内容
        location ~/group1 {
                proxy_pass http://fdfs_group1;
        }
        location ~/group2 {
                proxy_pass http://fdfs_group2;
        }
[[email protected] nginx-1.16.1]# /usr/local/nginx/sbin/nginx
[[email protected] nginx-1.16.1]# netstat -anput |grep 80

6、客户端验证服务是否可以正常使用

[[email protected] ~]# mkdir fastdfs
[[email protected] ~]# cd fastdfs/
[[email protected] fastdfs]# tar zxf libfastcommon.tar.gz
[[email protected] fastdfs]# tar zxf fastdfs.tar.gz
[[email protected] fastdfs]# cd libfastcommon-1.0.43/
[[email protected] libfastcommon-1.0.43]# ./make.sh && ./make.sh install
[[email protected] libfastcommon-1.0.43]# cd ../fastdfs-6.06/
[[email protected] fastdfs-6.06]# ./make.sh && ./make.sh install
[[email protected] fastdfs-6.06]# cd /etc/fdfs/
[[email protected] fdfs]# cp client.conf.sample client.conf
[[email protected] fdfs]# vim /etc/fdfs/client.conf
base_path = /data/storage-fdfs/base
tracker_server = 192.168.171.134:22122
tracker_server = 192.168.171.135:22122
[[email protected] ~]# mkdir -p /data/storage-fdfs/store
[[email protected] ~]# ls test.jpg
test.jpg
[[email protected] ~]# fdfs_upload_file /etc/fdfs/client.conf test.jpg          # 上传
group2/M00/00/00/wKirj15-NhGAIeapAAFEF6rSzeI524.jpg
#上面返回的信息需要保存,访问这个图片时需要
[[email protected] ~]# fdfs_download_file /etc/fdfs/client.conf group2/M00/00/00/wKirj15-NhGAIeapAAFEF6rSzeI524.jpg b.jpg
[[email protected] ~]# ls b.jpg
b.jpg                 # 可以看到已经下载并且更改名称了

浏览器访问nginx反向代理+上传图片时返回的ID

最后附加几条FastDFS命令

fdfs_upload_file  Usage:
fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]
用于上传文件
用法为 fdfs_upload_file + 配置文件 + 文件
fdfs_download_file  Usage:
fdfs_download_file <config_file> <file_id> [local_filename] [<download_offset> <download_bytes>]
用于下载文件
用法为 fdfs_download_file + 配置文件 + 文件
fdfs_file_info Usage:
fdfs_file_info <config_file> <file_id>
用于查看文件信息
用法为 fdfs_file_info + 配置文件 + 文件
fdfs_delete_file  Usage:
fdfs_delete_file <config_file> <file_id>
用于删除文件
用法为 fdfs_delete_file + 配置文件 + 文件
fdfs_monitor  Usage:
fdfs_monitor <config_file> [-h <tracker_server>] [list|delete|set_trunk_server <group_name> [storage_id]]
用于查看集群信息
用法为 fdfs_monitor + 配置文件 

原文地址:https://blog.51cto.com/14227204/2482589

时间: 2024-11-13 06:37:27

FastDFS原理及部署的相关文章

FastDFS集群部署

之前介绍过关于FastDFS单机部署,详见博文:FastDFS+Nginx(单点部署)事例 下面来玩下FastDFS集群部署,实现高可用(HA) 服务器规划: 跟踪服务器1[主机](Tracker Server):10.100.139.121 跟踪服务器2[备机](Tracker Server):10.100.138.180 存储服务器1(Storage Server):10.100.139.121 存储服务器2(Storage Server):10.100.138.180 存储服务器3(Sto

分布式文件系统FastDFS原理介绍

在生产中我们一般希望文件系统能帮我们解决以下问题,如:1.超大数据存储:2.数据高可用(冗余备份):3.读/写高性能:4.海量数据计算.最好还得支持多平台多语言,支持高并发. 由于单台服务器无法满足以上要求,这就迫使开发者不得不考虑使用其他方式解决此类问题.分布式文件系统就在这样迫切的需求下孕育而生. 今天为什么把标题定为“分布式文件系统”呢?是因为我想通过此次分享(FastDFS原理介绍),和大家去做更多关于分布式文件系统的研究和分享.我想这项研究应该会是一个“系列”性的专题.在本文之后还计划

(转)heartbeat原理及部署

原文:http://yjy724.blog.51cto.com/10897133/1840794---------------------------------------------------heartbeat原理及部署 1. Heartbeat介绍 1.1 Heartbeat作用 通过它可以将资源(IP及程序服务等资源)从一台故障计算机快速转移到另一台运转正常的机器继续提供服务,在实际生产应用场景中,heartbeat的功能和另一个高可用开源软件keepalived有很多相同之处 1.2

FastDFS 集群部署

FastDFS 集群部署 官网https://github.com/happyfish100 FastDFS是一款开源的高性能分布式文件系统(DFS).主要功能:文件存储,文件同步和文件访问,以及高容量和负载平衡.主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的在线服务. FastDFS系统有三个角色:跟踪服务器(Tracker Server).存储服务器(Storage Server)和客户端(Clinet). Tracker

一、分布式文件系统FastDFS原理及入门

1.简介:FastDFS是用C语言编写的一款开源的分布式文件系统,FastDSF充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等特点,使用FastDFS可以很容易的搭建一套高性能的文件服务器集群提供文件上传.下载等服务. 2.原理:FastDFS系统结构如下图所示: FastDFS分为Tracker.Storage,其中Storage负责存储文件,Tracker负责存储文件所在地址,主要作用是负载均衡和资源调度. Tracker.Storage都可以实现集群部署,Tracke

jenkins集群测试环境原理、部署

Jenkins自动化构建成过程,可帮助我们节省大量时间,完成这个过程的自动化后,在以后的开发过程中,我们需要做的,就是只是提交代码到版本库中,构建自动完成,基本不再需要人工干预. 代码仓库作为构建的素材库,构建所需的代码从代码库中获得. 最好有一台服务器单独作为持续集成服务器,一方面保证了环境的纯净,一方面不影响开发,而且持续集成服务器一般是随时准备开始构建的,所以一般也不关机. 1 [首先要有统一的代码库,服务器不断从版本控制服务器上检查代码状态,看代码是否有更新.如果发现有代码更新,那么就从

sersync+rsync原理及部署

一.为什么要用rsync+sersync架构? 1.sersync是基于inotify开发的,类似于inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录 二.rsync+inotify-tools与rsync+sersync架构的区别? 1.rsync+inotify-tools a.inotify只能记录下被监听的目录发生了变化(增,删,改)并没

heartbeat原理及部署

1. Heartbeat介绍 1.1 Heartbeat作用 通过它可以将资源(IP及程序服务等资源)从一台故障计算机快速转移到另一台运转正常的机器继续提供服务,在实际生产应用场景中,heartbeat的功能和另一个高可用开源软件keepalived有很多相同之处 1.2 Heartbeat工作原理 通过修改配置文件,指定哪一台Heartbeat服务器作为主服务器,则另一台将自动成为备份服务器.然后在指定备份服务器上配置Heartbeat守护进程来监听来自主服务器的心跳.如果备份服务器在指定时间

FastDFS原理系列文章

基于FastDFS 5.03/5.04 2014-12-19 一.概述 FastDFS文档极少,仅仅能找到一些宽泛的架构文档,以及ChinaUnix论坛上作者对网友提问的一些回答.对于要将FastDFS应用到生产系统来说,这点了解绝对是不够的. 这段时间研究FastDFS源代码,而且做了大量的性能測试.中间也做了大量的笔记.基本上把程序的结构与基本的操作摸索清楚,因此写了一些文章即是对前段工作的总结,同一时候也分享给想很多其它了解FastDFS内部的同行们. 这里对每篇文章做个介绍. 1.机器之