FastDFS-分布式存储集群部署

家住魔仙堡 提交于 2019-12-03 23:07:15

什么是FastDFS?

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

FastDFS架构

 

FastDFS的工作流程

上传文件

 

上传的流程:
client询问tracker上传到的storage
tracker返回一台可用的storage
client直接和storage通信,完成文件上传
选择tracker server
集群中tracker之间是对等关系,client在上传文件时可以使用任意一个tracker
选择存储group
当tracker接收到上传文件的请求的时候,会为该文件分配一个可以存储的group。目前支持选择的group的规则有:
Round robin,轮询
Sepcified group,上传的时候指定某个group
Load balance,生成存储空间较多的group优先
选择storage server
当选定group后,tracker会在group内选择一个storage server给client,目前支持选择server的规则有:
Round robin,轮询(默认)
根据IP地址进行排序,选择第一个服务器(IP地址最小者)
根据优先级进行排序,上传优先级由storage server来设置,参数为uoload_priority
选择storage path
当分配好storage server后,客户端将向storage发送写文件请求,storage会将文件分配一个数据存储目录,目前支持选择存储路径选择的规则有:
Round robin,轮询(默认)
load balance,选择使用剩余空间最大的存储路径
生成file id
选择存储目录之后,storage会生成一个file_id,采用base64编码,包含有:storage server ip,文件创建时间,文件大小,文件CRC32校验码和随机数。每个存储目录下有两个256*256个子目录,storage会按文件file_id进行两次hash,路由到其中一个子目录,然后将文件以file_id为名字存储。
文件路径如下:
group0/M00/00/02/exwf8b8lFJIxx2234841AAAbpQt7xVI473456.txt
组名:group0 磁盘: M00 目录:00/02 文件名:exwf8b8lFJIxx2234841AAAbpQt7xVI473456.txt
文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
组名:文件上传后所在的存储组名称,在文件上传成功后有存储服务器返回,需要客户端自行保存。
虚拟磁盘路径:存储服务器配置的虚拟路径,与磁盘选项store_path*对应。
数据两级目录:存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

文件下载

 

文件下载流程:
client询问tracker要下载文件的所在的storage,参数为文件标识(group,文件名)
tracker返回一台可用的storage
client直接和storage通信,下载文件
client发送下载某个文件的请求到某个tracker,tracker从文件名中解析出文件的group,文件大小,创建时间等信息,然后为该请求选择一个storage用于读请求
选择下载服务器
目前支持的规则有:
轮询方式,可以下载当前文件的任意一个storage server
从源storage server下载
同步时间管理
当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢?
其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。
快速定位文件
知道FastDFS FID的组成后,我们来看看FastDFS是如何通过这个精巧的FID定位到需要访问的文件。
通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;
存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。

我们来部署FastDFS;

准备四台主机,做好域名解析;

首先安装lib库文件(四台都需要安装)、fastdfs软件;

[root@vlnx251101 ~]# git clone https://github.com/happyfish100/libfastcommon.git
[root@vlnx251101 ~]# cd libfastcommon/
[root@vlnx251101 libfastcommon]# ./make.sh 
[root@vlnx251101 libfastcommon]# ./make.sh install

修改fastdfs配置文件;

[root@sxb-1 fastdfs]# vim make.sh
51 TARGET_PREFIX=/usr/local/fdfs
52 TARGET_CONF_PATH=/usr/local/fdfs/conf

if [ "$1" = "install" ]; then
  cd ..
  cp -f restart.sh $TARGET_PREFIX/bin
  cp -f stop.sh $TARGET_PREFIX/bin

  if [ "$uname" = "Linux" ]; then
    if [ "$WITH_LINUX_SERVICE" = "1" ]; then
      if [ ! -d $TARGET_CONF_PATH ]; then
        mkdir -p $TARGET_CONF_PATH
        cp -f conf/tracker.conf $TARGET_CONF_PATH/tracker.conf.sample
        cp -f conf/storage.conf $TARGET_CONF_PATH/storage.conf.sample
        cp -f conf/client.conf $TARGET_CONF_PATH/client.conf.sample
        cp -f conf/storage_ids.conf $TARGET_CONF_PATH/storage_ids.conf.sample
      fi
      mkdir -p $TARGET_INIT_PATH
      cp -f init.d/fdfs_trackerd $TARGET_INIT_PATH
      cp -f init.d/fdfs_storaged $TARGET_INIT_PATH
      /sbin/chkconfig --add fdfs_trackerd 
      /sbin/chkconfig --add fdfs_storaged
    fi
  fi
fi

编译安装fastdfs;

[root@vlnx251101 fastdfs]# ./make.sh
 [root@vlnx251101 fastdfs]# ./make.sh install

修改配置文件;

[root@sxb-1 cong]# pwd
/usr/local/fdfs/cong
[root@sxb-1 cong]# cp tracker.conf.sample tracker.conf^C
[root@sxb-1 cong]# vim tracker.conf^C
21 # the base path to store data and log files
22 base_path=/opt/fdfs/tracker

创建目录;启动服务;

[root@vlnx251101 fastdfs]# mkdir -p /opt/fdfs/tracker

[root@sxb-1 fdfs]# /usr/local/fdfs/bin/fdfs_trackerd /usr/local/fdfs/conf/tracker.conf restart
[root@sxb-1 fdfs]# ss -tunpl | grep fdfs
tcp    LISTEN     0      128       *:22122                 *:*                   users:(("fdfs_trackerd",pid=39497,fd=5))

将pei会完成的fastdfs拷贝给另外三台虚拟机;

[root@sxb-1 fdfs]# scp -r /usr/local/fdfs/ 192.168.88.103:/usr/local/^C
[root@sxb-1 fdfs]# scp -r /usr/local/fdfs/ 192.168.88.104:/usr/local/^C
[root@sxb-1 fdfs]# scp -r /usr/local/fdfs/ 192.168.88.105:/usr/local/^C
[root@sxb-3 libfastcommon]# mkdir -p /opt/fdfs/tracker
[root@sxb-3 libfastcommon]# /usr/local/fdfs/bin/fdfs_trackerd /usr/local/fdfs/conf/tracker.conf restart

在104、105上生成storage文件;

[root@vlnx251103 ~]# cp /usr/local/fdfs/conf/storage.conf.sample /usr/local/fdfs/conf/storage.conf


 8 # comment or remove this item for fetching from tracker server,
  9 # in this case, use_storage_id must set to true in tracker.conf,
 10 # and storage_ids.conf must be configed correctly.
 11 group_name=group1

 40 # the base path to store data and log files
 41 base_path=/opt/fdfs/storage

104 # path(disk or mount point) count, default value is 1
105 store_path_count=1

107 # store_path#, based 0, if store_path0 not exists, it's value is base_path
108 # the paths must be exist
109 store_path0=/opt/fdfs/storage

116 # tracker_server can ocur more than once, and tracker_server format is
117 #  "host:port", host can be hostname or ip address
118 tracker_server=192.168.251.101:22122
119 tracker_server=192.168.251.102:22122

将104拷贝105;启动查看端口;

[root@vlnx251103 ~]# scp -r /usr/local/fdfs/ 192.168.251.104:/usr/local/
[root@vlnx251103 ~]# mkdir -p /opt/fdfs/storage
[root@vlnx251103 ~]# /usr/local/fdfs/bin/fdfs_storaged /usr/local/fdfs/conf/storage.conf restart
[root@vlnx251103 ~]# netstat -tunpl | grep fdfs
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      15837/fdfs_storaged 

查看状态;

 /usr/local/fdfs/bin/fdfs_monitor /usr/local/fdfs/conf/storage.conf

配置client文件;

[root@vlnx251101 ~]# cp /usr/local/fdfs/conf/client.conf.sample /usr/local/fdfs/conf/client.conf

[root@vlnx251101 ~]# vim /usr/local/fdfs/conf/client.conf
  9 # the base path to store log files
 10 base_path=/opt/fdfs/client
 11
 12 # tracker_server can ocur more than once, and tracker_server format is
 13 #  "host:port", host can be hostname or ip address
 14 tracker_server=192.168.251.101:22122
 15 tracker_server=192.168.251.102:22122

[root@vlnx251101 ~]# mkdir /opt/fdfs/client

测试;存储/etc/passwd

[root@sxb-5 conf]# /usr/local/fdfs/bin/fdfs_upload_file /usr/local/fdfs/conf/client.conf /etc/passwd
group2/M00/00/00/wKhYaV1JS0aAI1J1AAAFCtDYgrU1354964    file_id

查看服务器存储位置;

[root@sxb-5 conf]# ls /opt/fdfs/storage/data/
00  12  24  36  48  5A  6C  7E  90  A2  B4  C6  D8  EA  FC
01  13  25  37  49  5B  6D  7F  91  A3  B5  C7  D9  EB  FD
02  14  26  38  4A  5C  6E  80  92  A4  B6  C8  DA  EC  fdfs_storaged.pid
03  15  27  39  4B  5D  6F  81  93  A5  B7  C9  DB  ED  FE
04  16  28  3A  4C  5E  70  82  94  A6  B8  CA  DC  EE  FF
05  17  29  3B  4D  5F  71  83  95  A7  B9  CB  DD  EF  storage_stat.dat
06  18  2A  3C  4E  60  72  84  96  A8  BA  CC  DE  F0  sync
07  19  2B  3D  4F  61  73  85  97  A9  BB  CD  DF  F1
08  1A  2C  3E  50  62  74  86  98  AA  BC  CE  E0  F2
09  1B  2D  3F  51  63  75  87  99  AB  BD  CF  E1  F3
0A  1C  2E  40  52  64  76  88  9A  AC  BE  D0  E2  F4
0B  1D  2F  41  53  65  77  89  9B  AD  BF  D1  E3  F5
0C  1E  30  42  54  66  78  8A  9C  AE  C0  D2  E4  F6
0D  1F  31  43  55  67  79  8B  9D  AF  C1  D3  E5  F7
0E  20  32  44  56  68  7A  8C  9E  B0  C2  D4  E6  F8
0F  21  33  45  57  69  7B  8D  9F  B1  C3  D5  E7  F9
10  22  34  46  58  6A  7C  8E  A0  B2  C4  D6  E8  FA
11  23  35  47  59  6B  7D  8F  A1  B3  C5  D7  E9  FB
[root@sxb-5 conf]# ls /opt/fdfs/storage/data/00/00/
wKhYaV1JS0aAI1J1AAAFCtDYgrU1354964    我们刚才存储的passwd文件;

删除

 

下载:
/usr/local/bin/fdfs_download_file <config_file> <file_id> [local_filename]
例如下载上面上传的文件:
/usr/local/bin/fdfs_download_file /etc/fdfs/client.conf group3/M00/00/00/wKgAUE5yiVK0VEpSACiWWseqpak_big.tar.gz    /cairo.tar.gz
其中:config_file:只客户端下载配置文件
      File_id:指文件的路径
      local_filename:指下载到本地后修改的文件名。

 

下载

下载:
/usr/local/bin/fdfs_download_file <config_file> <file_id> [local_filename]
例如下载上面上传的文件:
/usr/local/bin/fdfs_download_file /etc/fdfs/client.conf group3/M00/00/00/wKgAUE5yiVK0VEpSACiWWseqpak_big.tar.gz    /cairo.tar.gz
其中:config_file:只客户端下载配置文件
      File_id:指文件的路径
      local_filename:指下载到本地后修改的文件名。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!