返回顶部

分布式存储FastDFS搭建

一、FastDFS分布式系统架构

FastDFS:是一个开源的轻量级分布式文件系统,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合中小文件(建议范围:4KB < file_size <500MB),对以文件为载体的在线服务,如相册网站、视频网站等。

FastDFS是为互联网应用量身定做的分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标。和现有的类Google FS分布式文件系统相比,FastDFS的架构和设计理念有其独到之处,主要体现在轻量级、分组方式和对等结构三个方面。

FastDFS架构图

FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。

img

FastDFS模块介绍
(1) tracker server:跟踪服务器,用来调度来自客户端的请求,且在内存中记录所有存储组和存储服务器的信息状态。
(2) storage server:存储服务器,用来存储文件(data)和文件属性(metadata)。
(3) client:客户端,业务请求发起方,通过专用接口基于TCP协议与tracker server和storage server进行交互。
(4) group:组,也可称为卷,同组内上的文件是完全相同的。
(5) 文件标识:包括两部分,组名(group)和文件名(含路径)
(6) 文件相关属性:键值对(Key Value Pair)方式
(7) 文件名:与原文件名并不相同。由storage server根据特定信息生成,并且可逆,文件名包含:源存储服务器的IP地址、文件创建时间戳、文件大小、随机数和文件扩展名等。

二、前期准备

2.1、主机规划

IP 描述 分组
192.168.80.7 跟踪服务器1&分布式存储服务器1&web负载均衡服务器 group1
192.168.80.17 跟踪服务器2&分布式存储服务器2&web负载均衡服务器 group2
192.168.80.27 跟踪服务器3&分布式存储服务器3&web负载均衡服务器 group3

2.2、关闭防火墙

# 停止
systemctl stop firewalld.service
# 禁用
systemctl disable firewalld.service

2.3、关闭SELinux

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux

2.4、设置时间同步

# 设置时区
timedatectl set-timezone Asia/Shanghai

# 同步时间
yum install -y ntpdate
ntpdate time1.aliyun.com

三、部署FastDFS

3.1、安装libfastcommon

#安装依赖包
yum install -y make cmake gcc gcc-c++

#创建软件包存放目录
mkdir -pv /usr/local/soft/package
cd /usr/local/soft/package

#下载libfastcommon
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

#解压并安装
tar -xf V1.0.43.tar.gz
cd libfastcommon-1.0.43
./make.sh
./make.sh install

3.2、安装FastDFS

#下载安装包
cd /usr/local/soft/package
wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

#解压并安装
tar -xf V6.06.tar.gz
cd fastdfs-6.06
./make.sh
./make.sh install

3.3、配置跟踪器Tracker

(1) 复制配置文件

cd /etc/fdfs
cp tracker.conf.sample tracker.conf

(2) 修改配置文件

vim /etc/fdfs/tracker.conf
#注意以下项目的修改
disabled=false           //启用配置文件
port=22122               //tracker 的端口号,一般采用 22122 这个默认端口
base_path = /usr/local/soft/fastdfs/tracker	//tracker 的数据文件和日志目录
store_lookup=2           //上传文件采取组选择方式,0.轮巡、1.指定组、2.选择最大空闲空间的组

(3) 创建数据目录

mkdir -p /usr/local/soft/fastdfs/tracker

(4) 启动tracker服务

/etc/init.d/fdfs_trackerd start

(5) 设置tracker服务开机启动

chkconfig fdfs_trackerd on

3.4、配置FastDFS存储服务

(1) 复制配置文件

cd /etc/fdfs
cp storage.conf.sample storage.conf

(2) 修改配置文件

vim /etc/fdfs/storage.conf
#注意以下项目的修改
disabled=false           //启用配置文件
group_name = group1		//组名(按主机规划里的修改各台主机的配置)
base_path = /usr/local/soft/fastdfs/storage		//设置storage的数据和日志目录
store_path_count = 1	//存储路径个数,需要和 store_path 个数匹配
store_path0=/usr/local/soft/fastdfs/storage     //存储路径
tracker_server=192.168.80.7:22122     //tracker 服务器的 IP 地址和端口
tracker_server=192.168.80.17:22122    //多个 tracker 直接添加多条配置
tracker_server=192.168.80.27:22122    //多个 tracker 直接添加多条配置
http.server_port=8088                 //设置 http 端口号

(3) 创建数据目录

mkdir -p /usr/local/soft/fastdfs/storage

(4) 启动storage服务

/etc/init.d/fdfs_storaged start

(5) 设置storage服务开机启动

chkconfig fdfs_storaged on

(6) 查看集群信息

#所有storage节点都启动之后,可以在任一storage节点上使用如下命令查看集群信息
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

3.5、配置客户端服务

(1) 复制配置文件

cd /etc/fdfs
cp client.conf.sample client.conf

(2) 修改配置文件

vim /etc/fdfs/client.conf
#注意以下项目的修改
base_path = /usr/local/soft/fastdfs/client	//设置client的数据和日志目录
tracker_server=192.168.80.7:22122     //tracker服务器的IP地址和端口
tracker_server=192.168.80.17:22122    //多个 tracker 直接添加多条配置
tracker_server=192.168.80.27:22122    //多个 tracker 直接添加多条配置

(3) 创建数据目录

mkdir -p /usr/local/soft/fastdfs/client

(4) 测试上传

#新建一个文件
touch /usr/local/soft/package/a.txt

#使用FastDFS上传命令,将测试文件上传到FastDFS存储里
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/soft/package/a.txt 
##如能返回以下文件ID号,说明上传成功
group1/M00/00/00/wKhQB2B2giWABJqWAAAAAAAAAAA166.txt

#删除
/usr/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKhQB2B2giWABJqWAAAAAAAAAAA166.txt

3.6、安装fastdfs-nginx-module

此部分安装在各个存储节点上,需要通过nginx安装。

(1) 安装依赖包

yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

(2) 安装nginx和fastdfs-nginx-module

#下载安装包
cd /usr/local/soft/package
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz
wget http://nginx.org/download/nginx-1.18.0.tar.gz

#解压
tar -xf V1.22.tar.gz
tar -xf nginx-1.18.0.tar.gz

#新建nginx用户
useradd -r -s /sbin/nologin nginx

#将fastdfs-nginx-module拷贝至nginx目录
mkdir /usr/local/soft/package/nginx-1.18.0/add_module
cp -r fastdfs-nginx-module-1.22 nginx-1.18.0/add_module/fastdfs-nginx-module

#编译nginx
cd nginx-1.18.0
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/soft/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream \
--add-module=/usr/local/soft/package/nginx-1.18.0/add_module/fastdfs-nginx-module/src/

#安装nginx
make && make install

#复制fastdfs-nginx-module源码中的配置文件到/etc/fdfs目录,并修改
cp /usr/local/soft/package/nginx-1.18.0/add_module/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
vim /etc/fdfs/mod_fastdfs.conf
##注意修改以下内容
tracker_server=192.168.80.7:22122	//tracker 服务器的 IP 地址和端口
tracker_server=192.168.80.17:22122	//多个 tracker 直接添加多条配置
tracker_server=192.168.80.27:22122	//多个 tracker 直接添加多条配置	
group_name=group1	//组名(按主机规划里的修改各台主机的配置)
url_have_group_name = true
store_path0=/usr/local/soft/fastdfs/storage
group_count = 3

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/usr/local/soft/fastdfs/storage

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

[group3]
group_name=group3
storage_server_port=23000
store_path_count=1
store_path0=/usr/local/soft/fastdfs/storage

#复制FastDFS的部分配置文件到/etc/fdfs目录
cp /usr/local/soft/package/fastdfs-6.06/conf/http.conf /etc/fdfs
cp /usr/local/soft/package/fastdfs-6.06/conf/mime.types /etc/fdfs

(3) 修改nginx配置

cd /usr/local/soft/nginx/conf
vim nginx.conf
#可参考以下配置
user nginx;
worker_processes  2;

error_log  /usr/local/soft/nginx/logs/error.log;
pid /usr/local/soft/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;

events
{
    use epoll;
    multi_accept on;
    worker_connections 65530;
}

http {

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


    log_format main
                'remote_addr:"$remote_addr"|'
                'remote_user:"$remote_user"|'
                'time_local:[$time_local]|'
                'request:[$request]|'
                'status:"$status"|'
                'body_bytes_sent:"$body_bytes_sent"|' 
                'http_referer:"$http_referer"|'
                'http_user_agent:"$http_user_agent"|'
                'request_time:"$request_time"|'
                'request_body:"$request_body"|'
                'http_host:"$http_host"|'
                'request_length:"$request_length"|'
                'upstream_status:"$upstream_status"|'
                'upstream_addr:"$upstream_addr"|'
                'upstream_response_time:"$upstream_response_time"'
                ;

    map $time_iso8601 $logdate {
      '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
      default    'date-not-found';
    }

    access_log  logs/access-$logdate.log  main;
    charset utf-8;
    server_tokens off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 40s;
    client_header_timeout 10;
    client_body_timeout 10;
    client_header_buffer_size 4k;
    large_client_header_buffers 4 32k;
    server_names_hash_bucket_size 128;
    client_max_body_size 100m;
    send_timeout 10;
    reset_timedout_connection on;

    open_file_cache max=102400 inactive=20s;
    open_file_cache_min_uses 1;
    open_file_cache_valid 30s;
    open_log_file_cache max=10;    

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 128k;      
    fastcgi_buffers 256 128k;
    fastcgi_busy_buffers_size 256k;    
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on; 

    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;

    proxy_buffering on;
    proxy_buffer_size 128k;        
    proxy_buffers 256 128k;
    proxy_busy_buffers_size 256k;    
    proxy_temp_file_write_size 256k; 

    gzip  on;
    gzip_min_length     256;
    gzip_buffers        4 16k;
    gzip_http_version   1.1;
    gzip_vary on;
    gzip_comp_level 5;
    gzip_disable "MSIE [1-6]\.";
    gzip_proxied any;
    gzip_types
        application/atom+xml
        application/javascript
        application/json
        application/ld+json
        application/manifest+json
        application/rss+xml
        application/vnd.geo+json
        application/vnd.ms-fontobject
        application/x-font-ttf
        application/x-web-app-manifest+json
        application/xhtml+xml
        application/xml
        font/opentype
        image/bmp
        image/svg+xml
        image/x-icon
        text/cache-manifest
        text/css
        text/plain
        text/vcard
        text/vnd.rim.location.xloc
        text/vtt
        text/x-component
        text/x-cross-domain-policy;


######################################
#fastdfs
    server {
        listen       8088;    ## 该端口为storage.conf中的http.server_port相同
        server_name  localhost;
        location ~/group[0-9]/ {
            ngx_fastdfs_module;
        }  
    access_log /usr/local/soft/nginx/logs/storge.log;
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
        } 

   }

}

(4) 启动nginx

#启动
/usr/local/soft/nginx/sbin/nginx
#停止
/usr/local/soft/nginx/sbin/nginx -s stop
#重载
/usr/local/soft/nginx/sbin/nginx -s reload

(5) 测试

#上传一张照片至服务器,如a.png

#使用FastDFS上传命令,将图片上传到FastDFS存储里
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/soft/package/a.png
##如能返回以下文件ID号,说明上传成功
group1/M00/00/00/wKhQB2B2nayAdY7zAAAUBwdbV-o889.png

#然后通过浏览器访问图片url
http://192.168.80.7:8088/group1/M00/00/00/wKhQB2B2nayAdY7zAAAUBwdbV-o889.png

3.7、安装Nginx负载均衡

此部分安装在各个跟踪节点上,即tracker节点上,主要为了提供http访问的反向代理、负载均衡以及缓存服务,如果跟踪节点与存储节点安装在一台服务器上,刚在3.6的基础上配置nginx即可。

以下为跟踪节点单独配置时的步骤:

(1) 安装依赖包

yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

(2) 安装nginx

#下载安装包
cd /usr/local/soft/package
wget http://nginx.org/download/nginx-1.18.0.tar.gz

#解压
tar -xf nginx-1.18.0.tar.gz

#新建nginx用户
useradd -r -s /sbin/nologin nginx

#编译nginx
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/soft/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream 

#安装nginx
make && make install

(3) 配置nginx

cd /usr/local/soft/nginx/conf
vim nginx.conf
#部分配置省略,以下为负载均衡配置,配置在http{}中
upstream fdfs_group1 {
    server 192.168.10.202:8888 weight=1 max_fails=2 fail_timeout=30s;
}
 
upstream fdfs_group2 {
    server 192.168.10.203:8888 weight=1 max_fails=2 fail_timeout=30s;
}
 
upstream fdfs_group3 {
    server 192.168.10.204:8888 weight=1 max_fails=2 fail_timeout=30s;
}

server{
    listen 8000;
    server_name localhost;
 
     access_log  /usr/local/soft/nginx/logs/lb_access.log main;
     error_log   /usr/local/soft/nginx/logs/storge.log/lb_error.log;
 
    location /group1/M00 {
       proxy_pass http://fdfs_group1;
     }
 
    location /group2/M00 {
       proxy_pass http://fdfs_group2;
     }
 
    location /group3/M00 {
       proxy_pass http://fdfs_group3;
     }

(4) 启动nginx

#启动
/usr/local/soft/nginx/sbin/nginx
#停止
/usr/local/soft/nginx/sbin/nginx -s stop
#重载
/usr/local/soft/nginx/sbin/nginx -s reload
posted @ 2021-05-31 11:26  hovin  阅读(495)  评论(0编辑  收藏  举报