FastDFS理论、安装、使用

概述

服务介绍

FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储用户图片、视频、文档等文件。他的主要功能包括:文件存储,文件同步和访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合中小文件(建议范围:4kb<file_size<500M)为载体的在线服务,fastdfs的作者是淘宝资深架构师余庆
FastDFS比较适合以中小文件为载体的在线服务,比如跟NGINX(APACHE)配合搭建图片服务器。

服务组成

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

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

原理解析

关于模块
  • 跟踪服务器和存储节点都可以由一台或多台服务器构成。跟踪服务器和存储节点均可以随时增加或者下线而不会影响线上服务。其中跟踪服务器中所有服务器是对等的,可以根据服务器的压力情况随时增加或减少。
  • 为了支持大容量,存储节点采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相对独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将他们配置为一个新的卷,这样就扩大了存储系统的容量。
关于存储
  • storage接收写请求时,会根据配置好的规则,选择其中一个存储目录来存储文件;为避免单个目录下的文件过多,storage第一次启动时,会在每个数据存储目录里创建子2级子目录,每级256个,共65536个,新写的文件以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中
关于同步
  1. 新增tracker服务器数据同步问题
    由于 storage server 上配置了所有的 tracker server. storage server 和 trackerserver 之间的通信是由 storage server 主动发起的,storage server 为每个 tracker server 启动一个线程进行通信;在通信过程中,若发现该 tracker server 返回的本组 storage server列表比本机记录少,就会将该tracker server上没有的storage server 同步给该 tracker,这样的机制使得 tracker 之间是对等关系,数据保持一致
  2. 新增storage服务器数据同步问题
    若新增storage server或者其状态发生变化,tracker server都会将storage server列表同步给该组内所有 storage server;以新增 storage server 为例,因为新加入的 storage server 会主动连接 tracker server,tracker server 发现有新的 storage server 加入,就会将该组内所有的 storage server 返回给新加入的 storage server,并重新将该组的storage server列表返回给该组内的其他storage server;
  3. 组内storage数据同步问题
    组内storage server之间是对等的,文件上传、删除等操作可以在组内任意一台storageserver 上进行。文件同步只能在同组内的 storage server 之间进行,采用 push 方式, 即源服务器同步到目标服务器

####关于上传

流程
在这里插入图片描述

  1. client询问tracker上传到的storage,不需要附加参数
  2. tracker返回一台可用的storage
  3. client直接和storage通讯完成文件上传
关于下载

在这里插入图片描述

  1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名)
  2. tracker返回一台可用的storage
  3. client直接和storage通讯完成文档下载

client发送download请求给某个tracker,必须带上文件名信息,tracker从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求,由于group内的文件同步时在后台是异步的,所以有可能出现在读的时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage

该文件上传到的源头storage - 源头storage只要存活着,肯定包含这个文件,源头的地址编码在文件里

文件创建时间戳-storage被同步到的时间戳 且(当前时间-文件创建时间戳)>文件同步最大时间(5分钟),说明文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了

(当前时间-文件创建时间戳)>同步延迟阈值(如一天)。说明经过同步延迟阈值时间,认为文件肯定同步过了

服务架构案例

在这里插入图片描述

组件安装

环境说明:centos7系统

2台tracker server
4台storage server 分group1 group2
1台nginx代理服务器

服务器规划
ip说明
192.168.43.249nginx proxy
192.168.43.74tracker server1
192.168.43.253tracker server2
192.168.43.147storage server group1
192.168.43.210storage server group1
192.168.43.104storage server group2
192.168.43.217storage server group2
磁盘目录规划
说明位置
所有安装包/usr/local/src
数据存储位置/home/dfs
安装编译环境(所有节点)

mkdir /home/dfs
cd /usr/local/src
yum -y install git gcc gcc-c++ make autoconf automake libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim

安装libfastcommon(所有节点)
[root@localhost src]# git clone https://github.com/happyfish100/libfastcommon.git --depth 1
[root@localhost src]# cd libfastcommon/
[root@localhost libfastcommon]# ./make.sh && ./make.sh install
安装FastDFS(所有节点)
[root@localhost libfastcommon]# cd ..
[root@localhost src]# git clone https://github.com/happyfish100/fastdfs.git --depth 1
[root@localhost src]# cd fastdfs/
[root@localhost fastdfs]# ./make.sh && ./make.sh install
[root@localhost fastdfs]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
[root@localhost fastdfs]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
[root@localhost fastdfs]# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf  #客户端文件,测试用
[root@localhost fastdfs]# cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/  #供nginx访问使用
[root@localhost fastdfs]# cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/ #供nginx访问使用
安装fastdfs-nginx-module(storage节点)
[root@localhost fastdfs]# cd ..
[root@localhost src]# git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
[root@localhost src]# cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
安装nginx(storage节点)
[root@localhost src]# wget http://nginx.org/download/nginx-1.15.4.tar.gz
[root@localhost src]# tar -zxf nginx-1.15.4.tar.gz 
[root@localhost src]# cd nginx-1.15.4/
[root@localhost nginx-1.15.4]# ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/
[root@localhost nginx-1.15.4]# make && make install
[root@localhost nginx-1.15.4]# /usr/local/nginx/sbin/nginx -V
状态监控(storage节点查看)

tracker和storage都修改配置,并启动、清空防火墙,执行下边的命令

[root@localhost nginx-1.15.4]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf

在这里插入图片描述

分布式部署

tracker配置

配置文件修改

服务器ip为 192.168.43.74 192.168.43.253

[root@localhost fastdfs]# vim /etc/fdfs/tracker.conf
bind_addr=所在主机ip
port=22122  #默认22122  不做修改
base_path=/home/dfs  #存储日志和数据的根目录
tracker启动选项
[root@localhost fastdfs]# /etc/init.d/fdfs_trackerd start #启动tracker服务
[root@localhost fastdfs]# /etc/init.d/fdfs_trackerd stop
[root@localhost fastdfs]# /etc/init.d/fdfs_trackerd restart
[root@localhost fastdfs]# systemctl enable fdfs_trackerd #开启自启

storage配置

group1 配置文件修改
[root@localhost nginx-1.15.4]# vim /etc/fdfs/storage.conf
group_name=group1
bind_addr=所在主机ip
port=23000  #默认端口,不做修改
base_path=/home/dfs
store_path0=/home/dfs  #第一个存储目录
tracker_server=192.168.43.74:22122
tracker_server=192.168.43.253:22122
http.server_port=8888 #http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
group2 配置文件修改
[root@localhost nginx-1.15.4]# vim /etc/fdfs/storage.conf
group_name=group2
bind_addr=所在主机ip
port=23000  #默认端口,不做修改
base_path=/home/dfs
store_path0=/home/dfs  #第一个存储目录
tracker_server=192.168.43.74:22122
tracker_server=192.168.43.253:22122
http.server_port=8888 #http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
storage节点启动选项
[root@localhost nginx-1.15.4]# /etc/init.d/fdfs_storaged start #启动storage服务
[root@localhost nginx-1.15.4]# /etc/init.d/fdfs_storaged stop
[root@localhost nginx-1.15.4]# /etc/init.d/fdfs_storaged restart
[root@localhost nginx-1.15.4]# systemctl enable fdfs_storaged

nginx配置

storage nginx配置(group1)
[root@localhost nginx-1.15.4]# vim /etc/fdfs/mod_fastdfs.conf 
base_path=/home/dfs
tracker_server=192.168.43.74:22122
tracker_server=192.168.43.253:22122
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path0=/home/dfs
group_count = 2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/dfs

[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/home/dfs
group1 nginx主配置文件修改
[root@localhost nginx-1.15.4]# vim /usr/local/nginx/conf/nginx.conf
在原来的server之上自己写一个server
    server {
        listen    8888;
        server_name localhost;

        location ~/group[0-9]/M00/ {
                 ngx_fastdfs_module;
        }
    }
启动nginx
[root@localhost nginx-1.15.4]# /usr/local/nginx/sbin/nginx 
storage nginx配置 (group2)
[root@localhost nginx-1.15.4]# vim /etc/fdfs/mod_fastdfs.conf 
base_path=/home/dfs
tracker_server=192.168.43.74:22122
tracker_server=192.168.43.253:22122
storage_server_port=23000
group_name=group2
url_have_group_name = true
store_path0=/home/dfs
group_count = 2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/dfs

[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/home/dfs
group2 nginx主配置文件修改
[root@localhost nginx-1.15.4]# vim /usr/local/nginx/conf/nginx.conf
在原来的server之上自己写一个server
    server {
        listen    8888;
        server_name localhost;

        location ~/group[0-9]/M00/ {
                 ngx_fastdfs_module;
        }
    }
启动nginx
[root@localhost nginx-1.15.4]# /usr/local/nginx/sbin/nginx 

nginx代理配置

proxy主机安装nginx过程略,proxy主机的nginx不需要添加ngx_fastdfs_module模块,如果想做高可用,可以使用两台代理服务器,并做Keepalived,同样也建议开启缓存加速访问。

[root@localhost nginx-1.15.4]# vim /usr/local/nginx/conf/nginx.conf
    upstream fdfs_group1 { #设置group1的服务器
      server 192.168.43.147:8888 weight=1 max_fails=2 fail_timeout=30s;
      server 192.168.43.210:8888 weight=1 max_fails=2 fail_timeout=30;
    }
    upstream fdfs_group2 {
      server 192.168.43.104:8888 weight=1 max_fails=2 fail_timeout=30s;
      server 192.168.43.217:8888 weight=1 max_fails=2 fail_timeout=30;
    }
#下边添加两个location
        location ~ /group1/ {
            proxy_pass http://fdfs_group1;
        }
        location ~ /group2/ {
            proxy_pass http://fdfs_group2;
        }

启动nginx
[root@localhost nginx-1.15.4]# /usr/local/nginx/sbin/nginx 

client测试

拿proxy主机当client测试

[root@localhost nginx-1.15.4]# vim /etc/fdfs/client.conf
base_path=/home/dfs
tracker_server=192.168.43.74:22122
tracker_server=192.168.43.253:22122

保存后测试,返回ID表示成功
上传文件

[root@localhost nginx-1.15.4]# fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz 
group2/M00/00/00/wKgr2VxcYeWALLGmAA-itrfn0m4.tar.gz

上传图片

[root@localhost nginx-1.15.4]# fdfs_upload_file /etc/fdfs/client.conf /root/1.png 
group2/M00/00/00/wKgr2VxcYp-ARjKBAANebO9AHE4309.png

访问上传的图片
firefox 192.168.43.249/group2/M00/00/00/wKgr2VxcYp-ARjKBAANebO9AHE4309.png
在这里插入图片描述

命令行

#文件上传
[root@localhost nginx-1.15.4]# fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz

#文件测试上传(显示详细tracker返回信息)

[root@localhost nginx-1.15.4]# /usr/bin/fdfs_test /etc/fdfs/client.conf upload /etc/sysctl.conf 
This is FastDFS client test program v5.12

Copyright (C) 2008, Happy Fish / YuQing

FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.csource.org/ 
for more detail.

[2019-02-08 11:25:16] DEBUG - base_path=/home/dfs, connect_timeout=30, network_timeout=60, tracker_server_count=2, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

tracker_query_storage_store_list_without_group: 
	server 1. group_name=, ip_addr=192.168.43.217, port=23000

group_name=group2, ip_addr=192.168.43.217, port=23000
storage_upload_by_filename
group_name=group2, remote_filename=M00/00/00/wKgr2VxcZD2ABjhEAAAB8QzrOqc84.conf
source ip address: 192.168.43.217
file timestamp=2019-02-08 01:00:45
file size=497
file crc32=216742567
example file url: http://192.168.43.217/group2/M00/00/00/wKgr2VxcZD2ABjhEAAAB8QzrOqc84.conf
storage_upload_slave_by_filename
group_name=group2, remote_filename=M00/00/00/wKgr2VxcZD2ABjhEAAAB8QzrOqc84_big.conf
source ip address: 192.168.43.217
file timestamp=2019-02-08 01:00:45
file size=497
file crc32=216742567
example file url: http://192.168.43.217/group2/M00/00/00/wKgr2VxcZD2ABjhEAAAB8QzrOqc84_big.conf

#文件删除

[root@localhost nginx-1.15.4]# /usr/bin/fdfs_delete_file /etc/fdfs/client.conf group2/M00/00/00/wKgr2VxcYeWALLGmAA-itrfn0m4.tar.gz

#文件下载

[root@localhost nginx-1.15.4]# /usr/bin/fdfs_download_file /etc/fdfs/client.conf group2/M00/00/00/wKgr2VxcYp-ARjKBAANebO9AHE4309.png /root/download.png
[root@localhost nginx-1.15.4]# ls /root/*.png
/root/1.png  /root/download.png

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值