1. FastDFS
? fastdfs 是一个由C语言开发的 分布式的存储系统,比较适合存储一些 视频、音频、文档(4kb)、图片。
功能包括: 文件存储、文件同步、文件访问、文件上传、下载, 适合做 以文件为载体的在线功能,例如 图片网站、视频网站等等
2. FastDFS 组成部分
? FastDFS 由 客户端(client)、跟踪服务器(Tracker Server)、 存储服务器(Storage Server) 组成
? 1) CLient: 存储的客户端,负责进行文件的存储和上传,这些操作在客户端操作,每个客户端都需安装 Nginx
? 2) Tracker server: 跟踪服务器, 管理后端存储节点,来自客户端的请求进行识别并指定对应的后端节点给与响应( 负责接收客户端的请求)。
? 3) Storage server: 存储服务器,存储数据分为了 若干个小组,负责响应文件存储,下载、查看等等。
3. 工作流程
1) 文件上传流程
? 跟踪服务器( Tracker) 与 存储服务器(Storage) 会进行心跳检测,并将 storage 中的 节点状态发送给 Tracker 服务器
? 当客户端向 Tracker 发送上传的请求,Tracker 收到后根据Storage 状态向 客户端分配 group ,并将 storage 的地址与端口 返回给 Client。
? Client 将要上传的文件 传输给 Storage的服务器,Storage 将收到的文件进行存储,并生成一个 文件-ID, 并将文件ID 返回给 Client 。
? Client 可凭着 文件-ID 对文件进行查看、下载、删除等操作
?
2) 文件下载流程
? 跟踪服务器( Tracker) 与 存储服务器(Storage) 会进行心跳检测,并将 storage 中的 节点状态发送给 Tracker 服务器
? 当客户端向Tracker 发送 下载请求,Tracker 根据请求 ID分配 可用的 storage ,并将其地址与端口返回给 Client 。
? Client 根据 Tracker 返回的 storage 的地址将 文件-ID发送给 Storage ,Storage 根据 文件-ID 查看文件,查到对应文件将其返回给 客户端
? client 收到文件,下载完成
?
3) 整体架构图
1) 每个小组内的数据完全相同
? 2) 各个小组的小数据没有重复,加起来是总体数据
3. 部署 FastDFS 分布式存储系统
?
实验环境:
? Client : 192.168.116.101 Nginx、FastDFS
? Tracker 1: 192.168.116.102 FastDFS
? Tracker 2: 192.168.116.103 FastDFS
? Storage: Nginx FastDFS
? group 1-1: 192.168.116.104
? group 1-2: 192.168.116.105
? group 2-1: 192.168.116.106
? group 2-2: 192.168.116.107
PS: 实验环境,将所有防火墙,Selinux关闭,生产环境开启对应端口即可
1) 为所有主机安装 FastDFS
- 同步所有主机的时间
[root@localhost ~]# ntpdate net.ntsc.ac.cn
- 安装 FastFDS 依赖关系
- 由于 FastDFS 是 C语言编写,需要安装 C语言环境
[root@localhost ~]# yum -y install libtool autoconf automake pcre-devel zlib-devel openssl-devel gcc gcc-c++
- 创建 FastFDS 数据、日志目录
- 该目录为配置文件中的 默认目录,提前创建以免遗漏
[root@localhost ~]# mkdir -p /home/yuqing/fastdfs
- 解压
[root@localhost ~]# tar -zxf fastdfs.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/[root@localhost src]# ls
fastdfs fastdfs-nginx-module libfastcommon? fastdfs # FastDFS 的主程序,源码包? libfastcommon # 包含了 FastDFS运行所需要的基础库fastdfs-nginx-module # 存放了 FastDFS与Nginx 需要的模块
- 编译安装 FastDFS
- 在源码包内,安装编译
[root@localhost src]# cd libfastcommon/ && ./make.sh && ./make.sh install && cd ..[root@localhost src]# cd fastdfs && ./make.sh && ./make.sh install && cd ..
- 生成 Client 、Tracker、 Storage 所需要的配置文件
- 为了防止混乱,所有主机执行统一操作,主机只使用对应的配置文件
- 当然了,也可以在对应的 服务器生成对应的配置文件
[root@localhost src]# pwd
/usr/local/src[root@localhost src]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf# Tracker 配置文件
[root@localhost src]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf# Storage 配置文件
[root@localhost src]# cp /etc/fdfs/client.conf.sample /etc/fdfs//client.conf# Client 配置文件[root@localhost src]# cp fastdfs/conf/http.conf /etc/fdfs/
[root@localhost src]# cp fastdfs/conf/mime.types /etc/fdfs/# 以上两个文件,用于 与 Nginx 使用。
2) 部署Storage Server
- 之前 FastDFS 已安装
- 安装 Nginx
- 与平时安装有一点点区别
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# tar -zxf nginx-1.12.2.tar.gz
[root@localhost ~]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --add-module=/usr/local/src/fastdfs-nginx-module/src/ && make && make install# 添加 nginx与 FastDFS 连接的模块[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
- 将mod_fastdfs.conf 文件copy 到/etc/fdfs 目录下
[root@localhost ~]# cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
-
修改 Storage storage.conf 配置文件
- group 1-1
[root@localhost ~]# vim /etc/fdfs/storage.confgroup_name=group1 bind_addr=192.168.116.104port=23000base_path=/home/yuqing/fastdfsmax_connections=1024 store_path0=/home/yuqing/fastdfs tracker_server=192.168.116.102:22122
tracker_server=192.168.116.103:22122http.server_port=8888
参数含义:
group_name=group1 # 组名,默认属于 第一组bind_addr=192.168.116.104 # 绑定自身IP地址port=23000 # Storage 监听的端口号base_path=/home/yuqing/fastdfs # 存放数据、日志的路径max_connections=1024 # 最大连接数据store_path0=/home/yuqing/fastdfs # 第一个存储数据的目录tracker_server=192.168.116.102:22122 # 指定 Tracker 的地址
tracker_server=192.168.116.103:22122http.server_port=8888 # nginx 端口
?
-
group 1-2
- 大多数保持默认即可,如有特殊需求,可以自行更改
[root@localhost ~]# vim /etc/fdfs/storage.confgroup_name=group1 # 默认组名bind_addr=192.168.116.105 # 更改自身IP地址tracker_server=192.168.116.102:22122 tracker_server=192.168.116.103:22122
-
group 2-1
- 第二组,将组名改为 group2
[root@localhost ~]# vim /etc/fdfs/storage.confgroup_name=group2 bind_addr=192.168.116.106tracker_server=192.168.116.102:22122
tracker_server=192.168.116.103:22122
- group 2-2
[root@localhost ~]# vim /etc/fdfs/storage.confgroup_name=group2 bind_addr=192.168.116.107tracker_server=192.168.116.102:22122
tracker_server=192.168.116.103:22122
- 修改 Storage mod_fastdfs.conf 配置文件
- group 1-1:
[root@localhost ~]# vim /etc/fdfs/mod_fastdfs.conf base_path=/home/yuqing/fastdfs # 默认的存储 数据、日志目录tracker_server=192.168.116.102:22122 # 指定Tracker 地址
tracker_server=192.168.116.103:22122group_name=group1 # 当前组名url_have_group_name = true # 是否开启存储数据ID标识组名group_count = 2 # 当前游街有几个 storage 组# 去掉注释
[group1]
group_name=group1 # 组名
storage_server_port=23000 # 服务端口
store_path_count=1 # 存储路径个数
store_path0=/home/yuqing/fastdfs # 存储路径# 去掉注释
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/home/yuqing/fastdfs
- 4、5、6、7 主机配置文件相差不大,scp 配置文件
[root@localhost ~]# scp /etc/fdfs/mod_fastdfs.conf root@192.168.116.105:/etc/fdfs/[root@localhost ~]# scp /etc/fdfs/mod_fastdfs.conf root@192.168.116.106:/etc/fdfs/[root@localhost ~]# scp /etc/fdfs/mod_fastdfs.conf root@192.168.116.107:/etc/fdfs/
- 在 group 2 组内将其组名改为 group2
- 修改 Nginx 配置文件(四台都需要)
- 添加一个 Server 模块, 监听 8888 端口, 凡是访问 group开头的请求,一律交给 ngx_fastdfs_module 模块进行处理。
- 一般用于查看数据
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.confserver {
listen 8888;server_name localhost;location ~/group[0-9]/M00/ {
ngx_fastdfs_module;}}
- 启动 Nginx
[root@localhost ~]# nginx
ngx_http_fastdfs_set pid=4709
- 启动 Storage
[root@localhost ~]# /etc/init.d/fdfs_storaged start
Reloading systemd: [ OK ]
Starting fdfs_storaged (via systemctl): [ OK ]
2) 部署 Tracker Server
- FastFDS 以安装
- Tracker 1 修改 tracker.conf 配置文件
[root@localhost src]# vim /etc/fdfs/tracker.confbind_addr=192.168.116.102 # 本机IP地址port=22122base_path=/home/yuqing/fastdfs
- Tracker 2 修改 tracker.conf 配置文件
[root@localhost src]# vim /etc/fdfs/tracker.confbind_addr=192.168.116.103port=22122base_path=/home/yuqing/fastdfs
- Tracker 启动
[root@localhost src]# /etc/init.d/fdfs_trackerd start
Reloading systemd: [ OK ]
Starting fdfs_trackerd (via systemctl): [ OK ]
3) Client 部署
- FastFDS 以安装
- 安装NGinx
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# tar -zxf nginx-1.12.2.tar.gz
[root@localhost ~]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
- 修改 Client 配置文件
[root@localhost ~]# vim /etc/fdfs/client.confbase_path=/home/yuqing/fastdfs # 该目录存储日志tracker_server=192.168.116.102:22122 # 指定 Tracker 地址
tracker_server=192.168.116.103:22122
- 部署 Nginx 反向代理
- 查看存储文件时,通过 Nginx 反向代理查看
- 根据不同的请求转发至不同的 group
http {
………………
upstream fdfs_group1 {
server 192.168.116.104:8888 max_fails=2 fail_timeout=30s;server 192.168.116.105:8888 max_fails=2 fail_timeout=30s;}
upstream fdfs_group2 {
server 192.168.116.106:8888 max_fails=2 fail_timeout=30s;server 192.168.116.107:8888 max_fails=2 fail_timeout=30s;}server {
…………location ~/group1 {
proxy_pass http://fdfs_group1;}location ~/group2 {
proxy_pass http://fdfs_group2;}
}
}
- 启动 Nginx
[root@localhost ~]# nginx
4) 上传文件、查看文件、下载文件、删除文件
-
上传 test.png图片
[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf /root/test.jpg
group1/M00/00/00/wKh0aF5fYBSABIBdABAx2GU8yhU055.jpg
-
查看 上传的图片
- 根据返回的 ID 进行查看
- http://192.168.116.101/group1/M00/00/00/wKh0aF5fYBSABIBdABAx2GU8yhU055.jpg
-
下载文件
[root@localhost ~]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKh0aF5fYBSABIBdABAx2GU8yhU055.jpg /root/test2.jpg
[root@localhost ~]# ls /root/test2.jpg
/root/test2.jpg
-
删除文件
[root@localhost ~]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKh0aF5fYBSABIBdABAx2GU8yhU055.jpg
-
再次查看
4. 操作命令
1) 上传文件
fdfs_upload_file client.config file_path
fdfs_upload_file # 上传文件命令? client.confg # 指定客户端的 fdfs/ client.config 配置文件? file_path # 所要上传的文件路径
- 例子:
- 执行成功后,会返回一条 数据存储 ID 可根据此ID查看、删除、下载
[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf /root/up.png
group1/M00/00/00/wKh0aF5fKuqARMPxAAG43D0gda8482.png
2) 查看文件
? 访问 客户端的IP地址+返回的数据存储ID
? http://Client-ip/data-id
3) 下载文件
fdfs_download_file client.conf-path file-id
fdfs_download_file # 删除文件命令字client.conf-path # client.conf 文件的路径file-id # 上传成功返回的ID
例子:
[root@localhost ~]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKh0aF5fKuqARMPxAAG43D0gda8482.png /root/up2.png
[root@localhost ~]# ls /root/up2.png
/root/up2.png
4) 删除文件
dfds_delete_file client.conf file-id
dfds_delete_file # 删除命令字client.conf # client.conf 配置文件的路径file-ID # 上传后返回的ID
例子:
[root@localhost ~]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKh0aF5fKuqARMPxAAG43D0gda8482.png