fastdfs 一种开源分布式共享存储的生产使用实战

背景

文件存储是信息系统的基本资源,随着分布式应用的增多,共享存储的需求也日益加大,但是动则上NAS盘感觉成本有点偏高(NAS的使用参考前文),所以一方面降低现有存储的使用成本,另一方面为小而多的微服务探索分布式存储的方案,我们针对对市场上的主流分布式文件系统调研了一圈,将非核心业务系统进行了一次生产存储的改造。文章较长如果之前有接触过的可以直接跳至文末实战——生产上docker部署配置。

 

 

主流开源分布式系统对比

通过对比,FastDFS是为互联网应用量身定做的分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标。它是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。

FastDFS主要功能包括文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件(建议范围:4KB < file_size <500MB)为载体的在线服务,可以作为NAS等商用存储系统的一个很好补充。

 

Fastdfs架构

FastDFS 有三个角色:跟踪服务器(TrackerServer)、存储服务器(Storage Server)和客户端(Client)。

TrackerServer:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。

StorageServer:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。Storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。

Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用nginx等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷与卷之间是平行的关系,可以根据资源的时候情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。

 

FastDFS的上传过程

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

 

Storage Server会定期的向TrackerServer发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

 

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

客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。

虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。

数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。

文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

 

FastDFS的文件下载

客户端upload file成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracker从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。tracker根据请求的文件路径即文件ID 来快速定义文件。

 

通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。

 

FastDFS的文件同步

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

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

实战

网上大部分是纯物理部署,我们为了移植方便(毕竟是用在微服务场景,将来重复搭建的机会还很多)做成了docker镜像(如何制作docker镜像参考前文),然后通过docker-compose一键部署即可,且考虑到是轻存储,我们将tracker和storage部署在同一台服务器,共两路服务搭建集群。

  

Docker-compose部署配置如下(相关端口及敏感信息已替换):

version:'3'

services:

  tracker:

    image: fastdfs:latest

    network_mode: host

    ports:

      - "22128:22128"

    privileged: true

    container_name: tracker

    volumes:

      -/soft/fastdfs/tracker/config/tracker.conf:/etc/fdfs/tracker.conf

      -/soft/fastdfs/tracker/logs:/fastdfs/tracker

      - /etc/localtime:/etc/localtime:ro

    command: /bin/sh -c 'mkdir -p/fastdfs/tracker && /etc/init.d/fdfs_trackerd start && tail -f/dev/null'

 

  storage-group1:

    image: fastdfs:latest

    network_mode: host

    ports:

      - "23008:23008"

    privileged: true

    container_name: storage-group1

    volumes:

      -/soft/fastdfs/storage/config/storage.conf:/etc/fdfs/storage.conf

      -/soft/fastdfs/storage/logs:/fastdfs/storage

      - /data/fastdfs/data0:/fastdfs/g1/data0

      - /etc/localtime:/etc/localtime:ro

    command: /bin/sh -c 'mkdir -p/fastdfs/storage /fastdfs/g1/data0/ && /etc/init.d/fdfs_storaged start&& tail -f /dev/null'

    depends_on:

      - tracker

 

  nginx:

    image: fastdfs:latest

    network_mode: host

    ports:

      - "8899:8899"

    privileged: true

    container_name: nginx

    volumes:

      - /soft/fastdfs/nginx/config:/etc/fdfs

      -/soft/fastdfs/nginx/config/nginx.conf:/usr/local/nginx/conf/nginx.conf

      - /data/fastdfs/data0:/fastdfs/g1/data0

      - /etc/localtime:/etc/localtime:ro

    command: /bin/sh -c'/usr/local/nginx/sbin/nginx -g "daemon off;"'

    depends_on:

      - tracker

      - storage-group1

 

 

 

总结

分布式文件系统一般由服务的存储、访问的仲裁系统,文件存储系统,文件的容灾系统来构成,仲裁系统相当于文件服务器的大脑,根据一定的算法来决定文件存储的位置,文件存储系统负责保存文件,容灾系统负责文件系统和自己的相互备份。

扩展能力是一个分布式文件系统最重要的特点,在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;弹性存储可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值