FastDFS集群搭建

  FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

       FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

       下面来看一张官网提供的集群图片,如下图所示。可以看到,Client端可以有多个,也就是同时支持多个客户端对FastDFS集群服务进行访问,Tracker是跟踪器,负责协调Client与Storage之间的交互,为了实现高可用性,需要用多个Tracker来做为跟踪器。Storage是专门用来存储东西的,而且是分组进行存储的,每一组可以有多台设备,这几台设备存储的内容完全一致,这样做也是为了高可用性,当现有分组容量不够时,我们可以水平扩容,即增加分组来达到扩容的目的。另外需要注意的一点是,如果一组中的设备容量大小不一致,比如设备A容量是80G,设备B的容量是100G,那么这两台设备所在的组的容量会以小的容量为准,也就是说,当存储的东西大小超过80G时,我们将无法存储到该组中了。Client端在与Storage进行交互的时候也与Tracker cluster进行交互,说的通俗点就是Storage向Tracker cluster进行汇报登记,告诉Tracker现在自己哪些位置还空闲,剩余空间是多大。

   下面再来看一张上传图片的时序图,从中可以看到

    1)Client通过Tracker server将文件上传到Storage server,它先向Tracker进行询问,Tracker查看一下登记信息之后
    2)Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
    3)Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
    4)上传完成会向Tracker进行汇报,告诉Tracker它当前是否还留有剩余空间,以及剩余空间大小。汇报完之后,Storage将服务器上存储图片的地址返回给Client,文件上传结束。



 再看一张下载图片的时序图,步骤如下:

    1)Client通过Tracker server下载指定Storage组中某个Storage server上的某个文件(文件名包括Storage组名称)。
    2)Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
    3)Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件下载。

先安装tracker和group的六台设备

tracker:10.0.80.199、10.0.80.200

group:10.0.80.201、10.0.80.202、10.0.80.203、10.0.80.204

1、安装libfastcommon。

下载地址:https://codeload.github.com/happyfish100/libfastcommon/zip/master

使用命令:unzip libfastcommon-master.zip -d /usr/local/fast/

编译libfastcommon,我们到/usr/local/fast/libfastcommon-master目录下,使用命令:./make.sh来进行编译,接着./make.sh install安装

创建第软链接的命令

ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so

ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

2、安装FastDFS

下载地址:https://codeload.github.com/happyfish100/fastdfs/zip/master

使用命令:unzip fastdfs-master.zip -d /usr/local/fast/

编译fastdfs,我们到/usr/local/fast/fastdfs-master目录下,使用命令:./make.sh来进行编译,接着./make.sh install安装

3、配置tracker1(10.0.80.199)和tracker2(10.0.80.200)。我们先到/etc/fdfs/目录下,使用cp tracker.conf.sample tracker.conf复制一份tracker.conf.sample并更名为tracker.conf

编辑tracker.conf文件,需要修改的地方有两处,第一处:base_path,将默认的路径修改为/fastdfs/tracker。第二处:store_lookup,该值默认是2(即负载均衡策略),现在把它修改为0(即轮询策略,修改成这样方便一会儿我们进行测试,当然,最终还是要改回到2的。如果值为1的话表明要始终向某个group进行上传下载操作,这时下图中的"store_group=group2"才会起作用,如果值是0或2,则"store_group=group2"不起作用)。

创建命令:mkdir -p /fastdfs/tracker,其中-p表示递归创建目录

 下面我们便使用命令:/etc/init.d/fdfs_trackerd start 进行启动,启动之后,我们再查看该目录,发现多了两个目录data和logs,我们可以通过命令:ps -ef | grep fdfs来查看tracker是否正常启动。 同理,我们启动一下10.0.80.200上的tracker。

4、配置storage,按照我们的规划,10.0.80.20110.0.80.20210.0.80.20310.0.80.204四台虚拟机将作为我们的存储节点,四个节点中同一组的配置应该是相同的,也就是10.0.80.20110.0.80.202一组(组名为group1),10.0.80.20310.0.80.204一组(组名为group2)。

     进入配置文件目录/etc/fdfs,然后进行复制storage.conf.sample并更名为storage.conf,使用的命令:cp storage.conf.sample storage.conf

  接下来我们编辑storage.conf文件,对于group1的10.0.80.20110.0.80.202这两台设备需要修改的配置如下。

       base_path=/fastdfs/storage
       store_path0=/fastdfs/storage
       tracker_server=10.0.80.199:22122
       tracker_server=10.0.80.200:22122


配置完了10.0.80.201,接下来我们把storage.conf文件复制到10.0.80.20210.0.80.20310.0.80.204这三台设备上。其中10.0.80.201这台设备与10.0.80.202同属于group1,因此把配置文件放到它的/etc/fdfs/目录后不用做任何修改。 但是10.0.80.20310.0.80.204这两台设备需要修改一下,只需要把group_name由group1改为group2

由于四个配置文件的base_path=/fastdfs/storage和store_path0=/fastdfs/storage都配置成了/fastdfs/storage,但是目前我们这四台虚拟机还未创建过该目录,因此我们需要为这四台虚拟机都创建一下该目录,命令:mkdir -p /fastdfs/storage

使用命令:/etc/init.d/fdfs_storaged start进行启动,再使用命令:tail -f /fastdfs/storage/logs/storaged.log来查看启动信息

5、当我们所有的tracker和storage节点都启动成功之后,我们可以在任意的一个存储节点上查看存储集群的信息,命令:/usr/bin/fdfs_monitor /etc/fdfs/storage.conf,可以看到集群信息。可以看到tracker Server有两个,当前提供服务的是10.0.80.199,group的数量是2,第一组的IP有10.0.80.20110.0.80.202,第二组的IP有10.0.80.20310.0.80.204

6、tracker和storage集群上传图片

     进入到10.0.80.199 /etc/fdfs/目录下,cp client.conf.sample client.conf复制一份该文件并命名为client.conf

     修改的配置有

    base_path=/fastdfs/tracker
    tracker_server=10.0.80.199:22122
    tracker_server=10.0.80.200:22122


使用的命令:/usr/bin/fdfs_upload_file  /etc/fdfs/client.conf  /usr/local/3.jpg

按回车执行上传命令后,会返回一个串:group1/M00/00/00/wKicB1jjiFmAOUdkAAHk-VzqZ6w720.jpg,其中group1表示这张图片被保存在了哪个组当中,M00代表磁盘目录,如果电脑只有一个磁盘那就只有M00, 如果有多个磁盘,那就M01、M02...等等。00/00代表磁盘上的两级目录,每级目录下是从00到FF共256个文件夹,两级就是256*256个

     多次上传图片,就可以看到存储确实是一次group1,一次group2,轮询进行存储;

     同处一个组的某台设备如果发生了故障,那么这时上传的文件将只能存放到其它同组设备上,等故障设备修复后,同组的其它设备会自动将数据同步到该故障设备上

7、 到目前为止,我们还是不能够使用http方式来上传或下载文件的,因此我们需要配置下nginx来达到这个目的

      在10.0.80.201下载fastdfs-nginx-module插件

      下载地址:https://codeload.github.com/happyfish100/fastdfs-nginx-module/zip/master

       进入到/usr/local/nginx-1.12.0/目录下,然后在下面的输入框中输入命令:./configure --add-module=/usr/local/fast/fastdfs-nginx-module/src/

      执行: make && make install

      cp /usr/local/fast/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

      vi /etc/fdfs/mod_fastdfs.conf

connect_timeout=10
tracker_server=10.0.80.199:22122
tracker_server=10.0.80.200:22122
storage_server_port=23000//默认就是2300,不用做修改
url_have_group_name=true
store_path0=/fastdfs/storage
group_name=group1
#组数 
group_count=2


[group1]
group_name=group1
storage_server_port=23000
#存储路径个数
store_path_count=1
store_path0=/fastdfs/storage


[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage


这个配置文件复制到其它三台设备上,在10.0.80.20310.0.80.204将修改group_name=group2

把/usr/local/fast/fastdfs-master/conf/目录下的http.conf和mime.types两个文件复制到/etc/fdfs/目录下

四个节点都创建一下软链接,步骤都一样,输入创建软链接命令:ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00

创建完软链接之后,我们来配置下nginx,由于四个节点操作一样,我们都进入到/etc/nginx/conf/这个目录下,并使用命令vinginx.conf来编辑该文件,我们需要修改的地方有listen端口,把它由80改成8888,至于原因,是因为在上面搭建storage的时候使用的端口是8888,因此这里也需要使用8888。另一个修改的地方是location,修改代码如下,路径采用正则表达式来匹配,匹配group0到group9下的M00前缀。由于fastdfs与nginx的模块结合,因此需要在location当中添加该模块。

location ~/group([0-9])/M00 {  
              ngx_fastdfs_module;   
        }  

8、配置反向代理,在两个跟踪器上安装nginx(也就是10.0.80.19910.0.80.200)以提供反向代理服务

     安装nginx,修改nginx.cnf
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
    use epoll;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    #设置缓存
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 300m;

    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 16k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    #设置缓存存储路径,存储方式,分别内存大小,磁盘最大空间,缓存期限
    proxy_cache_path /fastdfs/cache/nginx/proxy_cache levels=1:2
    keys_zone=http-cache:200m max_size=1g inactive=30d;
    proxy_temp_path /fastdfs/cache/nginx/proxy_cache/tmp;
    #group1的服务设置
    upstream fdfs_group1 {
         server 10.0.80.201:8888 weight=1 max_fails=2 fail_timeout=30s;
         server 10.0.80.202:8888 weight=1 max_fails=2 fail_timeout=30s;
    }
    #group2的服务设置
    upstream fdfs_group2 {
         server 10.0.80.203:8888 weight=1 max_fails=2 fail_timeout=30s;
         server 10.0.80.204:8888 weight=1 max_fails=2 fail_timeout=30s;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        #group1的负载均衡配置
        location /group1/M00 {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_cache http-cache;
            proxy_cache_valid 200 304 12h;
            proxy_cache_key $uri$is_args$args;
            #对应group1的服务设置
            proxy_pass http://fdfs_group1;
            expires 30d;
        }

        location /group2/M00 {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_cache http-cache;
            proxy_cache_valid 200 304 12h;
            proxy_cache_key $uri$is_args$args;
            #对应group2的服务设置
            proxy_pass http://fdfs_group2;
            expires 30d;
         }

        location ~/purge(/.*) {
            allow 127.0.0.1;
            allow 10.0.80.0/24;
            deny all;
            proxy_cache_purge http-cache $1$is_args$args;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}                             
正常情况下,配置成功;如果出现connect() to 10.0.80.202:8888 failed (13: Permission denied) while connecting to upstream, client: 10.0.80.100, server: localhost, request: "GET /group1/M00/00/00/CgBQyVn29DOAMJpvAAALflYhs9M448.jpg HTTP/1.1", upstream: "http://10.0.80.202:8888/group1/M00/00/00/CgBQyVn29DOAMJpvAAALflYhs9M448.jpg", host: "10.0.80.199" 错误

#临时关闭selinux防火墙,但重启后失效。
[root@localhost ~]# setenforce 0

访问测试成功



参考:http://blog.csdn.net/u012453843/article/details/68957209


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值