查阅问题基本上就是从nginx开始一路查日志查下去
1. 查看tracker下的nginx 日志
2. 修改nginx.conf
3. 在nginx/sbin 下执行./nginx -s quit && ./nginx
4. 再次请求发现tracker日志不报错,那么接下来便是去storage中查看日志
5. 发现和tracker报一样错 重复以上步骤 修改配置
6. 重启nginx
7. 再次访问 404 继续查看日志
此时卡在这,以为是nginx出了问题,一直转发不过去,实际上是因为storage的nginx中还有fastdfs-nginx-module这个模块
8.修改/etc/fdfs/mod_fastdfs.conf
9.重启storage、nginx
10.搞定
整个安装过程主要按照这两篇文档来搭建
https://www.cnblogs.com/mafly/p/fastdfs_nginx.html
http://www.ityouknow.com/fastdfs/2017/10/10/cluster-building-fastdfs.html
不过按照它来搭,在nginx编译时就会报错
github上有issue 是版本引起的问题,所以建议fastdfs 和 fastdfs-nginx 都拿取最新版本
git clone https://github.com/happyfish100/fastdfs-nginx-module
./configure --add-module=/path/to/fastdfs-nginx-module-master/src
make && make install
git clone https://github.com/happyfish100/libfastcommon.git
mv libfastcommon /usr/local/
cd /usr/local/libfastcommon
./make.sh && ./make.sh install
1. 下载安装好libfastcommon、fastdfs后
git clone https://github.com/happyfish100/libfastcommon.git
./make.sh && ./make.sh install
git clone https://github.com/happyfish100/fastdfs
./make.sh && ./make.sh install
2. vim storage.conf
加入 chkconfig fdfs_storaged on,开机自启storage(好像没什么用)
3. 启动storage,需要等待一下,才会全部active
fdfs_storaged /etc/fdfs/storage.conf start
4. 下载 fastdfs-nginx-module 源代码&&下载nginx
git clone https://github.com/happyfish100/fastdfs-nginx-module
wget -c https://nginx.org/download/nginx-1.10.1.tar.gz
tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1
./configure --add-module=/path/to/fastdfs-nginx-module/src
make && make install
将nginx设置为开机启动:
vim /etc/rc.d/rc.local
将运行命令行添加进文件:/usr/local/nginx/sbin/nginx
copy配置文件到fastdfs
cp mod_fastdfs.conf /etc/fdfs/
cp anti-steal.jpg http.conf mime.types /etc/fdfs/
改写配置文件
vim /etc/fdfs/mod_fastdfs.conf
一般只需改动以下几个参数即可:
base_path=/fastdfs/storage #保存日志目录
tracker_server=192.168.75.145:22122
storage_server_port=23000 #storage服务器的端口号
group_name=group2 #当前服务器的group名
url_have_group_name = true #文件url中是否有group名
store_path_count=1 #存储路径个数,需要和store_path个数匹配
store_path0=/fastdfs/storage #存储路径
group_count = 0 #设置组的个数,我用的默认
只需要填group1而且仅需填写扩容这个group,否则访问不到
接下来重启即可。
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
3. 如果centos是mini版本,请用以下命令安装工具
yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
Storage Server
Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。
以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;
缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。
Tracker server
Tracker是FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。
Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。
没有单点故障问题
Client
FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
文件同步
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
小文件合并存储
将小文件合并存储主要解决如下几个问题:
1. 本地文件系统inode数量有限,从而存储的小文件数量也就受到限制。 2. 多级目录+目录里很多文件,导致访问文件的开销很大(可能导致很多次IO) 3. 按小文件存储,备份与恢复的效率低
FastDFS在V3.0版本里引入小文件合并存储的机制,可将多个小文件存储到一个大的文件(trunk file),为了支持这个机制,FastDFS生成的文件fileid需要额外增加16个字节
1. trunk file id 2. 文件在trunk file内部的offset 3. 文件占用的存储空间大小 (字节对齐及删除空间复用,文件占用存储空间>=文件大小)
每个trunk file由一个id唯一标识,trunk file由group内的trunk server负责创建(trunk server是tracker选出来的),并同步到group内其他的storage,文件存储合并存储到trunk file后,根据其offset就能从trunk file读取到文件。
文件在trunk file内的offset编码到文件名,决定了其在trunk file内的位置是不能更改的,也就不能通过compact的方式回收trunk file内删除文件的空间。但当trunk file内有文件删除时,其删除的空间是可以被复用的,比如一个100KB的文件被删除,接下来存储一个99KB的文件就可以直接复用这片删除的存储空间。