当前位置: 代码迷 >> 综合 >> 部署 FastDFS 分布式存储系统
  详细解决方案

部署 FastDFS 分布式存储系统

热度:93   发布时间:2024-01-04 20:56:01.0

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
  相关解决方案