赞
踩
FastDFS是为互联网应用量身定做的分布式文件系统
,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用,高性能等指标。
FastDFS一步步搭建存储服务器
FastDFS 是一个开源的高性能分布式文件系统(DFS)
。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
Tracker Server:跟踪服务器。主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
Storage Server:存储服务器。主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
Client:客户端。上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
"跟踪器和存储节点"都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
Tracker
:标准服务端口22122、HTTP端口8080 Storage
:标准服务端口23000、HTTP端口8888FastDFS向使用者提供基本文件访问接口,比如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,最后根据以上的信息生成文件名存储文件。文件名的格式如下:
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracker在选择读storage的时候会以同步进度作为参考。
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracker从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
基本环境及机器清单如下:
Client 192.168.1.1
Tracker1 192.168.1.111
tracker2 192.168.1.222
Storage1 192.168.1.10
storage2 192.168.1.20
storage3 192.168.1.30
Storage4 192.168.1.40
firewall-cmd --zone=public --add-port=22122/tcp --permanent
firewall-cmd --zone=public --add-port=23000/tcp --permanent
firewall-cmd --reload
[root@client ~]# scp fastdfs.tar.gz root@192.168.1.111:/root ··· [root@client ~]# yum -y install gcc* automake autoconf zlib zlib-devel openssl openssl-devel pcre pcre-devel [root@client ~]# tar -zxf fastdfs.tar.gz -C /usr/local/src/ [root@client ~]# cd /usr/local/src/libfastcommon/ [root@client libfastcommon]# ./make.sh && ./make.sh install && cd .. [root@client src]# cd fastdfs [root@client fastdfs]# ./make.sh && ./make.sh install && cd .. [root@client src]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf [root@client src]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf [root@client src]# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf [root@client src]# cp fastdfs/conf/http.conf /etc/fdfs/ [root@client src]# cp fastdfs/conf/mime.types /etc/fdfs/ [root@client src]# cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ [root@client src]# mkdir -p /home/yuqing/fastdfs [root@client src]# cd 直接全部复制 yum -y install gcc* automake autoconf zlib zlib-devel openssl openssl-devel pcre pcre-devel tar -zxf fastdfs.tar.gz -C /usr/local/src/ cd /usr/local/src/libfastcommon/ ./make.sh && ./make.sh install && cd .. cd fastdfs ./make.sh && ./make.sh install && cd .. cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf cp fastdfs/conf/http.conf /etc/fdfs/ cp fastdfs/conf/mime.types /etc/fdfs/ cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ mkdir -p /home/yuqing/fastdfs cd
Client+存储服务器
tar -zxf nginx-1.12.0.tar.gz -C /usr/src/
cd /usr/src/nginx-1.12.0/
./configure --add-module=/usr/local/src/fastdfs-nginx-module/src && make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx -v
cd
[root@client ~]# vim /etc/fdfs/client.conf 10 base_path=/home/yuqing/fastdfs 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.2.20:22122 tracker服务器地址 15 tracker_server=192.168.2.30:22122 [root@client ~]# vim /etc/fdfs/mod_fastdfs.conf 10 base_path=/home/yuqing/fastdfs 40 tracker_server=192.168.2.20:22122 41 tracker_server=192.168.2.30:22122 [root@client ~]# vim /usr/local/nginx/conf/nginx.conf upstream fdfs_group1 { server 192.168.1.111:8888 max_fails=3 fail_timeout=20s; server 192.168.1.222:8888 max_fails=3 fail_timeout=20s; } upstream fdfs_group2 { server 192.168.1.111:8888 max_fails=3 fail_timeout=20s; server 192.168.1.222:8888 max_fails=3 fail_timeout=20s; } server { listen 80; server_name localhost; location ~/group1/ { proxy_pass http://fdfs_group1; } location ~/group2/ { proxy_pass http://fdfs_group2; } [root@client ~]# nginx -t
[root@tracker1 ~]# vim /etc/fdfs/tracker.conf
4 disabled=false
8 bind_addr=192.168.1.111
11 port=22122
22 base_path=/home/yuqing/fastdfs
[root@tracker2 ~]# vim /etc/fdfs/tracker.conf
8 bind_addr=192.168.1.222
11 port=22122
22 base_path=/home/yuqing/fastdfs
[root@storage1 ~]# vim /etc/fdfs/storage.conf 4 disabled=false 配置文件是否不生效,false为生效 11 group_name=group1 15 bind_addr=192.168.1.10 41 base_path=/home/yuqing/fastdfs Storage数据和日志目录地址(根目录必须存在,子目录会自动生成) 110 store_path0=/home/yuqing/fastdfs 119 tracker_server=192.168.1.111:22122 tracker服务器的地址 120 tracker_server=192.168.1.222:22122 285 http.server_port=8888 scp /etc/fdfs/storage.conf root@192.168.1.20:/etc/fdfs/ scp /etc/fdfs/storage.conf root@192.168.1.30:/etc/fdfs/ scp /etc/fdfs/storage.conf root@192.168.1.40:/etc/fdfs/ [root@storage1 ~]# vim /etc/fdfs/mod_fastdfs.conf 10 base_path=/home/yuqing/fastdfs 40 tracker_server=192.168.1.111:22122 41 tracker_server=192.168.1.222:22122 48 group_name=group1 53 url_have_group_name = true 57 store_path_count=1 63 store_path0=/home/yuqing/fastdfs 113 group_count = 2 118 [group1] 119 group_name=group1 120 storage_server_port=23000 121 store_path_count=1 122 store_path0=/home/yuqing/fastdfs 128 [group2] 129 group_name=group2 130 storage_server_port=23000 131 store_path_count=1 132 store_path0=/home/yuqing/fastdfs scp /etc/fdfs/mod_fastdfs.conf root@192.168.1.20:/etc/fdfs/ scp /etc/fdfs/mod_fastdfs.conf root@192.168.1.30:/etc/fdfs/ scp /etc/fdfs/mod_fastdfs.conf root@192.168.1.40:/etc/fdfs/ [root@storage1 ~]# vim /usr/local/nginx/conf/nginx.conf 35 server { 36 listen 8888; 37 server_name localhost; 38 location ~/group[0-9]/M00/ { 39 ngx_fastdfs_module; 40 }
fastdfs-nginx-module 模块说明
《FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进行文件复制,有同步延迟的问题》
假设 Tracker 服务器将文件上传到了 192.168.1.1,上传成功后文件ID已经返回给客户端。
此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.1.30,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.1.1 上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟
导致的文件无法访问错误。
注意:
listen 80 端口值是要与 /etc/fdfs/storage.conf 中的 http.server_port=8888相对应。同时在防火墙中打开该端口。
location 的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。
scp /usr/local/nginx/conf/nginx.conf root@192.168.1.20:/usr/local/nginx/conf/nginx.conf
scp /usr/local/nginx/conf/nginx.conf root@192.168.1.30:/usr/local/nginx/conf/nginx.conf
scp /usr/local/nginx/conf/nginx.conf root@192.168.1.40:/usr/local/nginx/conf/nginx.conf
[root@storage2 ~]# vim /etc/fdfs/storage.conf
15 bind_addr=192.168.1.20
[root@storage3 ~]# vim /etc/fdfs/storage.conf
11 group_name=group2
15 bind_addr=192.168.1.30
[root@storage3 ~]# vim /etc/fdfs/mod_fastdfs.conf
47 group_name=group2
[root@storage4 ~]# vim /etc/fdfs/storage.conf
11 group_name=group2
15 bind_addr=192.168.1.40
[root@storage4 ~]# vim /etc/fdfs/mod_fastdfs.conf
47 group_name=group2
>C
[root@client ~]# nginx
>T
/etc/init.d/fdfs_trackerd start {必须是绝对路径}
>S
nginx
/etc/init.d/fdfs_storaged start
[root@storage1 ~]# netstat -anpt | grep fdfs
tcp 0 0 192.168.1.10:23000 0.0.0.0:* LISTEN 64480/fdfs_storaged
tcp 0 0 192.168.1.10:23000 192.168.1.20:36632 ESTABLISHED 64480/fdfs_storaged
tcp 0 0 192.168.1.10:48769 192.168.1.222:22122 ESTABLISHED 64480/fdfs_storaged
tcp 0 0 192.168.1.10:35038 192.168.1.111:22122 ESTABLISHED 64480/fdfs_storaged
tcp 0 0 192.168.1.10:43588 192.168.1.20:23000 ESTABLISHED 64480/fdfs_storaged
[root@storage1 ~]# fdfs_monitor /etc/fdfs/storage.conf {检查<追踪服务器>与<存储服务器>是否在通信}
··· Storage 1:
id = 192.168.1.10
ip_addr = 192.168.1.10 (storage1) ACTIVE
上传图片
[root@client ~]# fdfs_upload_file /etc/fdfs/client.conf /root/1.jpg
group2/M00/00/00/wKgBHmECasyAKuCYAAu80XCb-vQ591.jpg "这里表示图片存储在哪里"
Storage1-->group1
[root@storage3 ~]# cd /home/yuqing/fastdfs/data/00/00/
[root@storage3 00]# ls
wKgBHmECasyAKuCYAAu80XCb-vQ591.jpg
下载到在当前目录
[root@client ~]# fdfs_download_file /etc/fdfs/client.conf group2/M00/00/00/wKgBHmECasyAKuCYAAu80XCb-vQ591.jpg
#指定目录
[root@client ~]# fdfs_download_file /etc/fdfs/client.conf group2/M00/00/00/wKgBHmECasyAKuCYAAu80XCb-vQ591.jpg /root/2.png
[root@client ~]# ls
1.jpg anaconda-ks.cfg initial-setup-ks.cfg wKgBHmECasyAKuCYAAu80XCb-vQ591.jpg 模板 图片 下载 桌面
2.png fastdfs.tar.gz nginx-1.12.0.tar.gz 公共 视频 文档 音乐
查看
[root@localhost ~]# firefox http://192.168.1.1/group2/M00/00/00/wKgBHmECasyAKuCYAAu80XCb-vQ591.jpg
删除
[root@client ~]# fdfs_delete_file /etc/fdfs/client.conf group2/M00/00/00/wKgBHmECasyAKuCYAAu80XCb-vQ591.jpg
天生傲骨怎能服输,蜕变才能让自己强大,涅槃才能让自己重生,逆风才能让自己翻盘。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。