FastDFS分布式文件存储

介绍

  1. 简介

    FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问, 以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB) 为载体的在线服务。

  2. FastDFS 系统有三个角色

    Tracker Server跟踪服务器
    主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会 连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。

    Storage Server存储服务器
    主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

    Client客户端
    上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
    在这里插入图片描述

  3. FastDFS的存储策略

    为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。

    存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的 文件容量。

    一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器 起到了冗余备份和负载均衡的作用。

    在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服 务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个 新的卷,这样就扩大了存储系统的容量。

  4. FastDFS的上传过程

    FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提 供给用户使用。

    Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server 不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。

    当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决 定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写 文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生 成文件名存储文件。
    在这里插入图片描述

  5. FastDFS的文件同步

    写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由 后台线程将文件同步至同group内其他的storage server。

    每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog 用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步; 进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。

    storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为 参考。

  6. FastDFS的文件下载

    客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
    在这里插入图片描述

  7. 结构介绍
    在这里插入图片描述

部署

环境准备

名称IP地址应用
tracker01192.168.66.41FastDFS、libfastcommon、nginx、keepalived
tracker02192.168.66.42FastDFS、libfastcommon、nginx、keepalived
storage01192.168.66.31FastDFS,libfastcommon,nginx,fastdfs-nginx-module
storage02192.168.66.32FastDFS,libfastcommon,nginx,fastdfs-nginx-module
VIP192.168.66.100

基础环境

  1. 安装常用工具

    yum -y install bash-completion  bash-completion-extras  vim  net-tools.x86_64  yum-utils lsof unzip zip
    
  2. 关闭selinux

    setenforce 0
    vim /etc/selinux/config
    SELINUX=disabled
    getenforce
    
  3. 优化文件打开数

    vim /etc/security/limits.conf
    *       soft    nofile  655360
    *       hard    nofile  655360
    *       soft    nproc  131072
    *       hard    nproc  131072
    *       soft    core    unlimited
    *       hard    core    unlimited
    root    soft    nofile  655360
    root    hard    nofile  655360
    root    soft    core    unlimited
    

    优化系统参数

    vi /etc/sysctl.conf
    # see details in https://help.aliyun.com/knowledge_detail/39428.html
    # see details in https://help.aliyun.com/knowledge_detail/41334.html
    #仅在内存不足的情况下--当剩余空闲内存低于vm.min_free_kbytes limit时,使用交换空间。
    vm.swappiness = 0
    
    #单个进程可分配的最大文件数
    fs.nr_open=2097152
    
    #系统最大文件句柄数
    #计算grep -r MemTotal /proc/meminfo | awk  '{printf("%d",$2/10)}'
    fs.file-max=1048576
    
    #backlog 设置
    net.core.somaxconn=32768
    net.ipv4.tcp_max_syn_backlog=16384
    net.core.netdev_max_backlog=16384
    
    #TCP Socket 读写 Buffer 设置
    net.core.rmem_default=262144
    net.core.wmem_default=262144
    net.core.rmem_max=16777216
    net.core.wmem_max=16777216
    net.core.optmem_max=16777216
    net.ipv4.neigh.default.gc_stale_time=120
    
    #TIME-WAIT Socket 最大数量、回收与重用设置
    net.ipv4.tcp_max_tw_buckets=1048576
    net.ipv4.tcp_tw_reuse=1
    
    # FIN-WAIT-2 Socket 超时设置
    #net.ipv4.tcp_fin_timeout=30
    
    #解决大量state=TIME_WAIT问题
    net.ipv4.tcp_tw_recycle=0
    net.ipv4.tcp_timestamps=0
    net.ipv4.conf.all.accept_redirects=0
    #net.ipv4.ip_local_port_range = 1024 65000 
    
    #TCP 连接追踪设置
    net.nf_conntrack_max=1000000
    net.netfilter.nf_conntrack_max=1000000
    net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
    
    #开启动网络转发功能
    net.ipv4.ip_forward = 1 
    
    #支持网桥过滤器
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    
    sysctl -p
    
  4. 指定时间

    yum -y install chrony
    systemctl restart chronyd
    date
    
  5. 安装依赖包

    yum -y install gcc gcc-c++ perl openssl openssl-devel pcre pcre-devel zlib zlib-devel libevent 		
    libevent-devel
    
  6. 安装libfastcommon

    tar -zxvf libfastcommon-1.0.42.tar.gz -C /data/
    mv /data/libfastcommon-1.0.42/ /data/libfastcommon
    cd /data/libfastcommon
    ./make.sh && ./make.sh install
    
  7. 安装FastDFS

    tar -zxvf fastdfs-6.04.tar.gz -C /data/
    mv /data/fastdfs-6.04/ /data/fastdfs
    cd /data/fastdfs
    ./make.sh && ./make.sh install
    cd /data/fastdfs/conf
    cp -p http.conf mime.types /etc/fdfs/
    cp -p  mime.types /etc/fdfs/
    

安装环境

tracker端

tracker安装

  1. 修改配置文件

    cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
    vim /etc/fdfs/tracker.conf
    #false表示有效启用配置文件
    disabled=false
    
    #设置超时时间
    connect_timeout = 10
    
    #设置tracker的端口号
    port=22122
    
    bind_addr=
    
    #tracker服务工作目录和日志目录
    base_path=/data/fastdfs/tracker-work
    
    #0:轮询的上传,交替上传数据
    #1: 指定group进行上传
    #2:平衡的去上传,尽量平衡各个节点的容量,默认就是2
    store_lookup=2
    #当store_lookup设置成1的时候,这个参数才有效
    store_group=group2 
    
    #设置http端口号
    http.server_port=8080
    mkdir -p /data/fastdfs/tracker-work
    
  2. 配置启动

    在运行tracker之前,先把防火墙对应的端口打开

    firewall-cmd --zone=public --add-port=22122/tcp --permanent
    firewall-cmd --reload
    systemctl enable fdfs_trackerd.service
    systemctl start fdfs_trackerd.service
    systemctl status fdfs_trackerd.service
    netstat -unltp | grep fdfs
    

trackerd节点安装nginx

  1. 安装nginx

    useradd -s /sbin/nologin nginx
    tar -xvf nginx-1.16.1.tar.gz  -C /data/
    mv /data/nginx-1.16.1/ /data/nginx-install
    cd /data/nginx-install
    ./configure --prefix=/data/nginx --user=nginx --group=nginx 
    --with-http_ssl_module --with-stream
    make && make install
    
  2. 修改配置文件

    vim /data/nginx/conf/nginx.conf
        upstream fdfs_group_server {
            server 192.168.66.31:8888 weight=1 max_fails=2 fail_timeout=30s;
            server 192.168.66.32:8888 weight=1 max_fails=2 fail_timeout=30s;
            server 192.168.66.32:8888 weight=1 max_fails=2 fail_timeout=30s;
            server 192.168.66.32:8888 weight=1 max_fails=2 fail_timeout=30s;
        }
        server {
            listen       8000;
            server_name  localhost;
            #设置的负载均衡参数
            location ~/group[0-9]/M0[0-9] {
                proxy_pass http://fdfs_group_server;
            }
    
  3. 启动

    vim /usr/lib/systemd/system/nginx.service
    [Unit]
    Description=nginx
    After=network.target
      
    [Service]
    Type=forking
    ExecStart=/data/nginx/sbin/nginx
    ExecReload=/data/nginx/sbin/nginx -s reload
    ExecStop=/data/nginx/sbin/nginx -s quit
    PrivateTmp=true
      
    [Install]
    WantedBy=multi-user.target
    
    
    systemctl daemon-reload
    systemctl start nginx.service
    systemctl enable nginx.service
    systemctl status nginx.service
    

trackerd节点安装keepalived

  1. 安装keepalived

    yum install -y keepalived
    
  2. 修改配置文件

    vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       router_id LVS_OPENSTACK
       vrrp_iptables
    }
    
    vrrp_instance VI_1 {
        state MASTER(BACKUP)
        interface ens32
        virtual_router_id 51
        priority 100(备50)
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            VIP/24
        }
    }
    
  3. 启动

    systemctl restart keepalived
    

    启动时会自动添加一个drop的防火墙规则,需要清空

    iptables -F
    systemctl status keepalived
    systemctl enable keepalived
    

    查看vip

    ip add | grep 66.100
    

storage端(存储的机器)
storage安装

  1. 修改配置文件

    cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
    vim /etc/fdfs/storage.conf
    #启用配置文件
    disabled=false
    
    #第一(卷)组为group1
    group_name=group1
    
    bind_addr =
    
    #设置storage的端口号
    port=23000
    
    #服务工作目录和日志目录
    base_path=/data/fastdfs/storage-work
    
    #存储路径个数,需要和store_path个数匹配
    store_path_count=1
    #存储路径,如果不存在的话他就会使用base_path,生产建议分开
    store_path0=/data/fastdfs/storage-data
    
    #tracker1服务器的IP地址和端口号
    tracker_server=192.168.66.41:22122
    #tracker2服务器的IP地址和端口号
    tracker_server=192.168.66.42:22122
    
    http.server_port=8888
    mkdir -p /data/fastdfs/storage-work
    mkdir -p /data/fastdfs/storage-data
    
  2. 配置启动

    #在运行tracker之前,先把防火墙对应的端口打开
    firewall-cmd --zone=public --add-port=22122/tcp --permanent
    firewall-cmd --reload
    
    vim /etc/rc.d/init.d/fdfs_storaged
    PRG=/usr/bin/fdfs_storaged
    CONF=/etc/fdfs/storage.conf
    
    service fdfs_storaged start
    service fdfs_storaged stop
    
    systemctl start fdfs_storaged.service
    systemctl status fdfs_storaged.service
    systemctl enable fdfs_storaged.service 
    netstat -unltp | grep fdfs
    
  3. 查看集群状态

    fdfs_monitor /etc/fdfs/storage.conf list
    

storage节点安装nginx、fastdfs-nginx-module

  1. 解压模块

    tar -xvf fastdfs-nginx-module-1.22.tar.gz -C /usr/local/src
    vim /usr/local/src/fastdfs-nginx-module-1.22/src/config
    ngx_module_incs="/usr/include"
    CORE_INCS="$CORE_INCS /usr/include"
    
  2. 安装nginx

    useradd -s /sbin/nologin nginx
    tar -xvf nginx-1.16.1.tar.gz  -C /data/
    mv /data/nginx-1.16.1/ /data/nginx-install
    cd /data/nginx-install
    ./configure --prefix=/data/nginx --user=nginx --group=nginx 
    --with-http_ssl_module --with-stream
    --add-module=/usr/local/src/fastdfs-nginx-module-1.22/src
    make && make install
    
  3. 修改配置文件

    cp /usr/local/src/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
    
    vim /etc/fdfs/mod_fastdfs.conf
    connect_timeout=10
    #storage日志目录和storage.conf一样
    base_path=/data/fastdfs/mod-work
    
    # tracker1服务器IP和端口
    tracker_server=192.168.66.41:22122
    # tracker2服务器IP和端口
    tracker_server=192.168.66.42:22122
    
    #组名,根据实际情况修改
    group_name=group1
    #从文件扩展名查找文件类型
    url_have_group_name = true
    #url里面包含group_name
    
    store_path_count=1
    #storage存储路径storage.conf一样
    store_path0=/data/fastdfs/storage-data
    
    #如果fastdfs为多group安装,还需设置以下配置:
    #group个数
    group_count = 2
    #在末尾添加如下:
    [group1]
    group_name=group1
    storage_server_port=23000
    store_path_count=1
    store_path0=/data/fastdfs/storage-data
    [group2]
    group_name=group2
    storage_server_port=23000
    store_path_count=1
    store_path0=/data/fastdfs/storage-data
    
    mkdir -p /data/fastdfs/mod-work
    vim /data/nginx/conf/nginx.conf
        server {
            listen       8888;
            server_name  localhost;
            location ~/group[0-9]/M0[0-9] {
                ngx_fastdfs_module;
            }
    
  4. 启动

    vim /usr/lib/systemd/system/nginx.service
    [Unit]
    Description=nginx
    After=network.target
      
    [Service]
    Type=forking
    ExecStart=/data/nginx/sbin/nginx
    ExecReload=/data/nginx/sbin/nginx -s reload
    ExecStop=/data/nginx/sbin/nginx -s quit
    PrivateTmp=true
      
    [Install]
    WantedBy=multi-user.target
    
    
    systemctl daemon-reload
    systemctl start nginx.service
    systemctl enable nginx.service
    systemctl status nginx.service
    

Client配置(于tracker端一起)

  1. 修改配置文件

    cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
    
    vim /etc/fdfs/client.conf
    base_path=/data/fastdfs/client-work
    # tracker服务器IP和端口
    tracker_server=192.168.66.41:22122
    # tracker服务器IP和端口
    tracker_server=192.168.66.42:22122
    # tracker服务器的http端口号,必须和tracker的设置对应起来
    http.tracker_server_port = 8000
    
    
    mkdir -p /data/fastdfs/client-work
    
  2. 测试

fdfs_test /etc/fdfs/client.conf upload ngx_cache_purge-2.3.tar.gz

fdfs_upload_file /etc/fdfs/client.conf cxk
#返回ID表示成功 如:group1/M00/00/00/xx.tar.gz

喜欢的亲可以关注点赞评论哦!以后每天都会更新的哦!本文为小编原创文章; 文章中用到的文件、安装包等可以加小编联系方式获得;
欢迎来交流小编联系方式VX:CXKLittleBrother 进入运维交流群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

含义小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值