FastDFS分布式存储:概念、集群案例

FastDFS

FastDFS:Fast DistributedFileSystem,快速分布式文件系统

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

概念

组成部分

Tracker Server

跟踪(Tracker)服务器,主要做调度工作,起到均衡的作用,负责管理所有的Storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。

Tracker上的元信息都是由Storage汇报的信息生成的,本身不需要持久化任何数据,这样使得Tracker非常容易扩展,直接增加Tracker机器即可扩展为Tracker cluster来服务,集群里每个Tracker之间是完全对等的,所有的Tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务,tracker根据storage的心跳信息,建立group(storage server list)的映射表。

Storage Server

存储服务器,主要提供容量和备份服务;以group为单位,每个group内部可以有多台storage server,数据互为备份

客户端上传的文件最终存储在Storage服务器上,Storage server不必搭建特殊的存储技术,可以利用操作系统的磁盘、LVM、RAID、普通的文件系统来管理文件。

Storage Server会定时向Tracker上传状态信息

Client

客户端,负责上传和下载数据,FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用


FastDFS原理

  1. 客户端上传文件不能直接交给Tracker服务器,而是向Tracker Server发送一个上传或下载文件的请求
  2. Tracker服务器收到请求后,查询Group中可用的Storage Server,通过相应算法决定让哪一个Storage Server存储该文件
  3. 然后Tracker再把Storage相关的信息返回给客户端
  4. 客户端直接向Storage发起上传或下载文件的请求

文件上传的过程

  1. 首先选择一个Tracker Server
  2. Tracker Server选择Storage Server
  3. 客户端选择Storage Path ( 路径 ) 上传文件
  4. 生成Fileid(文件标识)
  5. 生成文件名

文件下载的过程

  1. 根据group名 / 虚拟磁盘路径 / 一级目录 / 二级目录 / 文件名定位文件
  2. 定位文件所在的Group
  3. 定位文件位置

定位文件位置

当一个文件上传成功后,客户端起对该文件发起下载请求(或删除请求)时,通过Nginx,帮助用户定位该文件的具体位置

集成Nginx

比如客户端起发起下载请求时,需要在每一个Storage Server上安装Nginx来帮助用户定位文件的位置

怎么集成Nginx的?需要向Nginx中添加一个FastDFS提供的模块,该模块能够借助于Nginx帮助FastDFS生成文件位置的链接

而如果再部署额外的一台Nginx服务器,利用Nginx反向代理的功能,代理多个Storage Server的IP地址 + 8888端口号来访问Web页面,而Storage Server通过80端口来访问Nginx代理服务器,Nginx代理后,用户就可以通过HTTP请求的方式来访问文件资源


部署FastDFS集群案例

案例环境

操作系统

IP 地址

角色

Centos 7

192.168.10.101

Tracker Server①

Centos 7

192.168.10.102

Tracker Server②

Centos 7

192.168.10.103

Storage Server①

Centos 7

192.168.10.104

Storage Server②

Centos 7

192.168.10.105

Nginx反向代理服务器


初步设置

打开101 ~ 104这4台虚拟机并连接上XShell

导入下图中FastDFS相关源码包到每个主机(101和102)

FastDFS相关软件包下载地址:https://github.com/happyfish100

  • libfastcommon:是FastDFS的依赖函数库
  • fastdfs:FastDFS主程序
  • fastdfs-nginx-module:Storage需要这个软件包,这是FastDFS针对Nginx提供的模块,帮助用户定位文件位置

然后把刚才的两个包和FastDFS提供的Nginx模块,还有Nginx导入到103和104两个主机中

开启会话同步

因为开启会话同步,可以在任意主机操作。

为了方便实验,关闭防火墙和内核安全机制,安装所需依赖

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* zlib-devel libtool pcre-devel libevent

安装libfastcommon函数库

解压软件包,进入解压目录,编译,安装

[root@localhost ~]# tar zxvf libfastcommon-1.0.36.tar.gz
[root@localhost ~]# cd libfastcommon-1.0.36
[root@localhost libfastcommon-1.0.36]# ./make.sh
[root@localhost libfastcommon-1.0.36]# ./make.sh install

/usr/lib64存放64位库文件,/usr/lib存放32位库文件,,FastDFS就会在/usr/lib下查找库文件

为了确保FastDFS能够找到库文件,我们拷贝一份过去,然后回到root家目录

[root@localhost libfastcommon-1.0.36]# cd /usr/lib64
[root@localhost lib64]# cp libfastcommon.so /usr/lib
cp:是否覆盖"/usr/lib/libfastcommon.so"? y
[root@localhost lib64]# cd

安装FastDFS主程序

解压软件包,进入解压目录,编译,安装

[root@localhost ~]# tar zxvf fastdfs-5.11.tar.gz
[root@localhost ~]# cd fastdfs-5.11
[root@localhost fastdfs-5.11]# ./make.sh
[root@localhost fastdfs-5.11]# ./make.sh install

部署Tracker Server

断开103和104主机的XShell连接,只连接101和102主机,并且保持会话同步的开启

根据FastDFS提供的配置文件,拷贝出一份配置Tracker Server的配置文件,然后编辑该文件

[root@localhost ~]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
[root@localhost ~]# vim /etc/fdfs/tracker.conf

在第23行,修改存储文件的路径

这里的路径也可以不修改,只要保证该目录存在就可以

base_path=/fastdfs/tracker

在第53行,因为Storage Server默认使用的组名是group1,所以这里也修改为group1

store_group=group1

保存并退出,把刚才指定的存储文件的目录创建出来

[root@localhost ~]# mkdir -p /fastdfs/tracker

执行Tracker服务控制脚本,追加start参数,然后使用netstat命令查询状态.

[root@localhost ~]# /etc/init.d/fdfs_trackerd start
[root@localhost tracker]# netstat -anpt | grep fdfs
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      2166/fdfs_trackerd

部署Storage Server

现在断开101和102与XShell的连接,然后103和104主机连接上XShell

然后给103和104开启会话同步

根据FastDFS提供的配置文件,拷贝出Storage Server使用的配置文件,然后打开该配置文件

[root@localhost ~]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
[root@localhost ~]# vim /etc/fdfs/storage.conf

在第41行,修改日志文件存储位置

base_path=/fastdfs/storage

在第109行,修改存储目录位置

存储目录下就是一级目录和二级目录

store_path0=/fastdfs/storage

在第118和119行,修改Tracker Server的地址为我们刚才配置的两台主机

tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

保存并退出,创建存储目录,启动Storage Server,使用netstat命令检查是否开启

[root@localhost ~]# mkdir -p /fastdfs/storage
[root@localhost ~]# /etc/init.d/fdfs_storaged start
[root@localhost fdfs]# netstat -anpt | grep fdfs
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      2347/fdfs_storaged  
tcp        0      0 192.168.10.103:47766    192.168.10.101:22122    ESTABLISHED 2347/fdfs_storaged  
tcp        0      0 192.168.10.103:38278    192.168.10.102:22122    ESTABLISHED 2347/fdfs_storaged

部署客户端测试

这里我们直接使用104主机作为客户端来测试

关闭会话同步,在104主机操作

拷贝客户端使用的配置文件,然后打开

[root@localhost ~]# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
[root@localhost ~]# vim /etc/fdfs/client.conf

在第10行修改路径

base_path=/fastdfs/client

在第14和15行修改Tracker Server地址

tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

保存并退出,创建出存储目录

[root@localhost ~]# mkdir -p /fastdfs/client

如果不在root家目录就cd回root家目录,导入一张图片来测试

然后执行上传文件的脚本,指定配置文件和上传的文件

[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf logo.jpg 
group1/M00/00/00/wKgKZ2bD9N6AYgc5AAFMnKMUrMI0l64.jpg

因为104是一起作为Storage Server和客户端的,所以在104上也可以查到上传的文件

[root@localhost ~]# cd /fastdfs/storage/data/00/00/
[root@localhost 00]# ls
wKgKZ2bD9N6AYgc5AAFMnKMUrMI064.jpg

在103主机操作

根据上传后显示的文件位置,cd到对应的二级目录下,就可以看到上传的文件了

[root@localhost ~]# cd /fastdfs/storage/data/00/00/
[root@localhost 00]# ls
wKgKZ2bD9N6AYgc5AAFMnKMUrMI064.jpg

在104主机操作

初次之外还可以使用fdfs_test脚本指定配置文件来上传

显示了很多信息,比如访问该文件对应的链接(example file url)可以看到是一段URL,需要通过FastDFS提供的Nginx模块来使用。先记住这个链接,接下来安装该模块

[root@localhost ~]# fdfs_test /etc/fdfs/client.conf upload logo.jpg 

example file url: http://192.168.10.104/group1/M00/00/00/wKgKaGbD9c-AIm3yAAFMnKMUrMI587_big.jpg

安装fastdfs-nginx-module模块

开启103和104的会话同步,在任意一个主机操作

一开始的时候我们给103和104上传了fastdfs-nginx-module的源码包,这里就不再导入

解压,进入解压目录下的src目录,修改config文件,把安装环境改为我们主机上的环境

[root@localhost ~]# tar zxvf fastdfs-nginx-module_v1.16.tar.gz
[root@localhost ~]# cd fastdfs-nginx-module/src
[root@localhost src]# vim config

把第4行和第5行路径中的loacl字段删掉,改为下方内容

CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"

保存并退出,cd回root家目录

解压Nginx软件包,进入解压目录,创建程序用户,拷贝源代码到对应目录下,指定安装配置,安装

[root@localhost src]# cd
[root@localhost ~]# tar zxvf nginx-1.19.5.tar.gz
[root@localhost nginx-1.19.5]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.19.5]# cp /usr/include/fastcommon/* /usr/include/fastdfs/
[root@localhost nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/fastdfs-nginx-module/src/
[root@localhost nginx-1.19.5]# make && make install

优化Nginx命令路径,拷贝配置文件到FastDFS存放配置文件的目录下

[root@localhost nginx-1.19.5]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.19.5]# cd
[root@localhost ~]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

打开拷贝过去的配置文件

[root@localhost ~]# vim /etc/fdfs/mod_fastdfs.conf

在第40和41行修改Tracker Server配置,因为我们没有配置主机名,这里改成IP地址

tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122

在第53行,使用组名当做URL链接中的组,需要启用,修改为true

url_have_group_name = true

在第62行,修改存储目录位置

store_path0=/fastdfs/storage

保存并退出,拷贝使用HTTP访问文件的配置文件

访问链接中M00目录相当于data目录:http://192.168.10.104/group1/M00/00/00/wKgKaGbD9c-AIm3yAAFMnKMUrMI587_big.jpg

为了能够正处于运行,创建软链接

[root@localhost ~]# cp fastdfs-5.11/conf/http.conf /etc/fdfs/
[root@localhost ~]# cp fastdfs-5.11/conf/mime.types /etc/fdfs/
[root@localhost ~]# ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00

配置Nginx

打开Nginx配置文件,创建虚拟目录:在43行location单元的下方再添加一个location,启用ngx_fastdfs_module模块

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location /group1/M00 {
            ngx_fastdfs_module;
        }

保存并退出,使用nginx -t命令检查nginx配置文件语法是否正确,然后使用nginx命令启动nginx

[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# nginx

然后在宿主机的浏览器访问刚才记住的URL链接:http://192.168.10.104/group1/M00/00/00/wKgKaGbD9c-AIm3yAAFMnKMUrMI587_big.jpg

把URL前面的IP地址改为103也同样可以访问到该图片,那么用户在访问时到底用哪个IP去访问文件呢?

那么我们可以再部署一台Nginx服务器来提供反向代理的功能实现负载均衡


部署Nginx反向代理

打开192.168.10.105主机,连接上XShell

在105主机操作

导入Nginx源码包到系统

为了方便实验,关闭防火墙和内核安全机制,安装所需依赖

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* pcre-devel zlib-devel

解压Nginx软件包,进入解压目录,创建程序用户,指定安装配置,安装

[root@localhost ~]# tar zxvf nginx-1.19.5.tar.gz
[root@localhost nginx-1.19.5]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
[root@localhost nginx-1.19.5]# make && make install

优化命令路径,打开配置文件

[root@localhost ~]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

在第一个server单元的上方,添加upstream模块,针对103和104进行负载均衡,每个服务器的权重值都是1

upstream storage_server_group1 {
        server 192.168.10.103:80 weight=1;
        server 192.168.10.104:80 weight=1;
    }

只测试的话,可以把location单元内的内容改成代理的参数

location / {
            proxy_pass http://storage_server_group1;
        }

启动Nginx,然后去宿主机的浏览器测试

[root@localhost ~]# nginx

还是访问之前的地址,但是把开头的IP改成192.168.10.105,也就是Nginx代理服务器的IP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值