什么是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:指下载到本地后修改的文件名。