需要搭建一个高性能的文件系统?我推荐你试试它.....(下)

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 需要搭建一个高性能的文件系统?我推荐你试试它.....(下)
[root@localhost /]# cd /WorkSpace/SoftwareData/fdfs/data/storage0/data/ED/49/
[root@localhost 49]# ll
总用量 16
-rw-r--r--. 1 root root 17 9月  18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454
-rw-r--r--. 1 root root 17 9月  18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454_big
-rw-r--r--. 1 root root 49 9月  18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454_big-m
-rw-r--r--. 1 root root 49 9月  18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454-m
[root@localhost 49]# cat wKiJA19kwRqAI_g6AAAAEbcXlKw7921454
A fdfs test file


  • 文件上传成功,但是这个目录下面不止存在我们刚才上传的文件,还存在其它的一些文件,这里做一下说明:


filename:为文件本体。

filename-m:为文件元数据,例如文件的类型、大小、如果是图片还有长度宽度等。

filename_big:为备份文件,如果存在主备服务器,那么该文件会存放到备份服务器上。

filename_big-m:文件元数据的备份,如果存在主备服务器,那么该文件会存放到备份服务器上。


  • 文件下载,使用自带的FastDFS测试客户端,文件下载的方式与上传类似,使用fdfs_test 配置文件路径 download 组名 远程文件名称,即可下载该文件。
    示例如下:


[root@localhost /]# rm -rf fdfstest 
[root@localhost /]# fdfs_test /etc/fdfs/client.conf download group1 M00/ED/49/wKiJA19kwRqAI_g6AAAAEbcXlKw7921454
This is FastDFS client test program v6.06
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.fastken.com/ 
for more detail.
[2020-09-18 22:29:10] DEBUG - base_path=/WorkSpace/SoftwareData/fdfs/client, connect_timeout=5, 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_storage_id=0, storage server id count: 0
storage=192.168.137.3:23000
download file success, file size=17, file save to wKiJA19kwRqAI_g6AAAAEbcXlKw7921454
[root@localhost /]# cat wKiJA19kwRqAI_g6AAAAEbcXlKw7921454 
A fdfs test file


  • 文件下载成功。


文件删除测试,使用fdfs_test 配置文件路径 delete 组名 远程文件名称示例如下:


[root@localhost /]# fdfs_test /etc/fdfs/client.conf delete group1 M00/ED/49/wKiJA19kwRqAI_g6AAAAEbcXlKw7921454
This is FastDFS client test program v6.06
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.fastken.com/ 
for more detail.
[2020-09-18 22:31:40] DEBUG - base_path=/WorkSpace/SoftwareData/fdfs/client, connect_timeout=5, 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_storage_id=0, storage server id count: 0
storage=192.168.137.3:23000
delete file success
# 然后进入stroage的对应目录中查看文件是否还存在
[root@localhost /]# cd /WorkSpace/SoftwareData/fdfs/data/storage0/data/ED/49/
[root@localhost 49]# ll
总用量 8
-rw-r--r--. 1 root root 17 9月  18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454_big
-rw-r--r--. 1 root root 49 9月  18 22:15 wKiJA19kwRqAI_g6AAAAEbcXlKw7921454_big-m


  • 发现仅存在文件备份,而文件本体已删除成功。


FastDFS的HTTP访问


我们只使用了FastDFS自带的客户端测试工具来测试文件的上传、下载和删除,但是在实际状况下我们并不是这么操作文件的,而是通过程序发送请求来操作文件,那么就涉及到要通过HTTP访问文件,这里单纯依靠FastDFS就无法做到了,我们需要Nginx的配合。

Nginx的安装这里就不再赘述了,这里就默认大家都安装好了Nginx。这里直接进行nginx的配置。


配置之前我们首先需要一个nginx的扩展模块包——fastdfs-nginx-module,这里同样提供一个下载地址:fastdfs-nginx-module。



下载完成之后,将其上传到服务器并解压:


[root@localhost Software]# tar -zxvf fastdfs-nginx-module-1.22.tar.gz 
fastdfs-nginx-module-1.22/
fastdfs-nginx-module-1.22/HISTORY
fastdfs-nginx-module-1.22/INSTALL
fastdfs-nginx-module-1.22/src/
fastdfs-nginx-module-1.22/src/common.c
fastdfs-nginx-module-1.22/src/common.h
fastdfs-nginx-module-1.22/src/config
fastdfs-nginx-module-1.22/src/mod_fastdfs.conf
fastdfs-nginx-module-1.22/src/ngx_http_fastdfs_module.c


然后将mod_fastdfs.conf文件复制到/etc/fdfs目录下,并且修改它,修改项如下:


# 存储日志文件的路径,该路径必须存在,如果不存在需手动创建
base_path=/WorkSpace/SoftwareData/fdfs/nginx
# 指定Tracker Server的地址,我这里是192.168.137.3
tracker_server=192.168.137.3:22122
# 这里一定得改成true,请求中需要包含组名
url_have_group_name = true
# Storage存储文件的路径 这个配置必须和storage.conf中的配置相同
store_path0=/WorkSpace/SoftwareData/fdfs/data/storage0


配置完成后我们需要将这个扩展模块新增到原来的nginx中:


# 先查看当前nginx的信息
[root@localhost nginx-1.16.1]# nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
configure arguments: --prefix=/WorkSpace/Software/nginx
# 然后将--add-module=/WorkSpace/Software/fastdfs-nginx-module-1.22/src/添加到复制到configure的最后,重新执行configure,注意,新增的模块路径是每个人的都不一样,请勿直接复制粘贴。
[root@localhost nginx-1.16.1]# ./configure --prefix=/WorkSpace/Software/nginx --add-module=/WorkSpace/Software/fastdfs-nginx-module-1.22/src
# 然后执行make
[root@localhost nginx-1.16.1]# make
# make install 重新安装nginx
[root@localhost nginx-1.16.1]# make install
# 重新执行 nginx -V,如果出现刚才添加的模块,则安装成功
[root@localhost nginx]# nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
configure arguments: --prefix=/WorkSpace/Software/nginx --add-module=/WorkSpace/Software/fastdfs-nginx-module-1.22/src


修改nginx.conf文件,新增一个server:


server {
        listen       80;
        server_name  192.168.137.3;
        location ~/group[0-9]/M0[0-9]{
           ngx_fastdfs_module;
        }
}


然后重启nginx:


[root@localhost conf]# nginx -s reload
ngx_http_fastdfs_set pid=5044


如果你的nginx和fastdfs都是启动状态,那么此时已经可以访问成功了。


image.png


fastdfs-nginx-module的执行原理


完成了文件访问之后,我们复盘一下刚才我们做了什么,首先我们安装了nginx,然后将nginx的fastdfs扩展模块添加到nginx中,之后进行了一下扩展模块和nginx的配置,但在配置nginx的代理的时候,我们并没有像以前一样直接将代理地址写入配置中,而是将原来写代理地址的位置直接写了fastdfs扩展模块,那么这个模块究竟是如何运行起来的呢?


按照传统的nginx反向代理的配置方式,我们应该在拦截到请求之后,直接通过配置地址的方式,代理到目标服务器上,但是这里直接指向fastdfs模块,很显然,这个模块帮我们干了这件事。


还记得我们在扩展模块的配置文件中,配置了Tracker Server的地址吗?


当我们请求任意一个Group时,都会被nginx拦截下来然后发送给扩展模块,然后扩展模块通过我们配置的这个Tracker Server的地址,将请求转发给Tracker,Tracker会根据自己本地的group映射表,返回一个ip:port,例如我们刚才访问的是group1,那么扩展模块会将group1发送给Tracker, Tracker返回192.168.137.3:23000给nginx,然后扩展模块再通过这个地址,去访问storage,获取文件流,返回给浏览器。


image.png


FastDFS分布式集群搭建


单点FastDFS跑通之后,有同学可能就会有疑惑,那这和我们之前的文件系统也没有很大差别啊,前面说的横向扩展、容灾备份我们也完全都没有看到啊。

不急不急,这就来了。


刚才我们在一台机器上部署了FastDFS,并且测试了上传下载删除等功能,最后整合nginx完成了使用浏览器对文件的访问,并且了解了一下扩展模块的运行原理。这些是为了让大家更好的了解FastDFS,但是本篇文章主要介绍分布式文件系统,分布式文件系统最大的特点也就在于容灾备份、可扩展、高可用。那么接下来就是重头戏,来讲讲FastDFS分布式集群的搭建。


  • 架构图
    我们需要准备7台Linux虚拟机,来完成本次集群的搭建,包括1台Nginx,2台Tracker Server,4台Storage分为2个group,每个group中一主一备。
    我这里准备的linux服务器信息如下:


入口服务器:192.168.137.7

Tracker01:192.168.137.101

Tracker02:192.168.137.102

Group1:

Storage01:192.168.137.103

Storage02:192.168.137.104

Group2:

Storage03:192.168.137.105

Storage04:192.168.137.106


  • 其中Group1中的两台Storage相互备份,Group2中的两台Storage相互备份


image.png


  • 搭建


  1. 对这六台服务器,按照上文中的安装过程,依次安装Nginx和FastDFS。(步骤如上)
    建议在安装之前执行yum命令先一次性将依赖包安装完成:


yum -y install gcc perl openssl openssl-devel pcre pcre-devel zlib zlib-devel libevent libevent-devel wget net-tools


  1. 配置集群
    集群的配置和上面单体的配置有些许不同,由于我们是将Tracker和Storage拆开,所以在装Tracker的服务器上并不需要进行Storage的配置,同理在装Storage的机器上也不需要进行Tracker的配置。
    Tracker(101和102服务器)需要配置的点:


# 1.绑定ip  由于有两个Tracker,每个Tracker的IP都要不一样,请根据实际情况!
bind_addr = 192.168.137.101
# 2.设置端口
port = 22122
# 3.base目录 该目录需要手动创建,必须保证存在
base_path = /WorkSpace/SoftwareData/fdfs/log/tracker
# 4.上传文件选择group的方式
# 0:轮询
# 1:指定一个group
# 2:负载均衡,选择一个最多空闲空间的group来上传文件
store_lookup = 0


  1. Storage(103 104 105 106服务器)需要配置的点:


image.png


# 1.设置group_name 103 104为group1,105 106为group2
group_name = group1
# 2.绑定ip
bind_addr = 192.168.137.3
# 3.设置端口号
port = 23000
# bast_path 该路径必须手动创建
base_path = /WorkSpace/SoftwareData/fdfs/log/storage
# 配置storage存储文件的路径 路径必须手动创建
store_path0 = /WorkSpace/SoftwareData/fdfs/data/storage0
# Tracker Server的ip,由于有两个tracker server,所以需要配置两个
tracker_server = 192.168.137.101:22122
tracker_server = 192.168.137.102:22122


  • 集群启动
    使用fdfs_trackered 配置文件路径来启动trakcer:


image.png


使用fdfs_stroaged 配置文件路径来启动storage:


image.png


  • 我们可以在任意一台storage服务器中,使用fdfs_monitor /etc/fdfs/storage.conf命令来查看整个集群的状态:


[root@localhost ~]# fdfs_monitor /etc/fdfs/storage.conf
[2020-09-20 20:18:05] DEBUG - base_path=/WorkSpace/SoftwareData/fdfs/log/storage, connect_timeout=5, network_timeout=60, tracker_server_count=2, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=1, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
server_count=2, server_index=1
tracker server is 192.168.137.102:22122
#group总数
group count: 2
# group1信息
Group 1:
group name = group1
disk total space = 9,002 MB
disk free space = 7,234 MB
trunk free space = 0 MB
# storage主机数及存活数
storage server count = 2
active server count = 2
storage server port = 23000
storage HTTP port = 8888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0
 Storage 1:
  id = 192.168.137.103
  ip_addr = 192.168.137.103  ACTIVE
  http domain = 
  version = 6.06
  join time = 2020-09-20 20:06:21
  up time = 2020-09-20 20:06:21
  total storage = 9,002 MB
  free storage = 7,234 MB
  upload priority = 10
  store_path_count = 1
  subdir_count_per_path = 256
  storage_port = 23000
  storage_http_port = 8888
  current_write_path = 0
  source storage id = 192.168.137.104
  # 信息过长  省略....
 Storage 2:
  id = 192.168.137.104
  ip_addr = 192.168.137.104  ACTIVE
  http domain = 
  version = 6.06
  join time = 2020-09-20 20:06:23
  up time = 2020-09-20 20:06:23
  total storage = 9,002 MB
  free storage = 7,234 MB
  upload priority = 10
  store_path_count = 1
  subdir_count_per_path = 256
  storage_port = 23000
  storage_http_port = 8888
  current_write_path = 0
  source storage id = 
  # 信息过长  省略....
# group2信息
Group 2:
group name = group2
disk total space = 8,878 MB
disk free space = 7,110 MB
trunk free space = 0 MB
storage server count = 2
active server count = 2
storage server port = 23000
storage HTTP port = 8888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0
 Storage 1:
  id = 192.168.137.105
  ip_addr = 192.168.137.105  ACTIVE
  http domain = 
  version = 6.06
  join time = 2020-09-20 20:06:22
  up time = 2020-09-20 20:06:22
  total storage = 9,002 MB
  free storage = 7,234 MB
  upload priority = 10
  store_path_count = 1
  subdir_count_per_path = 256
  storage_port = 23000
  storage_http_port = 8888
  current_write_path = 0
  source storage id = 192.168.137.106
  # 信息过长  省略....
 Storage 2:
  id = 192.168.137.106
  ip_addr = 192.168.137.106  ACTIVE
  http domain = 
  version = 6.06
  join time = 2020-09-20 20:06:26
  up time = 2020-09-20 20:06:26
  total storage = 8,878 MB
  free storage = 7,110 MB
  upload priority = 10
  store_path_count = 1
  subdir_count_per_path = 256
  storage_port = 23000
  storage_http_port = 8888
  current_write_path = 0
  source storage id = 
  # 信息过长  省略....


  • 可以看到集群已经搭建成功了,并且我们可以看到每个storage的状态信息,例如每个节点的所属组、IP、存储空间大小、HTTP端口、是否启动、连接的tracker server等等。


  • 集群测试
    在六台机器中随意找一台配置client.conf文件,配置项如下:



#client.conf 需要改如下两个地方的配置
# 日志基础路径  一定要手动创建 否则无法使用client测试
base_path = /home/fdfs/log/client
# 追踪器地址
tracker_server = 192.168.137.101:22122
tracker_server = 192.168.137.102:22122


  • 然后创建一个用于测试上传功能的文件,创建完毕后,使用fdfs_upload_file进行上传,由于我们设置的上传模式是轮询,所以记住要多上传几遍,才能看出效果。


image.png


上传效果,可以看到group1的两台机器互为备份,而group2的两台机器互为备份。


image.png


  • 负载均衡策略
    刚才我们设置的上传策略是轮询,所以我们可以看到,每次在上传的时候,都会切换到与上一次不同的group中。FastDFS可以设置三种不同的负载均衡策略,分别是:轮询指定一个group上传选择一个剩余空间最多的group进行上传


# 上传文件选择group的方式
# 0:轮询
# 1:指定一个group
# 2:负载均衡,选择一个最多空闲空间的group来上传文件
store_lookup = 2
# 当store_lookup设置为1时,必须在这个参数中设置一个group用来上传文件
# 当store_lookup设置不为1时,这个参数无效
store_group = group2


  • 由于篇幅有限,这里就不一一测试了,感兴趣的同学可以在线下进行测试。


  • 访问集群中的文件


做一个简单的回顾,上文中在配置单体的FastDFS时,我们是如何通过HTTP访问文件的


我们使用了nginx,安装了fastdfs的扩展模块,然后在nginx中做了一个反向代理指向扩展模块,扩展模块去请求我们的tracker server获取到group对应的storage服务器的ip端口号等信息,然后扩展模块拿到这个信息之后,就去storage server中获取文件流,返回给浏览器。


所以FastDFS集群也一样,我们也需要通过nginx来访问文件,但是这里的配置略微有些不同。


我们得分这么几种情况来配置nginx:Tracker、Storage、入口服务器。


Tracker Server的nginx配置


upstream fastdfs_group_server{
    server 192.168.137.103:80;
    server 192.168.137.104:80;
    server 192.168.137.105:80;
    server 192.168.137.106:80;
}
server {
      listen        80;
      server_name   192.168.137.101;
      location ~ /group[1-9]/M0[0-9]{
          proxy_pass http://fastdfs_group_server;
      }
}


  • 启动nginx,如果nginx的work process没有正常启动,需要将mod_fastdfs.conf、fastdfs解压包目录中的mime.types和http.conf复制到/etc/fdfs目录下
    Storage Server的nginx配置
    首先需要配置mod_fastdfs.conf


base_path=/WorkSpace/SoftwareData/nginx
# group1的storage就写group1,group2的就写group2
group_name=group1
# tracker_server
tracker_server=192.168.137.101:22122
tracker_server=192.168.137.102:22122
# url包含组名
url_have_group_name = true
# 和storage.conf的配置相同
store_path0=/WorkSpace/SoftwareData/fdfs/data/storage0
# 有几个组就写几
group_count = 2
# group_count写几个组,这里就配置几个组
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/WorkSpace/SoftwareData/fdfs/data/storage0
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/WorkSpace/SoftwareData/fdfs/data/storage0


  • nginx配置:


server {
    listen  80;
    server_name 192.168.137.103;
    location ~ /group[1-9]/M0[0-9] {
            ngx_fastdfs_module;
    }
}


  • 然后启动Storage的nginx。
    测试一下访问:


image.png


  • 集群访问流程
    实际我们刚才不论是访问哪台服务器,都是可以正常访问到这个文件的。
    我们可以来推一下刚才的访问流程,我们刚才在tracker中配置了stroage的负载均衡,而在stroage的反向代理中配置了fastdfs的扩展模块


假设我们访问的是tracker,那么tracker服务器我们配置了负载均衡,负载均衡会自动路由到任意一台storage上,storage上配置了扩展模块,会带上我们访问的group去请求tracker,tracker返回这个group的storage的ip和端口号。


那么假设我们访问的是storage,那么storage里的扩展模块就直接携带我们的url中的group去访问tracker,一样也能找到storage的ip和端口。


所以只要group是正确的,无论访问哪台机器,都可以访问到文件。


  • 配置统一入口
    还记得我们搭集群之前说过,我们需要7台机器吗,但是现在我们只用了6台,第7台机器就是用在这里。
    因为刚才我们只是把集群搭起来了,但是这样我们需要记住6个ip地址,再来回顾一下最初的架构图:


image.png


我们需要提供一个nginx,负载均衡到两个tracker中,然后我们之后的程序就只需要访问这个入口,就可以正常使用整个集群的服务了。



nginx配置如下:


upstream tracker_server{
        server 192.168.137.101;
        server 192.168.137.102;
}
server {
    listen       80;
    server_name  192.168.137.3;
    location ~/group[0-9]/M0[0-9]{
        http://tracker_server;
    }
}


测试:


image.png


  • 集群搭建完毕。

结语

分布式文件系统对于传统文件系统的一些优势,具体在于容灾备份、横向扩展,和解决传统文件系统文中介绍的具体的技术——FastDFS整合nginx,作为分布式文件系统的解决方案之一,可以很好的解决一些生产环境下的巨量文件存储问题。


另外FastDFS也可以很方便的通过Java程序来对文件进行诸如上传下载之类的操作,但由于篇幅原因,本文中没有介绍到,当然如果大家感兴趣的话我会在下一篇博客中来具体说说在真实项目是如何使用FastDFS的。


欢迎大家访问:http://blog.objectspace.cn


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
7月前
|
存储 缓存 固态存储
深度解析linux主机:从应用到硬盘,玩转系统I/O性能优化攻略!
深度解析linux主机:从应用到硬盘,玩转系统I/O性能优化攻略!
108 0
|
存储 缓存 负载均衡
需要搭建一个高性能的文件系统?我推荐你试试它.....(上)
需要搭建一个高性能的文件系统?我推荐你试试它.....(上)
需要搭建一个高性能的文件系统?我推荐你试试它.....(上)
|
3月前
|
Linux Shell vr&ar
文件系统常用工具实战篇
文章详细介绍了Linux系统中用于查看和分析文件系统空间使用情况的命令工具df和du,以及用于转换和复制文件的dd命令的使用案例。
56 9
文件系统常用工具实战篇
|
缓存 网络协议 Unix
程序员超实用的文件系统性能评测工具盘点
程序员超实用的文件系统性能评测工具盘点
|
存储 固态存储 Linux
开启全新存储时代:SPDK文件系统项目实战指南
开启全新存储时代:SPDK文件系统项目实战指南
|
存储 Ubuntu Linux
docker文件存储驱动:AUFS 文件系统原理及生产环境的最佳配置
docker文件存储驱动:AUFS 文件系统原理及生产环境的最佳配置
269 0
|
存储 负载均衡 前端开发
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(一)
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)
260 0
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(一)
|
存储 算法 安全
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(二)
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)
128 0
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(二)
|
存储 监控 Java
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(三)
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)
213 0
保姆级教程-分布式文件系统FastDFS(高效存储,有效解决大量资源上传下载)(三)
|
存储 算法 安全
Linux操作系统:基础篇5基本功能之文件系统
在Linux操作系统中,文件系统是用来组织、管理、存放文件的一套管理机制。文件系统可以有不同的格式,叫做文件系统类型(file system types)。这些格式决定信息如何被存储为文件和目录。
651 0
Linux操作系统:基础篇5基本功能之文件系统