在传统的项目中计算机通过文件系统存储数据. 而现在各种微服务、负载均衡横行的时代, 文件会被多台服务器访问, 造成数据文件不能被存储在本地文件系统中.
传统的解决方法一般会有一台专门存储文件的服务器, 业务服务器的文件存储会通过 ftp
或 ssh
的方式上传到文件服务上. 这种方式被称为 网络文件系统 即 NFS
(Network File System
), 但是 NFS
在使用中也存在: 大量的访问磁盘 IO
、存在单点故障、存储空间不足等缺点
为了解决 NFS
的缺点 分布式文件系统 即 DFS
(Distributed File System
) 应运而生. 分布式文件系统可以有效的解决数据的存储和管理难题; DFS
将固定某一地点的某个文件系统, 扩展到任意多个地点/多个文件系统, 众多节点组成一个文件系统网络. 每个节点可以分布在不同的地点, 通过网络进行节点间的通信和数据传输. 在使用分布式文件系统时, 无需关心数据是存储在哪个节点上、或者是从哪个节点从获取的, 只需要像使用本地文件系统一样管理和存储文件系统中的数据.
FastDFS
FastDFS
是一个由国人使用纯 C
开发的轻量级分布式文件系统, 在国内被广泛使用且有着良好的社区环境; 功能包括: 文件存储、文件同步、文件访问 (上传和下载) 等, 解决了大容量存储和负载均衡的问题特别适合已文件未载体的在线服务, FastDFS
针对小文件 (4KB < file_size <500MB
) 存储更有优势. 除了 FastDFS 常用的分布式文件系统还有 MooseFS
、GlusterFS
、Ceph
、MogileFS
、TFS
等.
目标环境: Ubuntu 16.04
; 系统内核: 4.15.0-45-generic FastDFS: server v6.06
安装 libfatscommon
1
| $ git clone https://github.com/happyfish100/libfastcommon.git --depth 1 && libfastcommon/make.sh && sudo libfastcommon/make.sh install
|
安装 FastDFS
1 2 3
| $ sudo mkdir -p /usr/local/fastdfs $ git clone https://github.com/happyfish100/fastdfs.git --depth 1 && fastdfs/make.sh && sudo fastdfs/make.sh install $ sudo cp fastdfs/conf/http.conf /etc/fdfs/ && sudo cp fastdfs/conf/mime.types /etc/fdfs/
|
安装 FastDFS Nginx
模块
1 2 3
| $ wget wget http://nginx.org/download/nginx-{version}.tar.gz && tar -zxvf nginx-{version}.tar.gz $ sudo git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1 /usr/local/src/fastdfs-nginx-module $ sudo cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
|
这里如果你的服务器已经安装了 nginx
需要下载对应版本的包, 然后通过 nginx -V
命令获取当时的编译参数, 再在后面添加上 --add-module=/usr/local/fastdfs-nginx-module/src/
, make
之后再将可执行文件覆盖原来的可执行文件. 例如我已经安装的 nginx
参数:
1 2 3 4
| nginx version: nginx/1.10.3 (Ubuntu) built with OpenSSL 1.0.2g 1 Mar 2016 TLS SNI support enabled configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
|
1 2
| $ cd nginx-{version} $ ./configure --prefix=/usr/local/nginx --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads --add-module=/usr/local/src/fastdfs-nginx-module/src/
|
如果已经安装了 nginx
那么就只执行 make
不要执行 make install
, 执行 make
之后将 objs/nginx
覆盖原来的 nginx
可执行文件; 为了安全起见应该将原来的可执行文件备份一份
1
| $ sudo mv /usr/sbin/nginx /usr/sbin/nginx.bak && sudo mv objs/nginx /usr/sbin/nginx
|
启动 FastDFS
FastDFS
分布式文件系统有三个角色: 跟踪服务器 (Tracker Server
)、存储服务器 (Storage Server
) 和客户端 (Client
):
跟踪服务器 (Tracker Server
): 主要做调度工作, 起到均衡的作用; 负责管理所有的 storage server
和 group
, 每个 storage
在启动后会连接 Tracker
, 告知自己所属 group
等信息, 并保持周期性心跳.
存储服务器 (Storage Server
): 存储服务器, 主要提供容量和备份服务; 以 group
为单位, 每个 group
内可以有多台 storage server
, 数据互为备份.
客户端 (Client
): 客户端, 传下载数据的服务器, 也就是项目所部署的服务器
配置启动 Tracker Server
- 修改配置文件
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf && sudo vim /etc/fdfs/tracker.conf
1 2
| port=22122 base_path=/usr/local/fastdfs
|
1 2 3 4
| sudo /etc/init.d/fdfs_trackerd start sudo /etc/init.d/fdfs_trackerd restart sudo /etc/init.d/fdfs_trackerd stop sudo chkconfig fdfs_trackerd on
|
配置启动 Storage Server
- 修改配置文件
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf && sudo vim /etc/fdfs/storage.conf
1 2 3 4 5 6 7
| port=23000 base_path=/usr/local/fastdfs store_path0=/usr/local/fastdfs tracker_server=192.168.52.2:22122 tracker_server=192.168.52.3:22122 tracker_server=192.168.52.4:22122 http.server_port=8888
|
1 2 3 4
| sudo /etc/init.d/fdfs_storaged start sudo /etc/init.d/fdfs_storaged restart sudo /etc/init.d/fdfs_storaged stop sudo chkconfig fdfs_storaged on
|
配置客户端并测试
- 修改配置文件
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf && sudo vim /etc/fdfs/client.conf
1 2 3 4
| base_path=/usr/local/fastdfs tracker_server=192.168.52.2:22122 tracker_server=192.168.52.3:22122 tracker_server=192.168.52.4:22122
|
1
| $ fdfs_upload_file /etc/fdfs/client.conf filename
|
配置 Nginx
- 修改配置文件
sudo vim /etc/fdfs/mod_fastdfs.conf
1 2 3 4 5
| tracker_server=192.168.52.2:22122 tracker_server=192.168.52.3:22122 tracker_server=192.168.52.4:22122 url_have_group_name=true store_path0=/usr/local/fastdfs
|
- 添加配置文件
sudo vim /etc/nginx/conf.d/fastdfs.conf
1 2 3 4 5 6 7 8 9 10 11 12
| server { listen 8888; server_name localhost; location ~/group[0-9]/ { ngx_fastdfs_module; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
|
最后通过 http://192.168.52.2:8888/group1/M00/00/00/xxx.x
访问测试上传的文件是否成功就可以了
数据来源