FastDFS集群部署与性能优化实战

目录

一、介绍

二、FastDFS原理

三、FastDFS部署

1.资源清单

2.修改主机名

3.安装libfastcommon(tracker01、tracker02、storage1、storage2)

4.安装编译FastDFS(tracker01、tracker02、storage1、storage2)

5.配置tracker服务器(tracker01、tracker02)

6.配置Storage服务(storage1、storage2)

7.配置client(tracker01)

8.测试上传文件(tracker01)

9.在所有storage节点安装fastdfs-nginx-module和nginx(storage1、storage2)

10.部署代理(nginx)


一、介绍

1.FastDFS是一个开源的轻量级分布式文件系统,他对文件进行管理

2.功能:文件存储、文件同步、文件访问等

3.解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务

二、FastDFS原理

1.FastDFS架构

a.Tracker server

- 跟踪服务器,主要做调度工作,起到均衡的作用

- 负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳

b.Storage server

- 存储服务器,主要提供容量和备份服务;以group为单位每个Group内部可以由多台storage server,数据互为备份

- 客户端上传的文件最终存储在storage服务器上,Storage server没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将stroage称为存储服务器

c.Client

- 客户端,上传下载数据的服务器

- FastDFS向使用者提供基本文件访问接口,以客户端库的方式提供给用户使用

2.文件的上传

a.选择tracker server

- 当集群中不止一个tracker server时,由于tracker之间时完全对等的关系,客户端在uoload文件时可以任意选择一个tracker。当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持选择group的规则:

- Round robin:所有的group间轮询

- Spcifind group:指定某一个确定的group

- Load balance:剩余存储空间多group优先

b.选择storage server

- 当选定group后,tracker会在geoup内选择一个storage内选择一个storage server给客户端,支持选择storage的规则:

- Round robin:在group内的所有storage间轮询

- First server ordered by ip:按ip排序

- First server ordered by priority:按优先级排序

c.选择storage path

- 当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持规则如下:

- Round robin:多个存储目录间轮询

- 剩余存储空间最多的优先

d.生成Fileid(文件标识)

- 选定存储目录后,storage会为文件生一个Fileid,由storage server IP、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串

e.生成文件名

- 当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名拼接而成

3.文件的下载

a.定位文件

- 客户端上传文件后存储服务器会将文件ID返回给客户端,将此文件ID用于以后访问该文件的索引信息。

- 文件索引信息包括:组名、虚拟磁盘路径、数据两级目录、文件名

b.定位文件所在的group

- 通过组名tracker能够很快的定位到客户端要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问

c.定位文件位置

- 存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件

4.同步时间管理

a.写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storageserver写完文件后,会由后台线程将文件同步至同group内其他的storage server。

b.每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。

c.storage 的同步进度会作为元数据的一部分汇报到tracker上,tracke 在选择读storage的时候会以同步进度作为参考。比如一个group内有A、B、C三个storage server,A向C同步到进度为T1(T1以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2>T1),tracker接收到这些同步进度信息时,就会进行整理,将最小的那个做为C的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker会为A、B生成一个同步时间戳。

5.集成Nginx

a.fastdfs-nginx-module可以重定向文件连接到文件上传时的源服务器取文件,避免客户端由于延迟导致的文件无法访问错误

b.使用nginx反向代理后,后端可以以HTTP请求的方式来访问文件资源。访问nginx反向代理+上传文件时的ID

三、FastDFS部署

1.资源清单

操作系统

主机名

IP

备注

OpenEuler 24.03

tracker01

192.168.16.142

跟踪服务器1

OpenEuler 24.03

tracker02

192.168.16.143

跟踪服务器2

OpenEuler 24.03

storage1

192.168.16.144

存储服务器1

OpenEuler 24.03

storage2

192.168.16.145

存储服务器2

OpenEuler 24.03

nginx

192.168.16.146

代理服务器

2.修改主机名

hostnamectl set-hostname tracker01
hostnamectl set-hostname tracker02
hostnamectl set-hostname storage1
hostnamectl set-hostname storage2
hostnamectl set-hostname nginx

3.安装libfastcommon(tracker01、tracker02、storage1、storage2)

dnf install -y zlib-devel gcc* libtool pcre-devel libevent tar
tar zxf libfastcommon-1.0.36.tar.gz 
cd libfastcommon-1.0.36
./make.sh     #编译
./make.sh install    #安装
cd /usr/lib64/
ll libfast*    #查看所有以libfast开头的内容
cp libfastcommon.so /usr/lib    #覆盖原有模块文件

4.安装编译FastDFS(tracker01、tracker02、storage1、storage2)

tar zxf fastdfs-5.11.tar.gz 
cd fastdfs-5.11
./make.sh 
./make.sh install 

5.配置tracker服务器(tracker01、tracker02)

cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vi /etc/fdfs/tracker.confdisabled=false                 # (4行)启用配置文件
port=22122                     # (11行)tracker服务器端口(默认22122)
base_path=/fastdfs/tracker   # (22行)存储日志和数据的根目录
store_group=group1                #(53行)设置存储组名称mkdir -p /fastdfs/tracker
/etc/init.d/fdfs_trackerd start

6.配置Storage服务(storage1、storage2)

cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vi /etc/fdfs/storage.confdisabled=false    #4行
port=23000    #24行
base_path=/fastdfs/storage    #41行
store_path0=/fastdfs/storage    #109行
tracker_server=192.168.16.142:22122    #118行,Tracker1节点的IP
tracker_server=192.168.16.143:22122    #119行,Tracker2节点的IP
roup_name=group1    #11行
http.server_port=8888    #285行mkdir -p /fastdfs/storage
/etc/init.d/fdfs_storaged start
ps -ef | grep fdfs_storaged

7.配置client(tracker01)

cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
mkdir -p /fastdfs/tracker
vi /etc/fdfs/client.confbase_path=/fastdfs/tracker    #10行
tracker_server=192.168.16.142:22122    #14行
tracker_server=192.168.16.143:22122    #15行

8.测试上传文件(tracker01)

fdfs_upload_file /etc/fdfs/client.conf libfastcommon-1.0.36.tar.gz
group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz

9.在所有storage节点安装fastdfs-nginx-module和nginx(storage1、storage2)

a.安装fastdfs-nginx-module


tar zxvf fastdfs-nginx-module_v1.16.tar.gz 
cd fastdfs-nginx-module/srcvi config ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"

b.安装Nginx

dnf -y install pcre-devel zlib-devel gcc*
tar zxvf nginx-1.19.5.tar.gz 
useradd nginx
cd nginx-1.19.5
cp /usr/include/fastcommon/* /usr/include/fastdfs/
./configure \
--prefix=/usr/local/nginx \
--add-module=/root/fastdfs-nginx-module/src/ --with-cc-opt="-Wno-error=format-truncation"
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin

c.配置FastDFS

#复制文件到/etc/fdfs目录
cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
#修改配置文件
vi /etc/fdfs/mod_fastdfs.conf connect_timeout=10    #3行
base_path=/tmp    #10行,用户存储日志的
tracker_server=192.168.16.142:22122    #40行
tracker_server=192.168.16.143:22122
url_have_group_name = true    #54行
group_name=group1    #48行
storage_server_port=23000    #45行
store_path_count=1    #58行
store_path0=/fastdfs/storage    #63行#复制FastDFS的部分配置文件到/etc/fdfs目录
cp /root/fastdfs-5.11/conf/http.conf /etc/fdfs
cp /root/fastdfs-5.11/conf/mime.types /etc/fdfs
#创建软链接
ln -s /fastdfs/storage/data /fastdfs/storage/M00

d.配置Nginx

vi /usr/local/nginx/conf/nginx.conf#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  localhost;location / {root   html;index  index.html index.htm;}location /group1/M00 {ngx_fastdfs_module;
}
}
}#启动服务
nginx -t
/usr/local/nginx/sbin/nginx#访问http://192.168.16.144/group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz

10.部署代理(nginx)

#编译安装
dnf -y install pcre-devel zlib-devel gcc* tar
tar zxvf nginx-1.19.5.tar.gz 
cd nginx-1.19.5
useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin#修改配置文件
vi /usr/local/nginx/conf/nginx.conf#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;upstream storage_server_group1{server 192.168.16.144:80 weight=10;        #storage1节点的Ipserver 192.168.16.145:80 weight=10;        #storage2节点的Ip}server {listen       80;server_name  localhost;location / {proxy_pass   http://storage_server_group1;}
}
}#启动服务
nginx -t
/usr/local/nginx/sbin/nginx#访问http://192.168.16.146/group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习心得(14--16)

模板: 前端的页面单独存在模板当中 jinja2 :模板语法 保持前端页面不变的情况下,返回内容给前端做法: 写一个data,并在return中的render_template中,写上datadata 使用时,要将templa…

stm与51单片机哪个更适合新手学

一句话总结 51单片机:像学骑自行车,简单便宜,但只能在小路上骑。 STM32:像学开汽车,复杂但功能强,能上高速公路,还能拉货载人(做复杂项目)。 1. 为啥有人说“先学51单片…

Web安全测试-文件上传绕过-DVWA

Web安全测试-文件上传绕过-DVWA 很多网站都有上传资源(图片或者文件)的功能,资源上传后一般会存储在服务器的一个文件夹里面,如果攻击者绕过了上传时候的文件类型验证,传了木马或者其他可执行的代码上去,那服务器就危险了。 我用…

ant-design-vue中的分页组件自定义

ant-design-vue中的分页组件自定义 实现效果 实现代码 需要自己创建一个分页组件的代码然后导入进去。 <template><div style"display: flex; justify-content: space-between; margin-bottom: 10px"><div><a-select v-model:value"pageS…

LabVIEW软件开发过程中如何保证软件的质量?

一、需求与架构设计阶段 明确功能边界与技术指标 在测试系统设计初期&#xff0c;围绕比例阀性能测试核心需求&#xff08;如压力 / 流量信号采集、特性曲线绘制、数据对比分析&#xff09;&#xff0c;定义软件功能模块&#xff08;数据采集、逻辑控制、界面显示&#xff09;&…

Linux 527 重定向 2>1 rsync定时同步(未完)

rsync定时同步 配环境 关闭防火墙、selinux systemctl stop firewalld systemctl disable firewalld setenforce0 vim /etc/SELINUX/config SELINUXdisable515 设置主机名 systemctl set-hostname code systemctl set-hostname backup 配静态ip rsync 需要稳定的路由表和端…

Vue 3.0 中状态管理Vuex 与 Pinia 的区别

在 Vue.js 应用开发中&#xff0c;状态管理是构建复杂应用的关键环节。随着 Vue 3 的普及和 Composition API 的引入&#xff0c;开发者面临着状态管理库的选择问题&#xff1a;是继续使用经典的 Vuex&#xff0c;还是转向新兴的 Pinia&#xff1f;本文将从设计理念、API 设计、…

分布式缓存:三万字详解Redis

文章目录 缓存全景图PreRedis 整体认知框架一、Redis 简介二、核心特性三、性能模型四、持久化详解五、复制与高可用六、集群与分片方案 Redis 核心数据类型概述1. String2. List3. Set4. Sorted Set&#xff08;有序集合&#xff09;5. Hash6. Bitmap7. Geo8. HyperLogLog Red…

React useEffect和useEffectLa

原理把对象以树的形式存档&#xff0c;根据URL进行匹配渲染对应组件 useEffect 和useLayoutEffect区别 useEffect中的回调函数放在异步任务队列中&#xff0c;是异步的&#xff0c;会在React渲染&#xff0c; dom 元素更新&#xff0c;浏览器绘制完成之后才会执行 useLayout…

multiprocessing多进程使用案例

multiprocessing — 基于进程的并行&#xff1a;https://docs.python.org/zh-cn/3.11/library/multiprocessing.html import sys from fastchat.serve.controller import Controller from fastchat.serve.model_worker import ModelWorker from fastchat.serve.openai_api_ser…

鸿蒙OSUniApp 开发实时天气查询应用 —— 鸿蒙生态下的跨端实践#三方框架 #Uniapp

使用 UniApp 开发实时天气查询应用 —— 鸿蒙生态下的跨端实践 在移动互联网时代&#xff0c;天气应用几乎是每个人手机中的"标配"。无论是出行、旅游还是日常生活&#xff0c;实时获取天气信息都极为重要。本文将以"实时天气查询应用"为例&#xff0c;详…

蓝桥杯178 全球变暖

题目描述 你有一张某海域 NxN 像素的照片&#xff0c;"."表示海洋、"#"表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上…

第五十二节:增强现实基础-简单 AR 应用实现

引言 增强现实(Augmented Reality, AR)是一种将虚拟信息叠加到真实世界的技术,广泛应用于游戏、教育、工业维护等领域。与传统虚拟现实(VR)不同,AR强调虚实结合,用户无需完全沉浸到虚拟环境中。本文将通过Python和OpenCV库,从零开始实现一个基础的AR应用:在检测到特定…

青少年编程与数学 02-019 Rust 编程基础 23课题、web服务器

青少年编程与数学 02-019 Rust 编程基础 23课题、web服务器 一、单线程Web 服务器基本实现步骤完整代码示例运行结果项目结构注意事项扩展方向 二、多线程Web服务器1. 基本架构设计2. 完整实现代码项目文件结构文件内容Cargo.tomlsrc/main.rssrc/lib.rsstatic/hello.htmlstatic…

(14)JVM弹性内存管理

文章目录 &#x1f680; JVM弹性内存管理&#xff1a;K8s环境下的内存优化终极攻略⚡ TL;DR&#x1f635; 等等&#xff0c;为什么我需要关心这个&#xff1f;&#x1f6e0;️ 五步搞定弹性内存&#xff08;拯救你的Java应用&#xff09;1️⃣ JVM参数调教2️⃣ 监控指标全覆盖…

Spring Boot集成Spring AI与Milvus实现智能问答系统

在Spring Boot中集成Spring AI与Milvus实现智能问答系统 引言 随着人工智能技术的快速发展&#xff0c;智能问答系统在企业中的应用越来越广泛。然而&#xff0c;传统的问答系统往往面临AI幻觉&#xff08;Hallucination&#xff09;问题&#xff0c;即生成不准确或无意义的回…

电脑网络如何改ip地址?ip地址改不了怎么回事

在日常使用电脑上网时&#xff0c;我们有时会遇到需要更改IP地址的情况&#xff0c;比如访问某些受限制的网站、解决网络冲突问题&#xff0c;或者出于隐私保护的需求。然而&#xff0c;许多用户在尝试修改IP地址时可能会遇到各种问题&#xff0c;例如IP地址无法更改、修改后无…

SQL进阶之旅 Day 1:高效表设计与规范

SQL进阶之旅 Day 1&#xff1a;高效表设计与规范 开篇 欢迎来到为期30天的“SQL进阶之旅”系列的第一天&#xff01;今天我们将从数据库表设计的基础入手&#xff0c;讨论如何通过合理的表设计来提升数据库性能。这不仅是每位数据库开发工程师的基本功&#xff0c;也是解决实…

【MySQL】第11节|MySQL 8.0 主从复制原理分析与实战

一、MySQL主从复制基础 1. 核心概念 定义&#xff1a; MySQL主从复制是将主库&#xff08;Source/Master&#xff09;的数据变更同步到一个或多个从库&#xff08;Replica/Slave&#xff09;的机制&#xff0c;默认采用异步复制&#xff0c;支持全库、指定库或表的同步。 角…

怎么判断一个Android APP使用了Cocos 这个跨端框架

要判断一个 Android 应用是否使用了 Cocos 跨端框架&#xff0c;可以通过以下步骤进行验证&#xff1a; 一、安装包结构分析 1. 解压 APK 将 .apk 文件重命名为 .zip 并解压&#xff0c;检查以下特征文件&#xff1a; • lib/ 目录&#xff1a; Cocos 引擎的核心原生库文件通常…