一、FastDFS概述

1.分布式文件系统

分布式文件系统(Distributed File System)是一个软件/软件服务器,此软件可以用来管理在多个服务器节点中的文件(这些服务器节点通过网络相连并构成一个庞大的文件存储服务器集群,即这些服务器节点都是用来存储文件资源的,且用DFS来管理这些文件)。而传统文件系统与分布式文件系统的对比,有如下区别:
image-20231009112615209

经过对比,我们会发现传统文件系统存在如下缺点:

若用户数量多,则IO操作会很频繁 则对磁盘的访问压力会较大;

若磁盘故障,则可能会造成数据的丢失;

一个磁盘的存储容量有限。

FastDFS 是一款开源的轻量级分布式文件系统,

纯C实现,支持Linux、FreeBSD等类UNIX系统;
类Google FS,不是通用的文件系统,只能通过专有的API访问,目前提供了 C、Java和PHP API;
为互联网应用量身定做,追求高性能和高扩展型;
FastDFS可以看做是基于文件系统的key/value pair存储系统,称作分布式文件存储服务更为合适;
更倾向于存储中小型文件(4KB~500MB);

2、FastDFS 组成

Tracker Server

跟踪服务器,主要做调度工作,在访问时起负载均衡的作用。在内存中记录 集群中group和storage服务器的状态信息,是连接客户端和Storage服务端的枢纽。因为相关信息全部在内存中,Tracker服务器的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。

Storage Server

存储服务器,文件和文件属性(meta data)都保存到存储服务器上。

FastDFS上传机制

title FastDFS上传机制
participant Client
participant Tracker_Server
participant Storage_Server

Storage_Server -> Tracker_Server: 1. 定时向Tracker上传状态信息
Client -> Tracker_Server: 2. 上传连接请求
Tracker_Server -> Tracker_Server: 3. 查询可用storage
Client <- Tracker_Server: 4. 返回信息(storage的IP和端口)
Client -> Storage_Server: 5. 上传文件(file content和meta data)
Storage_Server -> Storage_Server: 6. 生成file_id
Storage_Server -> Storage_Server: 7. 将上传内容写入硬盘
Client <- Storage_Server: 8. 返回file_id(路径信息和文件名)
Client -> Client: 9. 存储文件信息

image-20231009112943580

FastDFS架构

image-20231009113027484

二、安装部署

环境准备:

主机名 IP 部署服务
web01 172.16.1.7 Tracker(调度工作)、Storage(存储)、Nginx、Keepalived
web02 172.16.1.8 Tracker(调度工作)、Storage(存储)、Nginx、Keepalived
web03 172.16.1.9 代理以上两台VIP地址

VIP: 10.0.1.100

以下操作web01、web02同步执行

2.1、安装依赖

yum -y install make cmake gcc gcc-c++ libevent git

2.2、libfastcommon安装部署

git clone https://gitee.com/fastdfs100/libfastcommon.git
cd libfastcommon
git checkout V1.0.48
./make.sh clean && ./make.sh && ./make.sh install

2.3、fastdfs安装部署

git clone https://gitee.com/fastdfs100/fastdfs.git
cd fastdfs
git checkout V6.07
./make.sh clean && ./make.sh && ./make.sh install

安装完毕后,配置文件在 /etc/fdfs目录下;二进制程序在 /usr/bin目录下;启动脚本在 /lib/systemd/system目录下

2.3、配置 Tracker 文件

Tracker只需要修改 base_path即可

#创建数据目录
[root@web01 fdfs]# mkdir -p /data/{fastdfs,fdfs_tracker,fdfs_storage,fdfs_file}
[root@web01 fdfs]# cp client.conf.sample client.conf
[root@web01 fdfs]# cp storage.conf.sample storage.conf
[root@web01 fdfs]# cp tracker.conf.sample tracker.conf
[root@node01 fdfs]# vim tracker.conf 
----
base_path = /data/fdfs_tracker    
---

2.4、配置Storage文件

Storage只需修改如下即可

[root@node01 fdfs]# vim storage.conf

base_path = /data/fdfs_storage

store_path0 = /data/fdfs_file

tracker_server = 10.0.0.7:22122

2.5、启动服务

fdfs_trackerd /etc/fdfs/tracker.conf start
fdfs_storaged /etc/fdfs/storage.conf start

端口查看

[root@web01 fdfs]# netstat -lntup  | grep fdfs
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      9567/fdfs_trackerd  
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      9576/fdfs_storaged 

Storage 服务启动后,在 base_path 下创建了 data、logs 目录,记录着 Storage Server 的信息。在 store_path0 目录下,创建了 N*N 个子目录:

[root@web01 fdfs]# ls /data/fdfs_file/data/

image-20231009151303345

查看 Storage 服务与 Tracker 服务是否通信正常

fdfs_monitor /etc/fdfs/storage.conf

image-20231009151438309

2.6、上传测试

修改 Tracker 服务器上的客户端配置文件,修改 base_path 及 tracker_server 配置,其他保持默认即可。如下:

[root@web01 fdfs]# grep -E "(^base_path|^tracker_server)" client.conf 
base_path = /data/fastdfs
tracker_server = 10.0.0.7:22122

上传图片

[root@web01 fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/1.png 
group1/M00/00/00/CgAAB2UjqbGAF58vAARe9mXDrMA952.png

上传成功后返回文件ID号:group1/M00/00/00/CgAAB2UjqbGAF58vAARe9mXDrMA952.png。返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

2.7、安装Nginx

wget  https://nginx.org/download/nginx-1.24.0.tar.gz

mkdir /data/apps
# 安装编译 Nginx 所需的依赖
yum install -y pcre-devel zlib-devel openssl-devel
tar -xf nginx-1.24.0.tar.gz -C /data/apps
cd /data/apps/nginx-1.24.0
# 使用默认配置即可
./configure --prefix=/data/apps/nginx-1.24.0
make && make install

验证安装

[root@web01 fdfs]# /data/apps/nginx-1.24.0/sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --prefix=/data/apps/nginx-1.24.0

简单配置 Nginx,可以使我们可以访问刚刚上传的文件。配置文件中添加一个 /group1/M00location 即可。配置如下:

[root@web01 nginx-1.24.0]# vim conf/nginx.conf 
----
location /group1/M00 {
    alias /data/fdfs_file/data;
}
-----
#检测语法
[root@web01 nginx-1.24.0]# sbin/nginx -t
nginx: the configuration file /data/apps/nginx-1.24.0/conf/nginx.conf syntax is ok
nginx: configuration file /data/apps/nginx-1.24.0/conf/nginx.conf test is successful
#启动服务
[root@web01 nginx-1.24.0]# sbin/nginx
#查看端口
[root@web01 nginx-1.24.0]# netstat -lntup | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      17836/nginx: master 

打开浏览器访问刚刚上传的文件,URL 为:http://10.0.0.7/group1/M00/00/00/CgAAB2UjqbGAF58vAARe9mXDrMA952.png

image-20231009155201391

三、高可用集群部署

3.1、修改配置

#修改storage.conf文件
#主要检查以下配置项,两台服务器配置保持一致

cat /etc/fdfs/storage.conf

# 是否启用配置文件,false表示生效
disabled = false                        
group_name = group1                         
port = 23000                        
base_path = /data/fdfs_storage                     
store_path0 = /data/fdfs_storage

# 存储路径个数,需要和store_path个数匹配
store_path_count = 1
# tracker节点IP+端口
tracker_server = 10.0.0.7:22122
tracker_server = 10.0.0.8:22122
# http端口号
http.server_port = 8888             

重新启动storage节点,两台服务器同步操作

fdfs_storaged /etc/fdfs/storage.conf restart

3.2、查看集群信息

fdfs_monitor /etc/fdfs/storage.conf

image-20231009161941336

3.3、编辑Nginx模块配置

cat >> /etc/fdfs/mod_fastdfs.conf  << EOF
base_path=/home/fastdfs/storage
store_path0=/home/fastdfs/storage
tracker_server=10.0.0.7:22122
tracker_server=10.0.0.8:22122
storage_server_port=23000
EOF

3.4、上传文件测试两台节点是否同步

web01因为前面上传过图片,所有已经有一张了,二web02则是空的

image-20231009164533015

上传图片

fdfs_upload_file /etc/fdfs/client.conf /root/2.png 

image-20231009164650957

3.5、Keepalived部署

两台服务器安装配置keepalived虚拟地址 //Keepalived部署自行参考文档

yum install -y keepalived

web01配置:

global_defs {                   
    router_id web01              
}

vrrp_instance VI_1 {
    state MASTER                
    interface eth0              
    virtual_router_id 50        
    priority 150                
    advert_int 1                
    authentication {            
        auth_type PASS          
        auth_pass 1111          
    }
    virtual_ipaddress {         
        10.0.0.3                
    }
}

web02配置

global_defs {                   
    router_id web02            
}

vrrp_instance VI_1 {
    state BACKUP                
    interface eth0              
    virtual_router_id 50        
    priority 100                
    advert_int 1                
    authentication {            
        auth_type PASS          
        auth_pass 1111          
    }
    virtual_ipaddress {         
        10.0.0.3                
    }
}

启动服务

systemctl start keepalived

image-20231009165103221

3.6、高可用访问验证

浏览器访问图片:http://IP:Port/group1/M00/00/00/CgAACGUjvdiAJdsoAAKDesCVQ9Q224.png

image-20231009165406129

image-20231009165440440

image-20231009165506999

故障测试

停掉web01 Keepalived服务,查看VIP是否还能正常访问

image-20231009165831461

image-20231009165840391

发现,VIP还能继续访问网页,至此FastDFS高可用集群部署完成