Road to growth of rookie

Meaningful life is called life

0%

FastDFS 安装和入门

在传统的项目中计算机通过文件系统存储数据. 而现在各种微服务、负载均衡横行的时代, 文件会被多台服务器访问, 造成数据文件不能被存储在本地文件系统中.

传统的解决方法一般会有一台专门存储文件的服务器, 业务服务器的文件存储会通过 ftpssh 的方式上传到文件服务上. 这种方式被称为 网络文件系统NFS (Network File System), 但是 NFS 在使用中也存在: 大量的访问磁盘 IO、存在单点故障、存储空间不足等缺点

为了解决 NFS 的缺点 分布式文件系统DFS (Distributed File System) 应运而生. 分布式文件系统可以有效的解决数据的存储和管理难题; DFS 将固定某一地点的某个文件系统, 扩展到任意多个地点/多个文件系统, 众多节点组成一个文件系统网络. 每个节点可以分布在不同的地点, 通过网络进行节点间的通信和数据传输. 在使用分布式文件系统时, 无需关心数据是存储在哪个节点上、或者是从哪个节点从获取的, 只需要像使用本地文件系统一样管理和存储文件系统中的数据.

FastDFS

FastDFS 是一个由国人使用纯 C 开发的轻量级分布式文件系统, 在国内被广泛使用且有着良好的社区环境; 功能包括: 文件存储、文件同步、文件访问 (上传和下载) 等, 解决了大容量存储和负载均衡的问题特别适合已文件未载体的在线服务, FastDFS 针对小文件 (4KB < file_size <500MB) 存储更有优势. 除了 FastDFS 常用的分布式文件系统还有 MooseFSGlusterFSCephMogileFSTFS 等.

目标环境: 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 servergroup, 每个 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  # tracker服务器端口(默认22122,一般不修改)
base_path=/usr/local/fastdfs # 存储日志和数据的根目录
  • 启动 Tracker Server
1
2
3
4
sudo /etc/init.d/fdfs_trackerd start #启动tracker服务
sudo /etc/init.d/fdfs_trackerd restart #重启动tracker服务
sudo /etc/init.d/fdfs_trackerd stop #停止tracker服务
sudo chkconfig fdfs_trackerd on #自启动tracker服务
配置启动 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  # storage服务端口(默认23000,一般不修改)
base_path=/usr/local/fastdfs # 数据和日志文件存储根目录
store_path0=/usr/local/fastdfs # 第一个存储目录
tracker_server=192.168.52.2:22122 # 服务器1
tracker_server=192.168.52.3:22122 # 服务器2
tracker_server=192.168.52.4:22122 # 服务器3
http.server_port=8888 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
  • 启动 Storage Server
1
2
3
4
sudo /etc/init.d/fdfs_storaged start #启动storage服务
sudo /etc/init.d/fdfs_storaged restart #重动storage服务
sudo /etc/init.d/fdfs_storaged stop #停止动storage服务
sudo chkconfig fdfs_storaged on #自启动storage服务
配置客户端并测试
  • 修改配置文件 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 # 服务器1
tracker_server=192.168.52.3:22122 # 服务器2
tracker_server=192.168.52.4:22122 # 服务器3
  • 测试: 如果正确返回路径则代表成功
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  # 服务器1
tracker_server=192.168.52.3:22122 # 服务器2
tracker_server=192.168.52.4:22122 # 服务器3
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; ## 该端口为storage.conf中的http.server_port相同
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 访问测试上传的文件是否成功就可以了

数据来源