22

面试官:如何实现文件的大规模分布式存储?

 3 years ago
source link: http://stor.51cto.com/art/202009/627312.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

559e6eb45f133156a1e5ef567f97420f.jpg-wh_651x-s_1665178045.jpg

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:

https://github.com/sunshinelyz/mykit-delay

写在前面

在生产环境中,往往需要对FastDFS实现高可用,进而实现文件的大规模分布式存储。那么,如何实现FastDFS的高可用呢?今天,我们就基于CentOS 8服务器来搭建FastDFS高可用集群环境。

服务器版本

我们在服务器的命令行输入如下命令来查看服务器的内核版本。

[root@localhost lib]# cat /etc/redhat-release  
CentOS Linux release 8.1.1911 (Core)  

可以看到,集群中每台服务器的内核版本为:release 8.1.1911 (Core)。

服务器规划

这里,我们总共规划了6台服务器,分别为:2台tracker服务器,4台storage服务器,其中2台storage服务器为group1,两台storage服务器为group2。具体如下所示。

  • tracker服务器

tranker1:192.168.175.101

tracker2:192.168.175.102

  • storage服务器

storage1:192.168.175.103 group1

storage2:192.168.175.104 group1

storage3:192.168.175.105 group2

storage4:192.168.175.106 group2

环境准备

下载FastDFS

在每台服务器上执行如下命令下载FastDFS。

[root@localhost source]# wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz 
[root@localhost source]# wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz 
[root@localhost source]# wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz 

安装环境依赖

在每台服务器上执行如下命令安装FastDFS所依赖的环境。

[root@localhost dest]# yum install gcc gcc-c++ 
[root@localhost dest]# yum install libtool zlib zlib-devel openssl openssl-devel 
[root@localhost dest]# yum -y install pcre pcre-devel libevent libevent-devel perl unzip net-tools wget 

安装FastDFS

安装libfastcommon

在每台服务器上依次执行如下命令。

(1)解压libfastcommon的压缩包

[root@localhost source]# tar -zxvf V1.0.43.tar.gz 

(2)编译并安装编译并安装

[root@localhost source]# cd libfastcommon-1.0.43/ 
[root@localhost libfastcommon-1.0.43]# ./make.sh && ./make.sh install 

(3)检查执行的结果,看安装是否成功

[root@localhost libfastcommon-1.0.43]# ls /usr/lib64|grep libfastcommon 
libfastcommon.so 
 
[root@localhost libfastcommon-1.0.43]# ls /usr/lib|grep libfastcommon 
libfastcommon.so 

安装fastdfs

在每台服务器上依次执行如下命令。

(1)解压fastdfs

[root@localhost source]# tar -zxvf V6.06.tar.gz 

(2)安装fastdfs

[root@localhost source]# cd fastdfs-6.06/ 
[root@localhost fastdfs-6.06]# ./make.sh && ./make.sh install 

(3)检查fastdfs是否安装成功

[root@localhost fastdfs-6.06]# ls /usr/bin|grep fdfs 
fdfs_appender_test 
fdfs_appender_test1 
fdfs_append_file 
fdfs_crc32 
fdfs_delete_file 
fdfs_download_file 
fdfs_file_info 
fdfs_monitor 
fdfs_regenerate_filename 
fdfs_storaged 
fdfs_test 
fdfs_test1 
fdfs_trackerd 
fdfs_upload_appender 
fdfs_upload_file 

安装部署tracker服务

复制tracker的配置文件

在两台tracker服务器上,依次执行如下命令。

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

注意:无须生成storage.conf文件,这两台tracker不做为storage。

安装Nginx

在两台tracker服务器上,依次执行如下命令。

注意:tracker上不需要安装fastdfs-nginx-module

(1)解压Nginx

[root@localhost source]# tar -zxvf nginx-1.17.8.tar.gz 

(2)nginx配置,http_stub_status_module 模块

[root@localhost fdfs]# cd /usr/local/source/nginx-1.17.8/ 
[root@localhost nginx-1.17.8]# ./configure --prefix=/usr/local/soft/nginx --with-http_stub_status_module  

(3)编译安装Nginx

[root@localhost nginx-1.17.8]# make && make install 

(4)检查安装是否成功

[root@localhost nginx-1.17.8]# ls /usr/local/soft/ | grep nginx 
nginx 

(5)查看指定的编译参数是否起作用

[root@localhost fdfs]# /usr/local/soft/nginx/sbin/nginx -V 
nginx version: nginx/1.17.8 
built by gcc 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)  
configure arguments: --prefix=/usr/local/soft/nginx --with-http_stub_status_module  

配置并启动FastDFS

在两台tracker上,配置并启动FastDFS。

(1)创建tracker服务所需的目录

[root@localhost fdfs]# mkdir /data/fastdfs 
[root@localhost fdfs]# mkdir /data/fastdfs/tracker 
[root@localhost fdfs]# chmod 777 /data/fastdfs/tracker 

(2)配置tracker服务,修改 tracker.conf 文件

[root@localhost fdfs]# vi /etc/fdfs/tracker.conf 

只修改base_path一项的值为我们在上面所创建的目录即可

base_path = /data/fastdfs/tracker 

(3)启动 tracker 服务

[root@localhost fdfs]# /etc/init.d/fdfs_trackerd start 

(4)检查tracker服务启动是否成功

[root@localhost fdfs]# ps auxfww | grep fdfs 
root      15067  0.0  0.0  12320   964 pts/0    S+   15:14   0:00  |   |           \_ grep --color=auto fdfs 
root      15026  0.0  0.1  90160  5940 ?        Sl   15:13   0:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf 

说明:能看到 fdfs_trackerd,表示tracker服务启动成功。

(5)检查tracker服务是否已绑定端口 22122

[root@localhost dest]# netstat -anp | grep 22122 
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      15026/fdfs_trackerd  

说明:22122端口是在/etc/fdfs/tracker.conf中定义的,如下所示:

# the tracker server port 
port = 22122 

配置client.conf

两台tracker上,配置client.conf,配置fastdfs的客户端使用的配置文件。

(1)配置client.conf

[root@localhost fdfs]# vi /etc/fdfs/client.conf 

以下两项配置用到的tracker目录和服务器地址端口

base_path = /data/fastdfs/tracker 
tracker_server = 192.168.175.101:22122 
tracker_server = 192.168.175.102:22122 

说明:两台tracker上的client.conf配置相同

(2)从客户端的配置可以看到:客户端只需要了解tracker_server的信息。tracker server作用也正是负载均衡和调度

(3)Storage server作用是文件存储,客户端上传的文件最终存储在 Storage 服务上

测试文件

用client.conf上传文件测试。

(1)从tacker上传一个文件

[root@0268c2dc2bf6 ~]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/a.txt             

注意返回的是group1,我们可以group1下面的两台机器均找到此txt文件:

  • storage1上
[root@d5d19e99e782 docker_tmp]# ls /data/fastdfs/storage/data/00/00 
rBEABF5aTEeAXHF4AAAABHf4XZU792.txt 
  • storage2上
[root@f201111d0698 docker_tmp]# ls /data/fastdfs/storage/data/00/00 
rBEABF5aTEeAXHF4AAAABHf4XZU792.txt 

(2)指定group上传文件

如果想指定上传到某个group怎么办?例如:指定上传到group2

[root@0268c2dc2bf6 ~]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/a.txt 192.168.175.105:23000 
group2/M00/00/00/rBEABl5aUAqAXLCZAAAABHf4XZU043.txt 

说明:指定group2中任一台的ip和端口即可。

(3)查看效果

  • storage3上
[root@494ac47d63f8 fdfs]# ls /data/fastdfs/storage/data/00/00 
rBEABl5aUAqAXLCZAAAABHf4XZU043.txt 
  • storage4上
[root@59fa1efff362 fdfs]# ls /data/fastdfs/storage/data/00/00 
rBEABl5aUAqAXLCZAAAABHf4XZU043.txt 

安装部署storage服务

生成默认配置文件

四台storage上:生成启动fastdfs默认的配置文件。

[root@localhost fastdfs-6.06]# cd /etc/fdfs/ 
[root@localhost fdfs]# cp storage.conf.sample storage.conf 
[root@localhost fdfs]# cp client.conf.sample client.conf 

说明:不需要生成tracker.conf,因为storage上不再运行tracker服务

安装Nginx

四台storage上:安装nginx及fastdfs-nginx-module

(1)解压nginx

[root@localhost source]# tar -zxvf nginx-1.17.8.tar.gz 

(2)解压fastdfs-nginx-module

[root@localhost source]# tar -zxvf V1.22.tar.gz 

(3)修改config文件,把/usr/local 替换成 /usr

[root@localhost source]# cd fastdfs-nginx-module-1.22/ 
[root@localhost fastdfs-nginx-module-1.22]# cd src 
[root@localhost src]# vi config 

(4)Nginx配置,添加fastdfs-nginx-module和http_stub_status_module 模块

[root@localhost fdfs]# cd /usr/local/source/nginx-1.17.8/ 
[root@localhost nginx-1.17.8]# ./configure --prefix=/usr/local/soft/nginx --with-http_stub_status_module --add-module=/usr/local/source/fastdfs-nginx-module-1.22/src/ 

(5)编译安装nginx

[root@localhost nginx-1.17.8]# make && make install 

(6)检查安装是否成功

[root@localhost nginx-1.17.8]# ls /usr/local/soft/ | grep nginx 
nginx 

(7)查看指定的编译参数是否起作用

[root@localhost fdfs]# /usr/local/soft/nginx/sbin/nginx -V 
nginx version: nginx/1.17.8 
built by gcc 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)  
configure arguments: --prefix=/usr/local/soft/nginx --with-http_stub_status_module --add-module=/usr/local/source/fastdfs-nginx-module-1.22/src/ 

配置并启动storage服务

四台storage上:配置并启动storage服务

(1)创建storage服务所需的目录

[root@localhost fdfs]# mkdir /data/fastdfs/storage 
[root@localhost fdfs]# chmod 777 /data/fastdfs/storage/ 

(2)配置storage服务

编辑storage的配置文件:

[root@localhost fdfs]# vi /etc/fdfs/storage.conf 

各配置项包括:

group_name = group1 
#配置base_path为上面所创建的storage目录 
base_path = /data/fastdfs/storage 
#store_path :存储所在的目录,可以设置多个,注意从0开始 
store_path0 = /data/fastdfs/storage 
#tracker_server的ip和端口 
tracker_server = 192.168.175.101:22122 
tracker_server = 192.168.175.102:22122  
#指定http服务的端口 
http.server_port = 80 

配置的不同之处:

192.168.175.103   group_name = group1 
192.168.175.104   group_name = group1 
192.168.175.105   group_name = group2 
192.168.175.106   group_name = group2 

(3)启动storage服务

[root@localhost fdfs]# /etc/init.d/fdfs_storaged start 
正在启动 fdfs_storaged (via systemctl):                   [  确定  ] 

(4)检查storage服务启动是否成功

[root@localhost fdfs]# ps auxfww | grep fdfs 
root      15630  0.0  0.0  12320   972 pts/0    S+   15:46   0:00  |   |           \_ grep --color=auto fdfs 
root      15026  0.0  0.1 155696  6964 ?        Sl   15:13   0:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf 
root      15573  2.7  1.7 150736 66292 ?        Sl   15:45   0:02 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf 

说明:看到fdfs_storaged,表示storage服务启动成功

(5)检查storage服务是否已绑定到端口:23000

[root@localhost fdfs]# netstat -anp | grep 23000 
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      15573/fdfs_storaged  

说明:23000 端口是在配置文件 /etc/fdfs/storage.conf中定义的,如下:

# the storage server port 
port = 23000 

配置fastdfs-nginx-module

四台存储服务器上:配置fastdfs-nginx-module

(1)生成配置文件

[root@localhost nginx-1.17.8]# cp /usr/local/source/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/ 

(2)编辑配置文件

[root@localhost nginx-1.17.8]# vi /etc/fdfs/mod_fastdfs.conf 

配置以下几项

group_name=group1 
connect_timeout=10 
tracker_server=192.168.175.101:22122 
tracker_server=192.168.175.102:22122 
url_have_group_name = true 
store_path0=/data/fastdfs/storage 
group_count = 2 
 
[group1] 
 
group_name=group1 
storage_server_port=23000 
store_path_count=1 
store_path0=/data/fastdfs/storage 
 
[group2] 
 
group_name=group2 
storage_server_port=23000 
store_path_count=1 
store_path0=/data/fastdfs/storage 

说明:最上面的group_name:当机器属于group1这组时,值为group1;当机器属于group2这组时,值为group2。

说明:url_have_group_name = true。注意:这一项不要漏掉,会导致nginx不正常工作

(3)复制另两个web访问用到配置文件到fdfs配置目录下:

[root@d5d19e99e782 /]# cp /usr/local/source/fastdfs-6.06/conf/http.conf /etc/fdfs/ 
[root@d5d19e99e782 /]# cp /usr/local/source/fastdfs-6.06/conf/mime.types /etc/fdfs/ 

配置Nginx

四台存储服务器上:配置nginx

编辑nginx的配置文件:

[root@localhost conf]# vi /usr/local/soft/nginx/conf/nginx.conf 

在server listen 80 的这个server配置下面,

增加一个location

location ~/group([0-9]) { 
    root  /data/fastdfs/storage/data; 
    ngx_fastdfs_module; 
 
} 

启动nginx

(1)启动Nginx

[root@localhost storage]# /usr/local/soft/nginx/sbin/nginx 

(2)检查nginx是否已成功启动

[root@localhost storage]# ps auxfww | grep nginx 
root      24590  0.0  0.0  12320   980 pts/0    S+   16:44   0:00  |   |           \_ grep --color=auto nginx 
root      24568  0.0  0.0  41044   428 ?        Ss   16:44   0:00  \_ nginx: master process /usr/local/soft/nginx/sbin/nginx 
nobody    24569  0.0  0.1  74516  4940 ?        S    16:44   0:00      \_ nginx: worker process 

配置tracker服务

配置tracker服务

说明:这一步等待四台storage server配置完成后再进行。使用n=Nginx做upstream负载均衡的原因:可以通过一个地址访问后端的多个group

(1)文件上传完成后,从浏览器访问各个storage的Nginx即可:

例如:

http://192.168.175.103/group1/M00/00/00/rBEABF5aTRiAEuHwAAAABHf4XZU322.txt 
http://192.168.175.104/group1/M00/00/00/rBEABF5aTRiAEuHwAAAABHf4XZU322.txt 
http://192.168.175.105/group2/M00/00/00/rBEABl5aUAqAXLCZAAAABHf4XZU043.txt 
http://192.168.175.106/group2/M00/00/00/rBEABl5aUAqAXLCZAAAABHf4XZU043.txt 

说明:各台storage server的ip地址后面跟着上传时所返回的地址。注意:只能访问各台机器所在的group,

  • 如果想通过统一的ip地址进行访问
  • 需要在Nginx中通过upstream访问到后端的机器
  • 此Nginx应运行在tracker上

(2)配置nginx.conf

[root@0268c2dc2bf6 ~]# vi /usr/local/soft/nginx/conf/nginx.conf 

内容:

添加 upstream到后端的storage。

upstream fdfs_group1 { 
                server 192.168.175.103:80 weight=1  max_fails=2 fail_timeout=30s; 
                server 192.168.175.104:80 weight=1  max_fails=2 fail_timeout=30s; 
   } 
 
   upstream fdfs_group2 { 
                server 192.168.175.105:80 weight=1 max_fails=2 fail_timeout=30s; 
                server 192.168.175.106:80 weight=1 max_fails=2 fail_timeout=30s; 
   } 

针对带有group的url进行处理

location /group1 { 
    proxy_next_upstream http_502 http_504 error timeout invalid_header; 
    proxy_pass http://fdfs_group1; 
    expires 30d; 
} 
  
 location /group2 { 
     proxy_next_upstream http_502 http_504 error timeout invalid_header; 
     proxy_pass http://fdfs_group2; 
     expires 30d; 
 
} 

(3)重启测试

[root@0268c2dc2bf6 ~]# /usr/local/soft/nginx/sbin/nginx -s stop 
[root@0268c2dc2bf6 ~]# /usr/local/soft/nginx/sbin/nginx 

在浏览器中访问:

http://192.168.175.101/group1/M00/00/00/rBEABF5aTRiAEuHwAAAABHf4XZU322.txt 
http://192.168.175.101/group2/M00/00/00/rBEABl5aUAqAXLCZAAAABHf4XZU043.txt 

本文转载自微信公众号「冰河技术」,可以通过以下二维码关注。转载本文请联系冰河技术公众号。

YfmiyeB.jpg!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK