zoukankan      html  css  js  c++  java
  • 【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 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/M00/00/00/rBEABF5aTEeAXHF4AAAABHf4XZU792.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
    

    重磅福利

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

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

    写在最后

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

  • 相关阅读:
    http://the-automator.com/set-excel-font/
    ds finder 唤醒
    gateone8271
    todo
    VS调试运行出错,某些类库项目中引用的命名空间提示不存在
    很有意思的问题
    关于textedit 某些电脑下 输入 显示不全的问题
    SQL Server把一台服务器上的数据库转移到另外一台服务器上。而转移完成后,需要给一个"登录"关联一个"用户"时,发生错误:“错误15023:当前数据库中已存在用户或角色”或“用户、组或角色 在当前数据库中已存在”
    构造简单好用的年份、年月选择器
    大数据下的grid显示
  • 原文地址:https://www.cnblogs.com/binghe001/p/13742420.html
Copyright © 2011-2022 走看看