前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FastDFS集群搭建

FastDFS集群搭建

作者头像
歪歪梯
发布2020-06-19 16:15:26
1.2K0
发布2020-06-19 16:15:26
举报
文章被收录于专栏:歪歪梯Club歪歪梯Club

FastDFS介绍

参考:http://www.oschina.net/p/fastdfs

FastDFS 是一个开源的分布式文件系统 它对文件进行管理,功能包括: 文件存储、文件同步、文件访问(文件上传、文件下载)等 解决了大容量存储和负载均衡的问题。 特别适合以文件为载体的在线服务,如相册网站、视频网站等等 FastDFS 服务端有两个角色:跟踪器(tracker)和存储器(storage) 跟踪器主要做调度工作,在访问上起负载均衡的作用 存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口

fastdfs架构

创建虚拟机

本次的搭建环境为,在虚拟机下的搭建 使用的镜像为centos6.9 首先创建6台虚拟机 2个跟踪者集群,两个group,每个group两个存储者集群 规定好每台虚拟机ip,后面配置静态ip

创建虚拟机

指定静态ip

接下来,给每台虚拟机绑定静态ip 不然每次重启都会重新分配ip

配置ip 使用命令

代码语言:javascript
复制
$ ifconfig

查看当前ip

关闭防火墙

在实际生产环境中,应该只开放用到的端口 因为此处是在本地的虚拟机 所以为了方便,笔者直接关闭每台虚拟机防火墙 使用命令

代码语言:javascript
复制
$ service iptables stop

此时,提示only use by root,需要root权限 于是我们先开启root权限

代码语言:javascript
复制
$ su root

然后输入当前用户的密码,验证通过后即具备root权限 这时候使用刚刚的命令关闭防火墙就没问题了 接下来,禁止防火墙开机自启动 使用命令

代码语言:javascript
复制
$ chkconfig iptables off

至此,虚拟机环境的准备工作就完成了 接下来就是搭建fastdfs了

下载工具包

后续用到的东西,笔者通过百度云分享在这里了 fastdfs相关

fastdfsTar 链接:https://pan.baidu.com/s/1mNVVmdA8luxzHkPUostgqw 密码:nt0f nginx相关

nginxTar 链接:https://pan.baidu.com/s/1vVEarFoFJvtoDe1xZROH_A 密码:05wp perl相关

perlTar 链接:https://pan.baidu.com/s/1iEeunTzU_voTjLSxx3ALyg 密码:2koi

规定好存储路径

在每台tracker里: 使用命令

代码语言:javascript
复制
$ mkdir /opt/fastdfs_tracker

创建/opt/fastdfs_tracker目录,作为tracker的base_path 在每台storager里:

代码语言:javascript
复制
$ mkdir /opt/fastdfs_storage_info
$ mkdir /opt/fastdfs_storage_data

创建/opt/fastdfs_storage_info目录,作为存储storage间同步文件的存储目录 创建/opt/fastdfs_storage_data目录,作为storage的存储目录

安装libfastcommon

此步每台fastdfs虚拟机都需要

上传压缩包到虚拟机有很多种方式 笔者采用较方便的,直接挂载文件夹

挂载虚拟机文件夹到本机文件夹 挂载后,虚拟机中的/mnt/hgfs/下,就会具备挂载到的本机目录 如果没有hgfs目录,手动创建一下,重新启用共享就好了 进入挂载目录(此处以挂载到桌面文件夹为例)

代码语言:javascript
复制
$ cd /mnt/hgfs/桌面/

解压命令

代码语言:javascript
复制
$ tar zxf libfastcommonV1.0.7.tar.gz -C /

-C / 参数代表指定解压到根目录,此处C必须大写 进入解压后的目录 执行make命令

代码语言:javascript
复制
$ cd /libfastcommon-1.0.7/
$ ./make.sh
$ ./make.sh install

根据安装信息,发现是在/usr/lib64,但fastDFS的主程序的lib目录是/usr/local/lib 所以要建立软连接

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

如果报缺乏gcc和perl环境的错误 先安装gcc和perl 使用命令

代码语言:javascript
复制
$ yum -y install gcc
$ yum -y install gcc-c++

安装gcc 接着安装perl 和刚刚一样,先解压perl的压缩包

代码语言:javascript
复制
$ tar zxf perl-5.20.2.tar.gz -C /
$ makedir /usr/local/perl
$ ./Configure-des-Dprefix=/usr/local/perl-Dusethreads=Uversiononly
$ make
$ make install
$ perl -version

然后就可以使用刚刚的两个命令安装libfastcommon,并创建软连接了

安装fastdfs

此步每台fastdfs虚拟机都需要

进入挂载目录(此处以挂载到桌面文件夹为例)

代码语言:javascript
复制
$ cd /mnt/hgfs/桌面/

解压命令

代码语言:javascript
复制
$ tar zxf FastDFS_v5.05.tar.gz -C /

-C / 参数代表指定解压到根目录,此处C必须大写 进入解压后的目录 执行make命令

代码语言:javascript
复制
$ cd /FastDFS/
$ ./make.sh
$ ./make.sh install

至此,所有fastdfs服务机必备的步骤就完成,接下来就是分别对tracker和storage配置了

配置tracker

以下操作对于两台tracker进行 复制并编辑配置文件

代码语言:javascript
复制
$ cd /etc/fdfs
$ cp tracker.conf.sample trakcer.conf
$ vi trakcer.conf

修改如下几个选项(#及后面内容不用输入进去)

代码语言:javascript
复制
disabled=false  #启用配置文件
port=22122  #使用端口
base_path=/opt/fastdfs_tracker  #数据和日志文件存储目录

按Esc 输入wq,回车保持并退出 启动tracker

代码语言:javascript
复制
$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

修改用户自定义开机脚本,配置开机自动启动tracker

代码语言:javascript
复制
$ vi /etc/rc.d/rc.local

在文件末尾加上开启tracker的命令 查看端口

代码语言:javascript
复制
$ netstat -untlp|grep 22122

有显示就是启动成功了 至此,完成了tracker的搭建 tracker的nginx负载均衡我们搭完storage再搭建 因为涉及到storage的缓存

配置storage

以下操作对于四台storage进行 不同的group对group_name进行修改 同一个group的storage的port必须使用一样的 复制并编辑配置文件

代码语言:javascript
复制
$ cd /etc/fdfs
$ cp storage.conf.sample storage.conf
$ vi storage.conf

修改如下几个选项(#及后面内容不用输入进去)

代码语言:javascript
复制
disabled=false    #启用配置文件

group_name=group1    #组名(第一组为 group1,第二组为 group2)

port=23001    #storage 的端口号,同一个组的 storage 端口号必须相同

base_path=/opt/fastdfs_storage_info    #设置 storage 的日志目录

store_path0=/opt/fastdfs_storage_data    #存储路径

store_path_count=1    #存储路径个数,需要和 store_path 个数匹配

tracker_server=192.168.156.151:22122    #tracker 服务器的 IP 地址和端口

tracker_server=192.168.156.152:22122    #多个 tracker 直接添加多条配置

按Esc 输入wq,回车保持并退出 启动storage

代码语言:javascript
复制
$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

修改用户自定义开机脚本,配置开机自动启动tracker

代码语言:javascript
复制
$ vi /etc/rc.d/rc.local

在文件末尾加上开启storage的命令 查看端口

代码语言:javascript
复制
$ netstat -untlp|grep 23001

有显示就是启动成功了 至此,完成了storage的搭建

查看所有节点

完成所有tracker和storage的启动后 可以在任意storage机器使用命令

代码语言:javascript
复制
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

查看整个fastdfs系统的信息

测试文件上传

复制,修改任意tracker机器里的client.conf配置文件

代码语言:javascript
复制
$ cd /etc/fdfs
$ cp client.conf.sample client.conf
$ vi client.conf

改动base_path和配置tracker_server

代码语言:javascript
复制
base_path=/opt/fastdfs_storage_info
tracker_server=192.168.156.151:22122
tracker_server=192.168.156.152:22122

上传命令(最后一个参数代表要上传的文件,此处为了方便使用client.conf上传测试)

代码语言:javascript
复制
$ /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/client.conf

如果有返回一个以group开头的字符串则是上传成功 至此,fastdfs的搭建我们已经完成近一半

storage安装nginx模块

此步骤每台storage都要安装 storage安装nginx的目的是作为服务器提供http方式访问文件,并解决不同storage之间同步延迟的问题 先创建一个安装nginx的目录

代码语言:javascript
复制
$ mkdir /usr/local/nginx
$ cd /usr/local/nginx

解压安装包修改配置

代码语言:javascript
复制
$ tar zxf /mnt/hgfs/桌面/fastdfs-nginx-module_v1.16.tar.gz -C .
$ tar zxf /mnt/hgfs/桌面/nginx-1.8.0.tar.gz -C .
$ cd fastdfs-nginx-module
$ vi src/config

修改CORE_INCS的值

代码语言:javascript
复制
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

安装编译nginx需要的依赖

代码语言:javascript
复制
$ yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

进入nginx目录并安装module

代码语言:javascript
复制
$ cd /usr/local/nginx/nginx-1.8.0
$ ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/fastdfs-nginx-module/src
$ make && make install

配置nginx

代码语言:javascript
复制
$ cd /usr/local/nginx
$ vi conf/nginx.conf

在listen 80那个server里面添加

代码语言:javascript
复制
location ~/group1/M00{
root /opt/fastdfs_storage_data/data;
ngx_fastdfs_module;
}

不同的group对应不同的路径 比如对于group2里的storage location就是 ~/group2/M00

复制nginx模块的配置文件并配置

代码语言:javascript
复制
$ cp /usr/local/nginx/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
$ vi /etc/fdfs/mod_fastdfs.conf

修改对应内容,此处以group1为例

代码语言:javascript
复制
connect_timeout=10

base_path=/opt/fastdfs_storage_info

tracker_server=192.168.156.151:22122

tracker_server=192.168.156.152:22122

storage_server_port=23001

group_name=group1

url_have_group_name = true

store_path0=/opt/fastdfs_storage_data

group_count = 2

[group1]

group_name=group1

storage_server_port=23001

store_path_count=2

store_path0=/opt/fastdfs_storage_data

store_path1=/opt/fastdfs_storage_data

[group2]

group_name=group2

storage_server_port=23002

store_path_count=2

store_path0=/opt/fastdfs_storage_data

store_path1=/opt/fastdfs_storage_data

复制fastdfs提供的配置文件

代码语言:javascript
复制
$ cd /FastDFS/conf
$ cp http.conf mime.types /etc/fdfs/

建立软连接, 将storage文件存储目录链接到实际存放数据的目录

代码语言:javascript
复制
$ ln -s /opt/fastdfs_storage_data/data /opt/fastdfs_storage_data/data/M00

启动nginx

代码语言:javascript
复制
$ /usr/local/nginx/sbin/nginx

因为我们用的是80端口 在浏览器输入http://storage的ip地址 能访问到nginx的界面则代表storage配合nginx成功了 将启动nginx命令写入开机文件

代码语言:javascript
复制
$ vi /etc/rc.d/rc.local

tracker中安装nginx

tracker安装nginx主要目的是负载均衡,反向代理以及缓存服务 以下步骤对于所有tracker都是必须 创建缓存目录

代码语言:javascript
复制
$ mkdir -p /opt/cache/nginx/proxy_cache
$ mkdir -p /opt/cache/nginx/proxy_cache/tmp

创建安装nginx的目录

代码语言:javascript
复制
$ mkdir /usr/local/nginx
$ cd /usr/local/nginx

解压安装包修改配置

代码语言:javascript
复制
$ tar zxf /mnt/hgfs/桌面/nginx-1.8.0.tar.gz -C .
$ tar zxf /mnt/hgfs/桌面/ngx_cache_purge-2.3.tar.gz -C .

安装编译nginx需要的依赖

代码语言:javascript
复制
$ yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

安装nginx

代码语言:javascript
复制
$ cd /usr/local/nginx/nginx-1.8.0
$ ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/ngx_cache_purge-2.3
$ make && make install

配置nginx

代码语言:javascript
复制
$ vi /usr/local/nginx/conf/nginx.conf

修改内容

代码语言:javascript
复制
events {
    worker_connections  1024;
    use epoll;
}
http{
    tcp_nopush  on;

    #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 /opt/cache/nginx/proxy_cache levels=1:2 
    keys_zone=http-cache:200m max_size=1g inactive=30d;
    proxy_temp_path /opt/cache/nginx/proxy_cache/tmp;

    #设置 group1 的服务器

    upstream fdfs_group1 {

    server 192.168.156.153 weight=1 max_fails=2 fail_timeout=30s; 
    server 192.168.156.154 weight=1 max_fails=2 fail_timeout=30s;

    }

    #设置 group2 的服务器

    upstream fdfs_group2 {

    server 192.168.156.155 weight=1 max_fails=2 fail_timeout=30s; 
    server 192.168.156.156 weight=1 max_fails=2 fail_timeout=30s;

    }
    server {

    listen  80;

    server_name localhost;

    #设置 group 的负载均衡参数

    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;
    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;
    proxy_pass http://fdfs_group2;
    expires 30d;
    }

    #设置清除缓存的访问权限

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

    }

}

启动nginx

代码语言:javascript
复制
$ /usr/local/nginx/sbin/nginx

因为我们用的是80端口 在浏览器输入http://storage的ip地址 能访问到nginx的界面则代表storage配合nginx成功了 将启动nginx命令写入开机文件

代码语言:javascript
复制
$ vi /etc/rc.d/rc.local

测试

机器测试

首先,访问每台服务器的nginx首页

nginx1 每台服务器的nginx都可以访问 OK!!! 如果有某一台访问不了 查看nginx目录下log目录里的日志文件 根据提示查错

上传测试

复制,修改任意tracker机器里的client.conf配置文件

代码语言:javascript
复制
$ cd /etc/fdfs
$ cp client.conf.sample client.conf
$ vi client.conf

改动base_path和配置tracker_server

代码语言:javascript
复制
base_path=/opt/fastdfs_storage_info
tracker_server=192.168.156.151:22122
tracker_server=192.168.156.152:22122

上传命令(最后一个参数代表要上传的文件,此处为了方便使用client.conf上传测试)

代码语言:javascript
复制
$ /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /etc/fdfs/client.conf

上传后得到一个返回的文件名

代码语言:javascript
复制
group2/M00/00/00/wKicm1saiXGALps_AAAF4Qywnmo39.conf

这时候我们在浏览器访问任意一台tracker的ip加上这个文件名 http://trackerip/group2/M00/00/00/wKicm1saiXGALps_AAAF4Qywnmo39.conf 都可以下载该文件 nginx会自动根据group选择不同的upstream,并根据负载均衡计算 跳转到某个storage服务器,看浏览器地址变化就明白了 至此,我们完成了采用Epoll进行负载均衡的fastdfs的搭建

进阶内容--keepalived实现tracker高可用负载

在每台tracker上 修改nginx的配置文件

代码语言:javascript
复制
$ vi /usr/local/nginx/conf/nginx.conf

修改内容

代码语言:javascript
复制
events {
    worker_connections  1024;
    #use epoll;
}
http{
    #tcp_nopush on;

    #gzip on;

    keepalive_timeout   65;

    # Tracker Proxy

    upstream fastdfs_tracker {

    server 192.168.156.151 weight=1 max_fails=2 fail_timeout=30s; 
    server 192.168.156.152 weight=1 max_fails=2 fail_timeout=30s;

    }

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

    proxy_pass  http://fastdfs_tracker/;

    proxy_set_header Host   $http_host;

    proxy_set_header Cookie $http_cookie;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 300m;

    }
}

这个时候,下载文件的路径就不再是trackerip+返回的文件名了 而是通过这个trackerip/dfs/+返回的文件名 这时候由keepalived程序计算 判断访问哪边的tracker,实现高可用 keepalived就是通过定时互相发送心跳,定时检查主从服务机的健康状态 判断服务机是否还活着,当主服务器死了,就由从服务器接手 配置完毕,重启nginx

代码语言:javascript
复制
$ /usr/local/nginx/sbin/nginx -s reload
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 歪歪梯Club 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建虚拟机
  • 指定静态ip
  • 关闭防火墙
  • 下载工具包
  • 规定好存储路径
  • 安装libfastcommon
    • 此步每台fastdfs虚拟机都需要
    • 安装fastdfs
      • 此步每台fastdfs虚拟机都需要
      • 配置tracker
      • 配置storage
      • 查看所有节点
      • 测试文件上传
      • storage安装nginx模块
        • 安装编译nginx需要的依赖
          • 配置nginx
            • 复制nginx模块的配置文件并配置
            • tracker中安装nginx
              • 安装编译nginx需要的依赖
                • 配置nginx
                • 测试
                  • 机器测试
                    • 上传测试
                    • 进阶内容--keepalived实现tracker高可用负载
                    相关产品与服务
                    负载均衡
                    负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档