写点什么

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

用户头像
冰河
关注
发布于: 2020 年 09 月 27 日
【FastDFS】面试官:如何实现文件的大规模分布式存储?(全程实战)

写在前面


在《【FastDFS】小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?》一文中,详细的介绍了如何在 CentOS 8 服务器行搭建 FastDFS 环境。在生产环境中,往往需要对 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 fdfsfdfs_appender_testfdfs_appender_test1fdfs_append_filefdfs_crc32fdfs_delete_filefdfs_download_filefdfs_file_infofdfs_monitorfdfs_regenerate_filenamefdfs_storagedfdfs_testfdfs_test1fdfs_trackerdfdfs_upload_appenderfdfs_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 nginxnginx
复制代码


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


[root@localhost fdfs]# /usr/local/soft/nginx/sbin/nginx -Vnginx version: nginx/1.17.8built 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 fdfsroot      15067  0.0  0.0  12320   964 pts/0    S+   15:14   0:00  |   |           \_ grep --color=auto fdfsroot      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 22122tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      15026/fdfs_trackerd 
复制代码


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


# the tracker server portport = 22122
复制代码

配置 client.conf


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


(1)配置 client.conf


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


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


base_path = /data/fastdfs/trackertracker_server = 192.168.175.101:22122tracker_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/M00/00/00/rBEABF5aTEeAXHF4AAAABHf4XZU792.txt
复制代码


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


  • storage1 上


[root@d5d19e99e782 docker_tmp]# ls /data/fastdfs/storage/data/00/00rBEABF5aTEeAXHF4AAAABHf4XZU792.txt
复制代码


  • storage2 上


[root@f201111d0698 docker_tmp]# ls /data/fastdfs/storage/data/00/00rBEABF5aTEeAXHF4AAAABHf4XZU792.txt
复制代码


(2)指定 group 上传文件


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


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


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


(3)查看效果


  • storage3 上


[root@494ac47d63f8 fdfs]# ls /data/fastdfs/storage/data/00/00rBEABl5aUAqAXLCZAAAABHf4XZU043.txt
复制代码


  • storage4 上


[root@59fa1efff362 fdfs]# ls /data/fastdfs/storage/data/00/00rBEABl5aUAqAXLCZAAAABHf4XZU043.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 nginxnginx
复制代码


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


[root@localhost fdfs]# /usr/local/soft/nginx/sbin/nginx -Vnginx version: nginx/1.17.8built 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:22122tracker_server = 192.168.175.102:22122 #指定http服务的端口http.server_port = 80
复制代码


配置的不同之处:


192.168.175.103   group_name = group1192.168.175.104   group_name = group1192.168.175.105   group_name = group2192.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 fdfsroot      15630  0.0  0.0  12320   972 pts/0    S+   15:46   0:00  |   |           \_ grep --color=auto fdfsroot      15026  0.0  0.1 155696  6964 ?        Sl   15:13   0:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.confroot      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 23000tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      15573/fdfs_storaged 
复制代码


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


# the storage server portport = 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=group1connect_timeout=10tracker_server=192.168.175.101:22122tracker_server=192.168.175.102:22122url_have_group_name = truestore_path0=/data/fastdfs/storagegroup_count = 2
[group1]
group_name=group1storage_server_port=23000store_path_count=1store_path0=/data/fastdfs/storage
[group2]
group_name=group2storage_server_port=23000store_path_count=1store_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 nginxroot      24590  0.0  0.0  12320   980 pts/0    S+   16:44   0:00  |   |           \_ grep --color=auto nginxroot      24568  0.0  0.0  41044   428 ?        Ss   16:44   0:00  \_ nginx: master process /usr/local/soft/nginx/sbin/nginxnobody    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.txthttp://192.168.175.104/group1/M00/00/00/rBEABF5aTRiAEuHwAAAABHf4XZU322.txthttp://192.168.175.105/group2/M00/00/00/rBEABl5aUAqAXLCZAAAABHf4XZU043.txthttp://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.txthttp://192.168.175.101/group2/M00/00/00/rBEABl5aUAqAXLCZAAAABHf4XZU043.txt
复制代码

重磅福利


微信搜一搜【冰河技术】微信公众号,关注这个有深度的程序员,每天阅读超硬核技术干货,公众号内回复【PDF】有我准备的一线大厂面试资料和我原创的超硬核 PDF 技术文档,以及我为大家精心准备的多套简历模板(不断更新中),希望大家都能找到心仪的工作,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。如果有幸我们江湖再见!


另外,我开源的各个 PDF,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!

写在最后


如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!



发布于: 2020 年 09 月 27 日阅读数: 50
用户头像

冰河

关注

公众号:冰河技术 2020.05.29 加入

Mykit系列开源框架发起者、核心架构师和开发者,《海量数据处理与大数据技术实战》与《MySQL开发、优化与运维实战》作者。【冰河技术】微信公众号作者。

评论

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