FastDFS分布式文件系统

1.1 简介

FastDFS是开源的高性能分布式文件系统(DFS),它的主要功能包括:文件存储,文件同步和文件访问,以及高容量的和负载平衡主要解决了海量数据存储的问题,特别适合中小文件(建议范围: 4KB < file_size < 500M)

1.2 FastDFS架构

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

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

    Tracker server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的StorageServer和group, 每个storage启动后会连接tracker,告知自己所属group等信息,并保持周期性心跳,通过trackerServer在文件上传时通过一定的策略选择storageserver提供上传文件服务

    StorageServer:存储服务器,主要提供容量和备份服务;已group为单位,每个group内可以有多个storage server,数据互相备份,storage server没有实现自己的文件系统而是利用操作系统的文件系统管理文件;

    Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部属在服务器

MyAnswer博客

1.2.1 Tracker集群

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

1.2.2 Storage集群

为了支持大容量,存储节点(服务器)采用了分卷的组织方式,存储系统由一个或多个卷组成,卷与卷的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量,一个卷由一个或多台存储服务器组成,卷内的storage server 之间是相互平等关系,不同卷的storage server之间不会相互通信,同卷内的storageserver之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的,一个卷的存储容量为该组内存存储服务器容量最小的哪个,由此可见组内存储服务器的软硬件配置最好是一致的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用

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

采用分组存储方式的好处是灵活,可控性强,比如上传文件时,可以由客户端直接指定上传的组也可以由tracker进行调度选择,一个分组的存储服务器访问压力较大时,可以在该分组增加服务器来扩充服务能力(纵向扩容), 当系统容量不足时,以及增加组来扩充容量(横向扩展)

1.2.3 Storage状态收集

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

1.2.4 FastDFS的上传过程

FastDFS向使用者提供基本文件上传访问接口,比如upload,download等,已客户端库的方式提供给用户使用

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

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

MyAnswer博客

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

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

虚拟磁盘路径: storage配置的虚拟路径,与磁盘选项store_path*对应,如果配置了storage_path0则是M00,如果配置了storage_path1则是M01以此类推

数据两级目录: storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件

文件名: 与文件上传不同,是由存储服务器根据特定信息生成,文件名包括:源存储服务器ip地址,文件创建时间戳,文件大小,随机数和文件拓展名等信息;


1.2.5 FastDFS的文件同步

写文件时,客户端将文件写至group内的一个storage server 即认为写文件成功, storage server写问文件后,会由后台线程将文件同步至桶group内的其他storage server

每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件信息等元素,这份binlog用于后台同步,storage会记录向group内其他的storage同步的进度,以便重启后接上次进度继续同步;进度以时间戳的方式进行记录,所以最好能保存集群内所有server的时钟保存同步,stroage的同步进度会作为元数据的一部分汇报到tracker上,tracker在选择读storage的时候会以同步进度作为参考;

1.2.6 FastDFS的文件下载

客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件夹名既可以访问到该文件

MyAnswer博客

跟upload file一样,在downloadfile时客户端可以选择任意的tracker server, downloadfile请求给某个tracker,必须带上文件名信息,tracker从文件名中解析出文件的group,大小,创建时间等,然后为改请求选择一个storage用来服务请求

tracker根据请求的文件路径即文件ID来快速定义文件

比如请求下面的文件:

MyAnswer博客

  1. 通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问;

  2. 存储服务器根据,文件存储虚拟磁盘路径和数据文件两级目录可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件

2 安装FastDFS(安装GCC)

安装FastDFS需要先将官网下载的源码进行编译,编译需要依赖gcc环境

yum -y install gcc-c++

2.3 安装libevent

FastDFS依赖libevent库,需要安装

yum -y install libevent

2.4 安装libfastcommon

libfastcommon是fastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库

下载地址: https://github.com/happyfish100/libfastcommon/releases 选择合适的版本

 [root@localhost ~]# cd /usr/local/src/    #切换到下载目录
 [root@localhost src]# wget -O libfastcommon-1.0.39.tar.gz 
 https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.39 #下载(如果下载慢可以将下载好的文件上传到此目录)
 [root@localhost src]# tar -zxvf libfastcommon-1.0.39.tar.gz      #解压
 [root@localhost src]# cd libfastcommon-1.0.39/
 #安装
 [root@localhost libfastcommon-1.0.39]# ./make.sh 
 [root@localhost libfastcommon-1.0.39]# ./make.sh  install

2.4 安装FastDFS

下载地址:https://github.com/happyfish100/fastdfs/releases 选择合适的版本

 [root@localhost libfastcommon-1.0.39]# cd /usr/local/src/ #切换到下载目录#下载(如果下载慢 可以将下载好的文件上传到此目录)
 [root@localhost src]# wget -O fastdfs-5.11.tar.gz https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.11
 [root@localhost src]# tar -zxvf fastdfs-5.11.tar.gz   #解压
 [root@localhost src]# cd fastdfs-5.11/
 #安装
 [root@localhost fastdfs-5.11]# ./make.sh 
 [root@localhost fastdfs-5.11]# ./make.sh  install

默认安装方式安装后的相应文件与目录

A.服务脚本:

/etc/init.d/fdfs_storaged   #存储服务器
/etc/init.d/fdfs_trackerd   #跟踪服务器

B.配置文件统一放在这个目录

/etc/fdfs/client.conf.sample
/etc/fdfs/storage.conf.sample
/etc/fdfs/tracker.conf.sample

C.命令工具在 /usr/bin目录下面

fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
stop.sh
restart.sh

2.6 配置FastDFS跟踪服务器(Tracker)

配置文件详细说明参考:FastDFS 配置文件详解

进入/etc/fdfs,复制FastDFS跟踪器配置文件 tracker.conf.sample,并重命名为tracker.conf

 [root@localhost fastdfs-5.11]# cd /etc/fdfs/
 [root@localhost fdfs]# cp tracker.conf.sample tracker.conf
 [root@localhost fdfs]#  vim tracker.conf

编辑tracker.conf,标注的需要修改,其它的默认

# 配置文件是否不生效,false 为生效
 disabled=false
# 提供服务的端口
 port=22122
#Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)

# HTTP 服务端口 默认8080 ,建议修改 防止冲突
http.server_port=9080

创建tracker基础数据目录,即base_path对应的目录

mkdir -p /fastdfs/tracker

防火墙中打开端口(22122)

# vim /etc/sysconfig/iptables
添加如下端口行:
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
重启防火墙:
 # service iptables restart

启动Tracker:初次启动会在 /fastdfs/tracker配置的base_path下创建两个data logs两个目录

 启动命令:
 [root@localhost fdfs]# /etc/init.d/fdfs_trackerd start
 [root@localhost fdfs]# service fdfs_trackerd start
 [root@localhost fdfs]# systemctl start fdfs_trackerd

查看fastDFS是否已成功启动

[root@localhost bin]# systemctl status fdfs_trackerd
● fdfs_trackerd.service - LSB: FastDFS tracker server
   Loaded: loaded (/etc/rc.d/init.d/fdfs_trackerd; bad; vendor preset: disabled)
   Active: active (running) since 三 2021-01-13 18:15:18 CST; 16h ago
     Docs: man:systemd-sysv-generator(8)
  Process: 122354 ExecStart=/etc/rc.d/init.d/fdfs_trackerd start (code=exited, status=0/SUCCESS)
    Tasks: 7
   Memory: 1.3M
   CGroup: /system.slice/fdfs_trackerd.service
           └─122359 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

1月 13 18:15:18 localhost.localdomain systemd[1]: Starting LSB: FastDFS tracker server...
1月 13 18:15:18 localhost.localdomain fdfs_trackerd[122354]: Starting FastDFS tracker server:
1月 13 18:15:18 localhost.localdomain systemd[1]: Started LSB: FastDFS tracker server.
[root@localhost bin]# netstat -tulnp|grep fdfs                        
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      122359/fdfs_tracker

关闭Tracker命令

 [root@localhost fdfs]# service fdfs_trackerd stop
 [root@localhost fdfs]# systemctl stop fdfs_trackerd #centos7 推荐
 [root@localhost fdfs]# /etc/init.d/fdfs_trackerd stop

设置开机启动

# chkconfig fdfs_trackerd on
 或
 #systemctl enable fdfs_trackerd.service
 或者:
 # vim /etc/rc.d/rc.local
 加入配置:
 /etc/init.d/fdfs_trackerd start

Tracker服务启动成功后,会在base_path下创建data,logs两个目录

${base_path}
 |__data
 | |__storage_groups.dat:存储分组信息
 | |__storage_servers.dat:存储服务器列表
 |__logs
 | |__trackerd.log: tracker server 日志文件

2.7 配置FastDFS存储(Storage)

进入/etc/fdfs目录,复制FastDFS存储配置文件stroage.conf.sample,并重命名为stroage.conf

 # cd /etc/fdfs
 # cp storage.conf.sample storage.conf
 # vim storage.conf

编辑storage.conf

# 配置文件是否不生效,false 为生效
 disabled=false 
# 指定此 storage server 所在 组(卷)
 group_name=group1
# storage server 服务端口
 port=23000
# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)
 heart_beat_interval=30
# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)  (注 :这里不是上传的文件存放的地址,之前版本是的,在某个版本后更改了)

# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。
 store_path_count=1

 # 逐一配置 store_path_count 个路径,索引号基于 0。
 # 如果不配置 store_path0,那它就和 base_path 对应的路径一样。

# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。 
 # 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。
 subdir_count_per_path=256
# tracker_server 的列表 ,会主动连接 tracker_server
 # 有多个 tracker server 时,每个 tracker server 写一行

# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。
 sync_start_time=00:00
 sync_end_time=23:59
 # 访问端口 默认80  建议修改 防止冲突

创建Storage基础数据目录,对应的base_path目录

# 对应base_path
# mkdir -p /fastdfs/storage/base
# 这是配置的store_path0路径,有多个要创建多个
# mkdir -p /fastdfs/storage/

打开防火墙(23000)

# vim /etc/sysconfig/iptables
添加如下端口行:
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
重启防火墙:
 # service iptables restart

启动storage:启动前要确保Tracker是启动的,初次启动成功,会在/fastdfs/storage/base(base_path) 目录下创建 data, logs两个目录

可以用这种方式启动
# /etc/init.d/fdfs_storaged start
# service fdfs_storaged start
# systemctl start fdfs_storaged  #centos7 推荐

查看storage是否启动成功,我这里配置了两个group卷

[root@localhost bin]# netstat -unltp|grep fdfs
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      122628/fdfs_storage                          
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      122359/fdfs_tracker                          
[root@localhost bin]# systemctl status fdfs_storaged
● fdfs_storaged.service - LSB: FastDFS storage server
   Loaded: loaded (/etc/rc.d/init.d/fdfs_storaged; bad; vendor preset: disabled)
   Active: active (running) since 三 2021-01-13 18:17:10 CST; 16h ago
     Docs: man:systemd-sysv-generator(8)
  Process: 122623 ExecStart=/etc/rc.d/init.d/fdfs_storaged start (code=exited, status=0/SUCCESS)
    Tasks: 10
   Memory: 64.8M
   CGroup: /system.slice/fdfs_storaged.service
           └─122628 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf

1月 13 18:17:10 localhost.localdomain systemd[1]: Starting LSB: FastDFS storage server...
1月 13 18:17:10 localhost.localdomain systemd[1]: Started LSB: FastDFS storage server.
1月 13 18:17:10 localhost.localdomain fdfs_storaged[122623]: Starting FastDFS storage server:

关闭Storage

 [root@localhost fdfs]# service fdfs_storaged stop
 [root@localhost fdfs]# systemctl stop fdfs_storaged #centos7 推荐
 [root@localhost fdfs]# /etc/init.d/fdfs_storaged stop

查看Storage和Tracker是否在通信

[root@localhost bin]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
[2021-01-14 11:06:56] DEBUG - base_path=/fastdfs/storage/base, connect_timeout=30, network_timeout=60, tracker_server_count=1
, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_stora
ge_id=0, storage server id count: 0

server_count=1, server_index=0

tracker server is 192.168.202.148:22122

group count: 2

Group 1:
group name = group1
disk total space = 17394 MB
disk free space = 10251 MB
trunk free space = 0 MB
storage server count = 2
active server count = 1
storage server port = 23000
storage HTTP port = 9888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0

        Storage 1:
                id = 192.168.202.147
                ip_addr = 192.168.202.147 (anantes-651-1-49-net.w2-0.abo.wanadoo.fr)  OFFLINE
                http domain = 
                version = 5.11
                join time = 2021-01-12 22:34:46
                up time = 
                total storage = 17394 MB
                free storage = 11025 MB
                upload priority = 10
                store_path_count = 1
                subdir_count_per_path = 256
                storage_port = 23000
                storage_http_port = 7888
                current_write_path = 0
                source storage id = 192.168.202.148
                if_trunk_server = 0
                connection.alloc_count = 0
                connection.current_count = 0
                connection.max_count = 0
                total_upload_count = 2
                success_upload_count = 2
                total_append_count = 0
                success_append_count = 0
                total_modify_count = 0
                success_modify_count = 0
                total_truncate_count = 0
                success_truncate_count = 0
                total_set_meta_count = 0
                success_set_meta_count = 0
                total_delete_count = 0
                success_delete_count = 0
                total_download_count = 0
                success_download_count = 0
                total_get_meta_count = 0
                success_get_meta_count = 0
                total_create_link_count = 0
                success_create_link_count = 0
                total_delete_link_count = 0
                success_delete_link_count = 0
                total_upload_bytes = 203834
                success_upload_bytes = 203834
                total_append_bytes = 0
                success_append_bytes = 0
                total_modify_bytes = 0
                success_modify_bytes = 0
                stotal_download_bytes = 0
                success_download_bytes = 0
                total_sync_in_bytes = 815478
                success_sync_in_bytes = 815478
                total_sync_out_bytes = 0
                success_sync_out_bytes = 0
                total_file_open_count = 15
                success_file_open_count = 15
                total_file_read_count = 0
                success_file_read_count = 0
                total_file_write_count = 15
                success_file_write_count = 15
                last_heart_beat_time = 2021-01-13 16:44:51
                last_source_update = 2021-01-12 22:38:55
                last_sync_update = 2021-01-12 22:38:56
                last_synced_timestamp = 2021-01-12 22:38:57 (19h:43m:07s delay)
        Storage 2:
                id = 192.168.202.148
                ip_addr = 192.168.202.148 (anantes-651-1-49-net.w2-0.abo.wanadoo.fr)  ACTIVE
                http domain = 
                version = 5.11
                join time = 2021-01-12 17:13:23
                up time = 2021-01-13 18:17:10
                total storage = 17394 MB
                free storage = 10251 MB
                upload priority = 10
                store_path_count = 1
                subdir_count_per_path = 256
                storage_port = 23000
                storage_http_port = 9888
                current_write_path = 0
                source storage id = 
                if_trunk_server = 0
                connection.alloc_count = 256
                connection.current_count = 0
                connection.max_count = 1
                total_upload_count = 18
                success_upload_count = 18
                total_append_count = 0
                success_append_count = 0
                total_modify_count = 0
                success_modify_count = 0
                total_truncate_count = 0
                success_truncate_count = 0
                total_set_meta_count = 2
                success_set_meta_count = 2
                total_delete_count = 0
                success_delete_count = 0
                total_download_count = 0
                success_download_count = 0
                total_get_meta_count = 0
                success_get_meta_count = 0
                total_create_link_count = 0
                success_create_link_count = 0
                total_delete_link_count = 0
                success_delete_link_count = 0
                total_upload_bytes = 1135059
                success_upload_bytes = 1135059
                total_append_bytes = 0
                success_append_bytes = 0
                total_modify_bytes = 0
                success_modify_bytes = 0
                stotal_download_bytes = 0
                success_download_bytes = 0
                total_sync_in_bytes = 203834
                success_sync_in_bytes = 203834
                total_sync_out_bytes = 0
                success_sync_out_bytes = 0
                total_file_open_count = 20
                success_file_open_count = 20
                total_file_read_count = 0
                success_file_read_count = 0
                total_file_write_count = 20
                success_file_write_count = 20
                last_heart_beat_time = 2021-01-14 11:06:37
                last_source_update = 2021-01-13 18:22:04
                last_sync_update = 2021-01-12 22:39:05
                last_synced_timestamp = 2021-01-12 22:38:56 (-1s delay)

Group 2:
group name = group2
disk total space = 17394 MB
disk free space = 10983 MB
trunk free space = 0 MB
storage server count = 1
active server count = 0
storage server port = 23000
storage HTTP port = 7888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0

        Storage 1:
                id = 192.168.202.147
                ip_addr = 192.168.202.147 (anantes-651-1-49-net.w2-0.abo.wanadoo.fr)  OFFLINE
                http domain = 
                version = 5.11
                join time = 2021-01-12 22:34:46
                up time = 
                total storage = 17394 MB
                free storage = 10983 MB
                upload priority = 10
                store_path_count = 1
                subdir_count_per_path = 256
                storage_port = 23000
                storage_http_port = 7888
                current_write_path = 0
                source storage id = 
                if_trunk_server = 0
                connection.alloc_count = 256
                connection.current_count = 0
                connection.max_count = 1
                total_upload_count = 58
                success_upload_count = 58
                total_append_count = 0
                success_append_count = 0
                total_modify_count = 0
                success_modify_count = 0
                total_truncate_count = 0
                success_truncate_count = 0
                total_set_meta_count = 0
                success_set_meta_count = 0
                total_delete_count = 0
                success_delete_count = 0
                total_download_count = 0
                success_download_count = 0
                total_get_meta_count = 0
                success_get_meta_count = 0
                total_create_link_count = 0
                success_create_link_count = 0
                total_delete_link_count = 0
                success_delete_link_count = 0
                total_upload_bytes = 1580046
                success_upload_bytes = 1580046
                total_append_bytes = 0
                success_append_bytes = 0
                total_modify_bytes = 0
                success_modify_bytes = 0
                stotal_download_bytes = 0
                success_download_bytes = 0
                total_sync_in_bytes = 815478
                success_sync_in_bytes = 815478
                total_sync_out_bytes = 0
                success_sync_out_bytes = 0
                total_file_open_count = 71
                success_file_open_count = 71
                total_file_read_count = 0
                success_file_read_count = 0
                total_file_write_count = 71
                success_file_write_count = 71
                last_heart_beat_time = 2021-01-13 18:24:05
                last_source_update = 2021-01-13 18:22:40
                last_sync_update = 2021-01-12 22:38:56
                last_synced_timestamp = 1970-01-01 08:00:00

设置开机启动

# chkconfig fdfs_storaged on
或
#systemctl enable fdfs_storaged.service  (推荐)
或者:
# vim /etc/rc.d/rc.local
加入配置:
/etc/init.d/fdfs_storaged  start

Storage目录:启动成功后,会在base_path目录下创建data,logs目录,在store_path0/data目录下,会创建N*N个子目录

[root@localhost tracker]# ls /fastdfs/storage/data/
00  09  12  1B  24  2D  36  3F  48  51  5A  63  6C  75  7E  87  90  99  A2  AB  B4  BD  C6  CF  D8  E1  EA  F3  FC
01  0A  13  1C  25  2E  37  40  49  52  5B  64  6D  76  7F  88  91  9A  A3  AC  B5  BE  C7  D0  D9  E2  EB  F4  FD
02  0B  14  1D  26  2F  38  41  4A  53  5C  65  6E  77  80  89  92  9B  A4  AD  B6  BF  C8  D1  DA  E3  EC  F5  FE
03  0C  15  1E  27  30  39  42  4B  54  5D  66  6F  78  81  8A  93  9C  A5  AE  B7  C0  C9  D2  DB  E4  ED  F6  FF
04  0D  16  1F  28  31  3A  43  4C  55  5E  67  70  79  82  8B  94  9D  A6  AF  B8  C1  CA  D3  DC  E5  EE  F7
05  0E  17  20  29  32  3B  44  4D  56  5F  68  71  7A  83  8C  95  9E  A7  B0  B9  C2  CB  D4  DD  E6  EF  F8
06  0F  18  21  2A  33  3C  45  4E  57  60  69  72  7B  84  8D  96  9F  A8  B1  BA  C3  CC  D5  DE  E7  F0  F9
07  10  19  22  2B  34  3D  46  4F  58  61  6A  73  7C  85  8E  97  A0  A9  B2  BB  C4  CD  D6  DF  E8  F1  FA
08  11  1A  23  2C  35  3E  47  50  59  62  6B  74  7D  86  8F  98  A1  AA  B3  BC  C5  CE  D7  E0  E9  F2  FB

2.7 上传测试

修改Tracker服务器中的客户端配置文件

# cd /etc/fdfs
# cp client.conf.sample client.conf
# vim client.conf

修改如下配置,其他默认即可

# Client 的数据和日志目录
base_path=/fastdfs/client
 
# Tracker端口
tracker_server=192.168.0.200:22122

上传文件测试

[root@localhost php]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf 3.png                                                  
返回文件ID: group1/M00/00/00/wKjKlF__uB2ATCHZAAGOHS03fww870.png
group1/M00/00/00/wKjKlF__uB2ATCHZAAGOHS03fww870.png

返回的文件ID由于group,存储目录,两级子目录,fileid,文件后缀名拼接而成

MyAnswer博客


3 安装配置Nginx,http访问文件

上面将文件上传成功了,但我们无法下载,因此安装Nginx最为服务器以支持Http方式访问文件,后面安装FastDFS的NGINX模块也需要Nginx的环境

NGINX只需要安装到Storage server 所在的服务器,用于文件访问

# vim /usr/local/nginx/conf/nginx.conf
配置如下
server {
        listen       8081;
        server_name  192.168.0.200;
 
        location /group1/M00{
        alias /fastdfs/storage/data/;
         autoindex on;
 
       }
 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
       }
    }

在浏览器访问之前上传的图片 http://192.168.0.200:8081/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg


4 FastDFS配置Nginx模块


4.1 安装配置fastdfs-nginx-module模块

fastdfs-nginx-module模块说明

FastDFS通过Track服务器,将文件放在storage服务器存储,但是同组存储服务器之间需要进行文件复制,有同步延迟的问题

假设Tracker服务器将文件上传到了192.168.202.148上,上传成功后文件ID已经返回给客户端

此时FastDFS存储集群机制会将这个文件同步到同组存储192.168.202.147,在文件还没有复制完成的情况下,客户端如果用这个文件ID在192.168.202.147上读取文件,就会出现文件无法方位的错误

而fastdfs-nginx-module可以重定向文件链接到源服务器读取文件,避免客户端由于复制延迟导致的文件无法访问错误

下载fastdfs-nginx-module

 #cd /usr/local/src
 #wget -O fastdfs-nginx-module-1.20.tar.gz  https://codeload.github.com/happyfish100/fastdfs-nginx-module/tar.gz/V1.20
 # tar -zxvf fastdfs-nginx-module-1.20.tar.gz

编辑fastdfs-nginx-module-1.20/src/config

ngx_addon_name=ngx_http_fastdfs_module
 
if test -n "${ngx_module_link}"; then
ngx_module_type=HTTP
ngx_module_name=$ngx_addon_name
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
ngx_module_libs="-lfastcommon -lfdfsclient"
ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
ngx_module_deps=
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='2561024' -DFDFS_MOD_CONF_FILENAME='"/etc/fdfs/mod_fastdfs.conf"'"
. auto/module
else
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='2561024' -DFDFS_MOD_CONF_FILENAME='"/etc/fdfs/mod_fastdfs.conf"'"
fi

改变的文件内容
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

配置nginx,添加fastdfs-nginx-module模块

# 先停掉nginx服务 如果没有配置为服务 则使用 # /usr/local/nginx/sbin/nginx -s stop
# systemctl stop nginx     
#进入nginx源码目录
# cd /usr/local/src/nginx-1.16.0/   
#添加fastdfs-nginx-module 模块
#[root@localhost nginx-1.16.0]#./configure  --add-module=/usr/local/src/fastdfs-nginx-module-1.20/src
#重新编译安装nginx
#[root@localhost nginx-1.16.0]# make
#[root@localhost nginx-1.16.0]# make install
 
#验证是否加载fastdfs-nginx-module模块是否 ,有如下标红部分表示成功
# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --add-module=/usr/local/src/fastdfs-nginx-module-1.20/src

复制fastdfs-nginx-module模块源码中的配置文件mod_fastdfs.conf到 /etc/fdfs

# cp /usr/local/src/fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/
 修改如下配置,其它默认
 # 连接超时时间
connect_timeout=10
# Tracker Server
tracker_server=192.168.202.148:22122
 
# StorageServer 默认端口
storage_server_port=23000
 
# 如果文件ID的uri中包含/group**,则要设置为true
#url_have_group_name = true
 
# Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0=/fastdfs/storage

复制FastDFS的部分配置文件到/etc/fdfs目录

#cd /usr/local/src/fastdfs-5.11/conf/
 [root@localhost conf]# cp anti-steal.jpg http.conf mime.types /etc/fdfs/

配置nginx,需改nginx.conf

user root;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
 
    server {
 
        listen      9888 ;
        server_name  192.168.0.200;
       # location /group1/M00{
         # alias /fastdfs/storage/data/;
        # autoindex on;
       #}
       location ~/group[0-9]/ {
                ngx_fastdfs_module;
            }
 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
       }
    }
 
}

最终架构图

MyAnswer博客


PHP安装上传模块php_client

  1. # cd /usr/local/src/fastdfs/FastDFS/php_client  

  2. # /usr/local/php5/bin/phpize   

  3. # ./configure --with-php-config=/usr/local/php5/bin/php-config    

  4. # make && make install    

  5. # cat fastdfs_client.ini >> /usr/local/php5/etc/php.ini

MyAnswer博客

<?php
$ret = fastdfs_storage_upload_by_filename('./3.png');
var_dump($ret);
[root@localhost php]# php  index.php 
array(2) {
  ["group_name"]=>
  string(6) "group2"
  ["filename"]=>
  string(44) "M00/00/00/wKjKk1__-bKAKEatAAGOHS03fww955.png"
}


MyAnswer博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论