前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【FastDFS】面试官:如何实现文件的大规模分布式存储?(全程实战)

【FastDFS】面试官:如何实现文件的大规模分布式存储?(全程实战)

作者头像
冰河
发布2020-10-29 11:06:22
1K0
发布2020-10-29 11:06:22
举报
文章被收录于专栏:冰河技术

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

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

PS: 欢迎各位Star源码,也可以pr你牛逼哄哄的代码。

写在前面

在《【FastDFS】小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?》一文中,详细的介绍了如何在CentOS 8服务器搭建FastDFS环境。在生产环境中,往往需要对FastDFS实现高可用,进而实现文件的大规模分布式存储。那么,如何实现FastDFS的高可用呢?今天,我们就基于CentOS 8服务器来搭建FastDFS高可用集群环境。

服务器版本

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

代码语言:javascript
复制
[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。

代码语言:javascript
复制
[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所依赖的环境。

代码语言:javascript
复制
[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的压缩包

代码语言:javascript
复制
[root@localhost source]# tar -zxvf V1.0.43.tar.gz

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

代码语言:javascript
复制
[root@localhost source]# cd libfastcommon-1.0.43/
[root@localhost libfastcommon-1.0.43]# ./make.sh && ./make.sh install

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

代码语言:javascript
复制
[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

代码语言:javascript
复制
[root@localhost source]# tar -zxvf V6.06.tar.gz

(2)安装fastdfs

代码语言:javascript
复制
[root@localhost source]# cd fastdfs-6.06/
[root@localhost fastdfs-6.06]# ./make.sh && ./make.sh install

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

代码语言:javascript
复制
[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服务器上,依次执行如下命令。

代码语言:javascript
复制
[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

代码语言:javascript
复制
[root@localhost source]# tar -zxvf nginx-1.17.8.tar.gz

(2)nginx配置,http_stub_status_module 模块

代码语言:javascript
复制
[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

代码语言:javascript
复制
[root@localhost nginx-1.17.8]# make && make install

(4)检查安装是否成功

代码语言:javascript
复制
[root@localhost nginx-1.17.8]# ls /usr/local/soft/ | grep nginx
nginx

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

代码语言:javascript
复制
[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服务所需的目录

代码语言:javascript
复制
[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 文件

代码语言:javascript
复制
[root@localhost fdfs]# vi /etc/fdfs/tracker.conf

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

代码语言:javascript
复制
 base_path = /data/fastdfs/tracker

(3)启动 tracker 服务

代码语言:javascript
复制
[root@localhost fdfs]# /etc/init.d/fdfs_trackerd start

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

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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中定义的,如下所示:

代码语言:javascript
复制
# the tracker server port
port = 22122

配置client.conf

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

(1)配置client.conf

代码语言:javascript
复制
[root@localhost fdfs]# vi /etc/fdfs/client.conf

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

代码语言:javascript
复制
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上传一个文件

代码语言:javascript
复制
[root@0268c2dc2bf6 ~]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/a.txt                    group1/M00/00/00/rBEABF5aTEeAXHF4AAAABHf4XZU792.txt

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

  • storage1上
代码语言:javascript
复制
[root@d5d19e99e782 docker_tmp]# ls /data/fastdfs/storage/data/00/00
rBEABF5aTEeAXHF4AAAABHf4XZU792.txt
  • storage2上
代码语言:javascript
复制
[root@f201111d0698 docker_tmp]# ls /data/fastdfs/storage/data/00/00
rBEABF5aTEeAXHF4AAAABHf4XZU792.txt

(2)指定group上传文件

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

代码语言:javascript
复制
[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上
代码语言:javascript
复制
[root@494ac47d63f8 fdfs]# ls /data/fastdfs/storage/data/00/00
rBEABl5aUAqAXLCZAAAABHf4XZU043.txt
  • storage4上
代码语言:javascript
复制
[root@59fa1efff362 fdfs]# ls /data/fastdfs/storage/data/00/00
rBEABl5aUAqAXLCZAAAABHf4XZU043.txt

安装部署storage服务

生成默认配置文件

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

代码语言:javascript
复制
[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

代码语言:javascript
复制
[root@localhost source]# tar -zxvf nginx-1.17.8.tar.gz

(2)解压fastdfs-nginx-module

代码语言:javascript
复制
[root@localhost source]# tar -zxvf V1.22.tar.gz

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

代码语言:javascript
复制
[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 模块

代码语言:javascript
复制
[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

代码语言:javascript
复制
[root@localhost nginx-1.17.8]# make && make install

(6)检查安装是否成功

代码语言:javascript
复制
[root@localhost nginx-1.17.8]# ls /usr/local/soft/ | grep nginx
nginx

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

代码语言:javascript
复制
[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服务所需的目录

代码语言:javascript
复制
[root@localhost fdfs]# mkdir /data/fastdfs/storage
[root@localhost fdfs]# chmod 777 /data/fastdfs/storage/

(2)配置storage服务

编辑storage的配置文件:

代码语言:javascript
复制
[root@localhost fdfs]# vi /etc/fdfs/storage.conf

各配置项包括:

代码语言:javascript
复制
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

配置的不同之处:

代码语言:javascript
复制
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服务

代码语言:javascript
复制
[root@localhost fdfs]# /etc/init.d/fdfs_storaged start
正在启动 fdfs_storaged (via systemctl):                   [  确定  ]

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

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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中定义的,如下:

代码语言:javascript
复制
# the storage server port
port = 23000

配置fastdfs-nginx-module

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

(1)生成配置文件

代码语言:javascript
复制
[root@localhost nginx-1.17.8]# cp /usr/local/source/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/

(2)编辑配置文件

代码语言:javascript
复制
[root@localhost nginx-1.17.8]# vi /etc/fdfs/mod_fastdfs.conf

配置以下几项

代码语言:javascript
复制
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配置目录下:

代码语言:javascript
复制
[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的配置文件:

代码语言:javascript
复制
[root@localhost conf]# vi /usr/local/soft/nginx/conf/nginx.conf

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

增加一个location

代码语言:javascript
复制
location ~/group([0-9]) {
    root  /data/fastdfs/storage/data;
    ngx_fastdfs_module;

}

启动nginx

(1)启动Nginx

代码语言:javascript
复制
[root@localhost storage]# /usr/local/soft/nginx/sbin/nginx

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

代码语言:javascript
复制
[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即可:

例如:

代码语言:javascript
复制
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

代码语言:javascript
复制
[root@0268c2dc2bf6 ~]# vi /usr/local/soft/nginx/conf/nginx.conf

内容:

添加 upstream到后端的storage。

代码语言:javascript
复制
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进行处理

代码语言:javascript
复制
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)重启测试

代码语言:javascript
复制
[root@0268c2dc2bf6 ~]# /usr/local/soft/nginx/sbin/nginx -s stop
[root@0268c2dc2bf6 ~]# /usr/local/soft/nginx/sbin/nginx

在浏览器中访问:

代码语言:javascript
复制
http://192.168.175.101/group1/M00/00/00/rBEABF5aTRiAEuHwAAAABHf4XZU322.txt
http://192.168.175.101/group2/M00/00/00/rBEABl5aUAqAXLCZAAAABHf4XZU043.txt

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰河技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 服务器版本
  • 服务器规划
  • 环境准备
    • 下载FastDFS
      • 安装环境依赖
      • 安装FastDFS
        • 安装libfastcommon
          • 安装fastdfs
          • 安装部署tracker服务
            • 复制tracker的配置文件
              • 安装Nginx
                • 配置并启动FastDFS
                  • 配置client.conf
                    • 测试文件
                    • 安装部署storage服务
                      • 生成默认配置文件
                        • 安装Nginx
                          • 配置并启动storage服务
                            • 配置fastdfs-nginx-module
                              • 配置Nginx
                                • 启动nginx
                                • 配置tracker服务
                                  • 配置tracker服务
                                  相关产品与服务
                                  云服务器
                                  云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档