无限容量分布式文件存储解决方案

news2024/11/13 16:05:38

常见分布式文件系统

常见分布式文件系统比较

常见的分布式文件系统有GFS、HDFS 、Ceph 、GridFS 、TFS、FastDFS等。各自适用于不同的领域。

类 Google FS 都支持文件冗余备份,例如 Google FS、TFS 的备份数是 3。一个文件存储到哪几个存储结点,通常采用动态分配的方式。采用这种方式,一个文件存储到的结点是不确定的。举例说明,文件备份数是 3,集群中有 A、B、C、D 四个存储结点。文件 1 可能存储在 A、B、C 三个结点,文件 2 可能存储在 B、C、D 三个结点,文件 3 可能存储在 A、B、D 三个结点。

指标HDFSGlusterFSCephTFSFastDFS
开发语言JavaCC++C++C
复杂度简单简单复杂复杂简单
在线扩容支持支持支持支持支持
冗余备份支持支持支持支持支持
单点故障不存在不存在不存在存在不存在
易用性安装简单,官方文档专业化安装简单,官方文档专业化安装简单,官方文档专业化安装复杂,官方文档少安装简单,社区相对活跃
适用场景适合存储大文件跨集群云存储单集群的大中小文件跨集群的小文件单集群的中小文件

分布式文件系统需要满足的要求

对一个分布式文件系统而言,有一些特性是必须要满足的,否则就无法有竞争力。主要如下:

  • 应该符合 POSIX 的文件接口标准,使该系统易于使用,同时对于用户的遗留系统也无需改造;
  • 对用户透明,能够像使用本地文件系统那样直接使用;
  • 持久化,保证数据不会丢失;
  • 具有伸缩性,当数据压力逐渐增长时能顺利扩容;
  • 具有可靠的安全机制,保证数据安全;
  • 数据一致性,只要文件内容不发生变化,什么时候去读,得到的内容应该都是一样的。

除此之外,还有些特性是分布式加分项,具体如下:

  • 支持的空间越大越好;
  • 支持的并发访问请求越多越好;
  • 性能越快越好;
  • 硬件资源的利用率越高越合理,就越好。

分布式文件系统的架构模型

'xxs'

从业务模型和逻辑架构上,分布式文件系统需要这几类组件:

  • 存储组件:负责存储文件数据,它要保证文件的持久化、副本间数据一致、数据块的分配 / 合并等等;
  • 管理组件:负责 meta 信息,即文件数据的元信息,包括文件存放在哪台服务器上、文件大小、权限等,除此之外,还要负责对存储组件的管理,包括存储组件所在的服务器是否正常存活、是否需要数据迁移等;
  • 接口组件:提供接口服务给应用使用,形态包括 SDK(Java/C/C++ 等)、CLI 命令行终端、以及支持 FUSE 挂载机制。

而在部署架构上,有着“中心化”和“无中心化”两种路线分歧,即是否把“管理组件”作为分布式文件系统的中心管理节点。“无中心化”的分布式系统的代表是Ceph,而存在“中心化”的分布式系统有很多,如今天要学的 FastDFS。

FastDFS 简介

概念

FastDFS 是一个轻量级、开源的、高性能、分布式的文件系统。它的主要功能包括:

  • 文件存储
  • 文件同步
  • 文件访问(文件上传和文件下载)
  • 解决了大容量存储和负载均衡的问题

FastDFS 非常适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制。并注重高可用、高性能等指标。使用FastDFS很容易搭建一套高性能的文件服务器集群,提供文件上传、下载等服务。

FastDFS是一种轻量级对象存储解决方案。如果您需要一个用于数据库、K8s和虚拟机(如KVM)的通用分布式文件系统,您可以了解FastCFS,它可以实现强大的数据一致性和高性能。

特点

  • 分组存储,简单灵活;
  • 对等结构,不存在单点;
  • 文件 ID 由 FastDFS 生成,作为文件访问凭证。FastDFS 不需要传统的 name server 或 meta server;
  • 大、中、小文件均可以很好支持,可以存储海量小文件;
  • 一台 storage 支持多块磁盘,支持单盘数据恢复;
  • 提供了 nginx 扩展模块,可以和 nginx 无缝衔接;
  • 支持多线程方式上传和下载文件,支持断点续传;
  • 存储服务器上可以保存文件附加属性。

角色

FastDFS包含两种角色:tracker 和 storage。

'xxs'

Tracker

tracker负责文件访问的调度和负载均衡,跟踪程序或存储群集中的服务器可以随时添加到群集中或从集群中删除,而不会影响在线服务。tracker集群中的服务器是对等的,可以根据服务器的压力情况随时增加或减少。Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

Storage

storage 负责存储文件,其功能是文件管理,包括:文件存储、文件同步、提供文件访问接口。它还管理元数据,这些元数据表示为文件键值对的属性。例如:name = “大都督”,其中 key为name,value为 大都督。文件元数据是文件属性列表,可以包含多个键值对。

存储服务器按文件卷/组进行组织以获得高容量,存储系统包含一个或多个卷,其文件独立于这些卷。整个存储系统的容量等于所有卷的容量之和。文件卷包含一个或多个存储服务器,这些服务器中的文件相同。文件卷中的服务器相互备份,所有这些服务器都是负载均衡的。将存储服务器添加到卷时,此卷中已有的文件将自动复制到此新服务器,复制完成后,系统将联机切换此服务器以提供存储服务。

当整个存储容量不足时,可以添加一个或多个卷以扩展存储容量。为此,您需要添加一个或多个存储服务器。

Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

tracker 和 storage 包含一个或多个服务器。

用户列表

UC

'xxs'

支付宝

'xxs'

京东商城

'xxs'

赶集网

'xxs'

迅雷

'xxs'

除此之外,还有 58 同城等等。

FastDFS 架构

Client为使用FastDFS服务的调用方,并且也是一台服务器,它对tracker和storage的调用均为服务器间的调用。存储服务器采用分组方式,同组内的存储服务器上的文件完全相同。不同组的storage server之间不会相互通信。由storage server主动向tracker server报告状态信息,tracker server之间不会相互通信。

'xxs'

上传交互过程

  1. client询问tracker上传到的storage,不需要附加参数;
  2. tracker返回一台可用的storage;
  3. client直接和storage通讯完成文件上传。

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

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

**组名:**文件上传后所在的storage组名称,在文件上传成功后由storage服务器返回,需要客户端自行保存。

**虚拟磁盘路径:**storage配置的虚拟路径,与磁盘选项store_path对应。如果配置了store_path0,则虚拟路径是M00,如果配置了store_path1,则虚拟路径是M01,以此类推。

**数据两级目录:**storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。

**文件名:**与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

下载交换过程

  1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
  2. tracker返回一台可用的storage;
  3. client直接和storage通讯完成文件下载。

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

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

文件的标识由两部分组成:卷名和文件名,二者缺一不可。

FastDFS 搭建

部署规划

'xxs'

部署程序集群/组主机名称/IP描述
tracker 1tracker clusterlinux30/192.168.10.30tracker 高可用
tracker 2tracker clusterlinux31/192.168.10.31tracker 高可用
storage 1storage server group 1linux32/192.168.10.32storage 线性扩展
storage 2storage server group 1linux33/192.168.10.33storage 线性扩展
storage 3storage server group 2linux34/192.168.10.34storage 线性扩展
storage 4storage server group 2linux35/192.168.10.35storage 线性扩展

由于使用Nginx提供文件的浏览访问功能,同时也需要安装Nginx服务。

环境准备

JDK1.8 安装

可以通过如下命令查看是否已经安装 JDK1.8 版本

[root@linux30 ~]# java -version

'xxs'

Apache Maven 3.6.1 安装

可以通过如下命令查看是否已经安装 Maven

[root@linux30 ~]# mvn -v

'xxs'

Git 安装

可以通过如下命令查看是否已经安装 Git

[root@linux30 ~]# git --version

'xxs'

FastDFS 源码

FastDFS是C语言开发,所以我们需要去FastDFS官网下载源码进行编译

[root@linux30 ~]# mkdir -p /opt/projects/
[root@linux30 ~]# cd /opt/projects/
[root@linux30 projects]# git clone https://github.com/happyfish100/fastdfs.git

'xxs'

如果由于网络问题导致无法使用git下载源码,则手动到官方地址下载压缩包 fastdfs-6.08.tar.gz

'xxs'

安装FastDFS需要编译依赖gcc环境,如果没有gcc环境,需要安装gcc

[root@linux30 projects]# yum install gcc-c++

libevent 安装

FastDFS依赖libevent库,安装命令如下:

[root@linux30 projects]# yum -y install libevent

'xxs'

libfastcommon 安装

libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。下载 libfastcommon-1.0.58.tar.gz安装包,进行解压

[root@linux30 projects]# tar -zxvf libfastcommon-1.0.58.tar.gz

'xxs'

[root@linux30 libfastcommon-1.0.58]# ./make.sh
[root@linux30 libfastcommon-1.0.58]# ./make.sh install

'xxs'

安装Tracker

tracker 编译安装

[root@linux30 fastdfs-6.08]# cd /opt/projects/fastdfs-6.08
[root@linux30 fastdfs-6.08]# ./make.sh
[root@linux30 fastdfs-6.08]# ./make.sh install

'xxs'

配置 tracker.conf

[root@linux30 fdfs]# cd /etc/fdfs/
[root@linux30 fdfs]# vi tracker.conf
base_path = /tmp/fastdfs/tracker

启动 tracker

[root@linux30 fdfs]# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
[root@linux30 fdfs]# ps -ef | grep fdfs

'xxs'

安装Storage

启动 linux32/192.168.10.32 虚拟机,同样需要安装 libevent、libfastcommon-1.0.58.tar.gz 以及下载 fastdfs-6.08.tar.gz 安装包,安装方法同Tracker。

'xxs'

Strorage 编译安装

[root@linux32 fastdfs-6.08]# cd /opt/fastdfs/fastdfs-6.08/
[root@linux32 fastdfs-6.08]# ./make.sh
[root@linux32 fastdfs-6.08]# ./make.sh install

'xxs'

当我们在编译过程中遇到如下报错时,是因为系统中缺少相关的运行环境,所以需要执行以下命令后,再重新编译安装

'xxs'

## 安装运行环境
[root@linux32 fastdfs-6.08]# yum -y install gcc gcc-c++ openssl openssl-devel pcre pcre-devel perl 
## 清空编译代码
[root@linux32 fastdfs-6.08]# ./make.sh clean
## 重新编译、安装
[root@linux32 fastdfs-6.08]# ./make.sh
[root@linux32 fastdfs-6.08]# ./make.sh install

配置 storage.conf

[root@linux32 fdfs]# vi /etc/fdfs/storage.conf
## 存储数据和日志文件的目录
base_path = /tmp/fastdfs/storage
## 基于0,存储文件
store_path0 = /tmp/fastdfs/storage/files
## tracker_server地址,
tracker_server = 192.168.10.30:22122
## 创建 base path, store path
[root@linux32 fastdfs]# mkdir -p /tmp/fastdfs/storage/files

启动 storage

[root@linux32 fdfs]# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
[root@linux32 fdfs]# ps -ef | grep fdfs

'xxs'

启动失败,查看日志如下:

[root@linux32 fdfs]# cd /opt/fastdfs/storage/
[root@linux32 storage]# cat logs/storaged.log

'xxs'

需要创建 data 目录

[root@linux32 storage]# mkdir -p /opt/fastdfs/storage/files/data
[root@linux32 storage]# fdfs_storaged /etc/fdfs/storage.conf restart
[root@linux32 storage]# ps -ef | grep fdfs

'xxs'

使用 FastDFS

Client 上传文件

编辑 /etc/fdfs/client.conf 文件

[root@linux30 fdfs]# vi /etc/fdfs/client.conf
## 存储客户端日志的基础路径
base_path = /tmp/fastdfs/client
## tracker server 的地址

tracker_server = 192.168.10.30:22122
## 创建 client 目录
[root@linux30 fdfs]# mkdir -p /tmp/fastdfs/client

创建 test 测试文件

[root@linux30 fdfs]# vi test.txt
My name is 大都督
This is a test file.

'xxs'

使用 fdfs_test 命令上传文件,其使用方法如图所示

'xxs'

执行上传文件命令

[root@linux30 fdfs]# fdfs_test /etc/fdfs/client.conf upload test.txt

'xxs'

返回的结果如下:

## 组名称
group_name=group1
## 远程文件名
remote_filename=M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt

Client 下载文件

语法:fdfs_test <config_file> download <group_name> <remote_filename>

执行如下命令下载文件

[root@linux30 fdfs]# fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt

'xxs'

Client 删除文件

语法:fdfs_test <config_file> delete <group_name> <remote_filename>

执行如下命令删除文件

[root@linux30 fdfs]# fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt

'xxs'

登录 storage 服务器(linux32/192.168.10.32),查看是否删除成功

[root@linux32 00]# cd /tmp/fastdfs/storage/files/data/00/00
[root@linux32 00]# ll

'xxs'

确实已经将 wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt 文件删除了,但还有一个备份文件,我们能不能在浏览器访问一下呢?记得之前返回响应是:

example file url: http://192.168.10.32/group1/M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239_big.txt

'xxs'

无法访问此网站,所以我们需要安装 Nginx

安装 Nginx

在 storage 中安装 Nginx

找到 Nginx下载网址,下载 相应的安装包,这里我们选择 nginx-1.23.0.tar.gz安装包,上传到 linux32 服务器,解压缩

[root@linux32 opt]# tar -zxvf nginx-1.23.0.tar.gz

'xxs'

在编译安装 Nginx 之前,需要下载 fastdfs-nginx-module 模块,下载成功后,上传至linux32服务器,并解压

'xxs'

接下来,可以编译安装 Nginx

[root@linux32 nginx-1.23.0]# ./configure --prefix=/opt/fastdfs/fdfs-nginx --add-module=/opt/fastdfs/fastdfs-nginx-module-1.22/src
[root@linux32 nginx-1.23.0]# make
[root@linux32 nginx-1.23.0]# make install
[root@linux32 fdfs-nginx]# cd /opt/fastdfs/fdfs-nginx/
[root@linux32 fdfs-nginx]# ./sbin/nginx -t

'xxs'

配置 conf/nginx.conf 文件,添加如下内容

        location /group1/M00 {
            ngx_fastdfs_module;
        }

测试配置没问题

'xxs'

在启动 Nginx 之前,还需要配置 mod_fastdfs.conf 文件

## 拷贝一份 mod_fastdfs.conf 配置文件到 /etc/fdfs 目录下
[root@linux32 src]# cp /opt/fastdfs/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[root@linux32 src]# vi /etc/fdfs/mod_fastdfs.conf
## 设置存储日志的基础目录
base_path=/tmp/fastdfs/fastdfs-mod
## tracker server 的地址
tracker_server=192.168.10.30:22122
## url 中存在group name,需要设置为 true !!!
url_have_group_name = true
## 存储路径必须和storage.conf文件中相同
store_path0=/tmp/fastdfs/storage/files
## 放开http配置文件
include http.conf
http.mime_types_filename=/opt/fastdfs/fdfs-nginx/conf/mime.types
http.default_content_type=application/octet-stream

启动 Nginx

[root@linux32 fdfs-nginx]# ./sbin/nginx
[root@linux32 fdfs-nginx]# ps -ef|grep nginx

'xxs'

再次访问

example file url: http://192.168.10.32/group1/M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239_big.txt

'xxs'

访问 linux32/192.168.10.32 storage 服务成功获取到数据,但是访问 tracker 服务时失败,而在我们使用 FastDFS分布式文件系统时,通常我们会连接到 tracker 去获取数据,所以讲 example file url 中 IP 地址修改为 tracker 所在服务时,即:http://192.168.10.30/group1/M00/00/00/wKgKIGLBE9CAAMlcAAAAKibWwMI230.txt , 发现无法访问,如下图,所以我们需要在 tracker 中同样安装 Nginx,以实现负载均衡和数据的访问功能

'xxs'

在 tracker 中安装 Nginx

将 Nginx安装包上传至linux30服务器,并解压到 /opt 目录下,执行编译安装

## 编译 Nginx
[root@linux30 nginx-1.23.0]# ./configure --prefix=/opt/fastdfs/fdfs_nginx
[root@linux30 nginx-1.23.0]# make
[root@linux30 nginx-1.23.0]# make install
[root@linux30 nginx-1.23.0]# cd /opt/fastdfs/fdfs_nginx && ll

'xxs'

配置 nginx.conf,添加如下内容

[root@linux30 fdfs_nginx]# vi conf/nginx.conf

        upstream storage_servers {
            server 192.168.10.32:80;
        }

        location /group1/M00 {
            proxy_pass  http://storage_servers;
        }

启动 Nginx

[root@linux30 fdfs_nginx]# ./sbin/nginx
[root@linux30 fdfs_nginx]# ps -ef|grep nginx

'xxs'

刷新浏览器,再次访问

http://192.168.10.30/group1/M00/00/00/wKgKIGLBE9CAAMlcAAAAKibWwMI230.txt

'xxs'

Spring Boot 整合 FastDFS

FastDFS java client SDK

使用maven从源码安装

下载源码到本地磁盘(E:\project),执行 git clone 命令

E:\project>git clone https://github.com/happyfish100/fastdfs-client-java.git

'xxs'

使用maven命令打成jar包

E:\project\fastdfs-client>mvn clean package

'xxs'

安装到maven仓库

E:\project\fastdfs-client>mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client -Dversion=v1.0 -Dpackaging=jar -Dfile=target/fastdfs-client-java-1.29-SNAPSHOT.jar

创建 Spring Boot 项目

在您的maven项目pom.xml中添加依赖

<dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>v1.0</version>
</dependency>

创建 fastdfs-client.properties 配置文件

######## FastDFS ######
fastdfs.connect_timeout_in_seconds=5
fastdfs.network_timeout_in_seconds=30
fastdfs.charset=UTF-8
fastdfs.http_anti_steal_token=false
# fastdfs.http_secret_key=FastDFS1234567890
fastdfs.http_tracker_http_port=80
fastdfs.tracker_servers=192.168.10.30:22122
# fastdfs.tracker_servers=10.0.11.201:22122,10.0.11.202:22122,10.0.11.203:22122
fastdfs.connection_pool.enabled=true
fastdfs.connection_pool.max_count_per_entry=500
fastdfs.connection_pool.max_idle_time=3600
fastdfs.connection_pool.max_wait_time_in_ms=1000

初始化 fastdfs-client.properties 配置文件、启动

'xxs'

文件的上传

'xxs'

文件的下载

'xxs'

文件的删除

'xxs'

总结

对于文件的操作需要使用 StorageClient,StorageClient的构造函数需要 TrackerServer 和 StorageServer,所以,我们首先通过加载配置文件,获取到 TrackerClient,再通过 TrackerClient获取 TrackerServer 和 StorageServer,最后通过 StorageClient 实现对文件的管理。

FastDFS高级特性

FastDFS 集群

上面介绍的FastDFS分布式文件系统还不满足高可用,没有对数据进行备份存储,存在单点故障问题。所以,接下来,我们需要真正的部署FastDFS的集群,实现FastDFS的高可用。并对其存储过程中的配置,特性进行详细分析。

FastDFS 集群部署

集群的架构图如下:

'xxs'

检查每台服务器是否已经下载了压缩包 fastdfs-6.08.tar.gz和必须的基础库 libfastcommon-1.0.58.tar.gz。

首先检查linux31(192.168.10.31)节点,需要下载FastDFS源码,创建项目目录:

## 创建项目目录
[root@linux31 opt]# mkdir -p /opt/projects
## 进入目录后,上传压缩包到该目录
[root@linux31 projects]# cd /opt/projects/
[root@linux31 projects]# ll
总用量 1024
-rw-r--r--. 1 root root 809448 8月  23 10:56 fastdfs-6.08.tar.gz
-rw-r--r--. 1 root root 235779 8月  23 10:56 libfastcommon-1.0.58.tar.gz
## 解压缩
[root@linux31 projects]# tar -zxvf fastdfs-6.08.tar.gz
[root@linux31 projects]# tar -zxvf libfastcommon-1.0.58.tar.gz

'xxs'

linux32节点之前安装过storage,无需重复下载。

'xxs'

重复上述步骤,在linux33(192.168.10.33)和linux34(192.168.10.34)服务器分别创建项目目录,上传源码

'xxs'

'xxs'

在编译之前,需要安装FastDFS依赖的环境,在每台服务器分别执行如下操作

[root@linux30 projects]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
[root@linux31 projects]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
[root@linux32 fastdfs]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
[root@linux33 projects]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl
[root@linux34 projects]# yum install gcc gcc-c++ libevent openssl openssl-devel pcre pcre-devel perl

'xxs'

接下来,在每台服务器分别进行编译、安装

linux30:

## 进入基础库目录,执行如下命令进行编译、安装
[root@linux30 libfastcommon-1.0.58]# ./make.sh
[root@linux30 libfastcommon-1.0.58]# ./make.sh install

## 进入fastdfs-6.08根目录,进行编译、安装
[root@linux30 fastdfs-6.08]# ./make.sh
[root@linux30 fastdfs-6.08]# ./make.sh install

linux31、linux32、linux33、linux34分别执行上述操作,进行编译、安装

'xxs'

安装成功之后,分别对 tracker 和 storage 进行配置,我们先配置 tracker

linux30节点:

## 配置 tracker.conf
[root@linux30 fdfs]# vi /etc/fdfs/tracker.conf
# 只需修改基础路径配置即可
base_path = /tmp/fastdfs/tracker

linux31节点:

配置 tracker.conf

[root@linux31 fastdfs-6.08]# vi /etc/fdfs/tracker.conf
base_path = /tmp/fastdfs/tracker


对于linux32、linux33、linux34作为storage,需要配置 /etc/fdfs目录下的 storage.conf

linux32和linux33属于同一个组 group1,分别修改配置文件如下:

[root@linux32 fdfs]# vi /etc/fdfs/storage.conf
base_path = /tmp/fastdfs/storage
store_path0 = /tmp/fastdfs/storage/files

# 集群配置
tracker_server = 192.168.10.30:22122
tracker_server = 192.168.10.31:22122

linux34的配置略有不同,配置如下:

[root@linux34 fdfs]# vi /etc/fdfs/storage.conf
# 组名为group2
group_name = group2
base_path = /tmp/fastdfs/storage
store_path0 = /tmp/fastdfs/storage/files
tracker_server = 192.168.10.30:22122
tracker_server = 192.168.10.31:22122

启动集群:

在linux30服务器启动tracker

[root@linux30 fdfs]# fdfs_trackerd /etc/fdfs/tracker.conf start

'xxs'

启动失败,启动前需要创建目录

[root@linux30 fdfs]# mkdir -p /tmp/fastdfs/tracker

再次启动,成功

'xxs'

在linux31服务器启动tracker

'xxs'

接下来启动 linux32、linux33、linux34服务器的storage

在linux32节点启动storage

[root@linux32 fdfs]# fdfs_storaged /etc/fdfs/storage.conf start

出现如下报错信息,需要提前创建目录

'xxs'

[root@linux32 fdfs]# mkdir -p /tmp/fastdfs/storage
[root@linux32 fdfs]# mkdir -p /tmp/fastdfs/storage/files

再次启动,成功

'xxs'

除此之外,linux33、linux34服务器的storage启动方式和上述操作步骤相同,这里不再赘述。

'xxs'

'xxs'

集群环境已经搭建成功,接下来启动 FastDFS客户端,上传文件测试:

'xxs'

文件上传成功,当我们频繁上传几次文件时,依然会将文件上传到组 group1,这是为什么呢?

此时需要查看 linux30服务器的tracker.conf配置情况:

'xxs'

如果想实现负载均衡,轮询的效果,该如何实现呢?

FastDFS 集群负载均衡

修改 linux30(192.168.10.30)和 linux31(192.168.10.31)服务器的tracker.conf配置文件,配置如下:

vi /etc/fdfs/tracker.conf

store_lookup = 0

'xxs'

重启两台 tracker服务

fdfs_trackerd /etc/fdfs/tracker.conf restart

'xxs'

修改配置文件,只让客户端连接到一台tracker

fastdfs.tracker_servers=192.168.10.30:22122

'xxs'

如果连接两台tracker,则在两个tracker之间会出现轮询的现象,不易发现文件上传时的负载均衡效果。

启动客户端服务,多次上传文件后,出现轮询效果,如图:

'xxs'

除此之外,如果想指定组进行上传,就容易多了。往下看…

FastDFS 集群指定组

这次,我们只修改 linux31(192.168.10.31)服务器的 tracker.conf 配置文件

'xxs'

重启tracker

[root@linux31 ~]# fdfs_trackerd /etc/fdfs/tracker.conf restart

'xxs'

修改客户端配置文件,连接到 linux31节点的tracker进行测试

'xxs'

测试成功,所有的文件都上传到了组group2

'xxs'

打开浏览器,选择上传成功的文件,拼接连接地址如下:

http://192.168.10.31/group2/M00/00/00/wKgKImMEf2mAM-SIAAAAEj1ApV0947.txt

'xxs'

无法访问此网站,所以接下来,需要安装 Nginx

安装Nginx

大家要注意,在每台服务器上安装的Nginx的作用略有不同。其中,linux30、linux31中的Nginx为负载均衡功能,linux32、linux33、linux34服务器中的Nginx会使用扩展模块访问文件。所以,在安装Nginx时,linux30、linux31可以直接上传 nginx-1.23.0.tar.gz安装包。而linux32、linux33、linux34三台服务器除此之外,还需要上传扩展 fastdfs-nginx-module 模块。

在linux30、linux31节点上传Nginx安装包并解压

'xxs'

在linux32、linux33、linux34上传Nginx安装包和扩展模块。解压缩后,如图所示:

'xxs'

在linux30、linux31节点编译、安装Nginx

[root@linux31 nginx-1.23.0]# ./configure --prefix=/opt/fastdfs/fdfs_nginx
[root@linux31 nginx-1.23.0]# make
[root@linux31 nginx-1.23.0]# make install
[root@linux31 nginx-1.23.0]# cd ../fastdfs/fdfs_nginx/

'xxs'

接下来在linux32、linux33、linux34编译、安装Nginx安装包和扩展模块

[root@linux33 nginx-1.23.0]# ./configure --prefix=/opt/fastdfs/fdfs_nginx --add-module=/opt/fastdfs/fastdfs-nginx-module-1.22/src
[root@linux33 nginx-1.23.0]# make
[root@linux33 nginx-1.23.0]# make install
[root@linux33 fdfs_nginx]# cd /opt/fastdfs/fdfs_nginx

'xxs'

至此,Nginx的编译、安装部分已经完成

配置Nginx:

在linux30、linux31节点分别配置 conf/nginx.conf

[root@linux30 fdfs_nginx]# vi conf/nginx.conf

location ~ /group[1-9]/M0[0-9] {
    proxy_pass  http://storage_servers;
}
upstream storage_servers {
    server 192.168.10.32:80;
    server 192.168.10.33:80;
    server 192.168.10.34:80;
}

启动nginx

[root@linux30 fdfs_nginx]# ./sbin/nginx
[root@linux30 fdfs_nginx]# ps -ef|grep nginx

'xxs'

接下来在linux32、linux33、linux34节点分别配置 conf/nginx.conf

[root@linux33 fdfs-nginx]# vi conf/nginx.conf

        location ~ /group[1-9]/M0[0-9] {
            ngx_fastdfs_module;
        }

执行如下命令,将扩展模块中的 mod_fastdfs.conf,拷贝到 /etc/fdfs/ 目录下

[root@linux33 src]# cp /opt/fastdfs/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[root@linux33 src]# cd /etc/fdfs/
[root@linux33 fdfs]# vi mod_fastdfs.conf
base_path=/tmp/fastdfs/mod-fastdfs
tracker_server=192.168.10.30:22122
tracker_server=192.168.10.31:22122
url_have_group_name = true
store_path0=/tmp/fastdfs/storage/files

include http.conf
http.mime_types_filename=/opt/fastdfs/fdfs-nginx/conf/mime.types
http.default_content_type=application/octet-stream

group_count = 2

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/tmp/fastdfs/storage/files

[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/tmp/fastdfs/storage/files

linux32和linux33属于同一个组group1,所以上面的配置也适合linux32。

linux34属于组group2,所以只需修改组的名称即可

[root@linux34 fdfs]# vi mod_fastdfs.conf
# the group name of the local storage server
group_name=group2

启动nginx

[root@linux34 fdfs_nginx]# ./sbin/nginx
[root@linux34 fdfs_nginx]# ps -ef|grep nginx

'xxs'

再次访问浏览器,访问成功

'xxs'

Tracker的高可用,轮询方式

同组内的存储服务器是负载均衡的

扩缩容的实现

数据的安全可靠

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

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

相关文章

《计算机系统与网络安全》第一章 计算机系统与网络安全概述

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

java的注解方式和xml方式这两种方式对数据库进行操作详解

首先需要引入mybatisplus包 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.1</version> </dependency>第一种注解方式&#xff1a;参数是通过#{}来接收的 p…

腾讯云服务-云点播:删除腾讯云点播录制的视频文件(保存在腾讯云是需要收费的)

文档地址&#xff1a;登录 - 腾讯云https://console.cloud.tencent.com/api/explorer?Productvod&Version2018-07-17&ActionDeleteMedia 使用python后端删除&#xff1a; import json from tencentcloud.common import credential from tencentcloud.common.profile…

kafka入门,数据有序、数据乱序(十)

数据有序 数据乱序 max.in.flight.requests.per.connection指定了生产者在接收到服务器相应之前可以发送多个消息。 kafka在1.x版本之前保证单分区有序&#xff0c;条件如下 max.in.flight.requests.per.connection1 2) kafka在1.x及以后版本保证数据单区间分区有序&#xff0…

vue 函数式(编程式) render (functional:true)

文章目录 一、文档二、区别三、使用h函数的参数解释&#xff1a;参数一&#xff1a;使用导入的组件名 参数二&#xff1a;绑定css绑定事件往组件里面传递参数动态绑定值props动态绑定值datafunctional:true到底是做什么的&#xff1f;动态绑定props 非functional:true版本 参数…

JSONUtil.toJsonStr 时间变成了时间戳

问题描述 我的接口是以Date来接收日期的&#xff0c;然后我在拿到这个对象参数后&#xff0c;通过hutool当中的JSONUtil.toJsonStr将其序列化成json字符串&#xff0c;然后存储到数据库。然后存储到数据库当中发现这个字段是时间戳。 DateTimeFormat和JsonFormat 前者是控制 请…

动态规划详解Python

动态规划 动态规划&#xff08;Dynamic Programming&#xff09;是一种用于解决复杂问题的算法设计方法。它通常用于优化问题&#xff0c;其中问题可以被分解成一系列重叠子问题&#xff0c;通过存储并重复使用已经解决过的子问题的解&#xff0c;可以避免重复计算&#xff0c…

区块链的简单认识

比特币作为区块链的应用&#xff0c;让区块链广为人知&#xff0c;如果比特币作为第一代区块链&#xff0c;则以太坊则称为第二代区块链。我们知道&#xff0c;区块链的最主要目的就是去中心化&#xff0c;比特币则成为了decentralized currency&#xff0c;去中心化在技术上依…

跨注册中心服务同步实践

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

助你丝滑过度到 Vue3 创建工程 ②③

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…

同城跑腿独立版小程序 码科跑腿小程序 支持用户端 骑手端

是独立版哦&#xff0c;不是微擎的 搭建有点复杂&#xff0c;只要一步错就会导致骑手端来单没有声音提示. 多的也不介绍了&#xff0c;不知道的朋友可以百度一下码科跑腿就知道了&#xff01;

机器学习李宏毅学习笔记33

文章目录 前言一、神经网络压缩二、Network pruning----一种network compression技术1.移除不同单位的区别2.大乐透假说 总结 前言 神经网络压缩&#xff08;一&#xff09; 类神经网络剪枝&#xff08;pruning&#xff09; 一、神经网络压缩 简化模型&#xff0c;用比较少的…

netty_客户端和服务端,定长数据输出案例

步骤1&#xff1a;创建server import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channe…

美团小游戏守卫羊村玩法介绍和游戏漏洞

序言 这款游戏是一个解压小游戏&#xff0c;是我在闲暇时发现的&#xff0c;然后就使用它来度过无聊的碎片化时间。这是一款传统的塔防类游戏&#xff0c;建议大家可以试试&#xff0c;玩法有很多种&#xff0c;当然它的游戏优化还是不太行&#xff0c;建议多优化优化。 玩法…

十二、Jenkins构建完成发送飞书消息通知

十二、Jenkins构建完成发送飞书消息通知 1. 创建一个飞书webhook 群机器人 得到一个飞书webhook地址&#xff1a; https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e 2. send_notice.py上传到jenkins服务器目录 send_notice.py最后面 代码…

移动硬盘中安装Ubuntu 20.04系统——立省99%的问题

目录 关于我为什么要在移动硬盘中装系统 准备工作 开始安装 磁盘分区 创建虚拟机 关于我为什么要在移动硬盘中装系统 (6条消息) 笔记本安装双系统ubuntu时踩的坑——戴尔_放风筝的猪的博客-CSDN博客 准备工作 1.移动硬盘 2.Ubuntu镜像 3.VMware虚拟机 Ubuntu镜像可以从…

Linux查看版本号,lsb_releasa过时了,得用uname -a

突然想查看Linux版本号了 然后终端输入lsb_release,结果给我报错No LSB modules are available. 然后网上一查发现Linux 版本是 Ubuntu 11.1.0 或更高版本,则 lsb_release 命令可能已经被弃用。 这是由于 lsb-release 命令已经不再维护,并且由于安全问题而被移除。 因此,对于…

基于matlab使用迭代最近点算法组合多个点云以重建三维场景(附源码)

一、前言 此示例演示如何使用迭代最近点 &#xff08;ICP&#xff09; 算法组合多个点云以重建三维场景。 此示例将使用 Kinect 捕获的点云集合拼接在一起&#xff0c;以构建场景的更大三维视图。该示例将 ICP 应用于两个连续的点云。这种类型的重建可用于开发对象的 3D 模型…

关于Realvnc远程Aero效果异常解决方案

默认安装realvnc server后&#xff0c;远程时如下图所示&#xff0c;windows areo效果丢失且提示“配色方案已经更改为windows 7 basic”&#xff1b; 解决方案&#xff1a;取消勾选&#xff0c;user mirror drive to capture screen 在远程时效果恢复如下&#xff1a;

类中的函数重载

函数重载回顾 函数重载的本质为相互独立的不同函数 C 中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的成员函数可以进行重载 构造函数的重载 普通成员函数的重载 静态成员函数的重载 问题 全局…