Article / 文章中心

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

发布时间:2022-02-21 点击数:223
简介: 需求建立一个高性能的文件体系?我引荐你试试它.....(下)
[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的。