常见分布式文件系统
常见分布式文件系统比较
常见的分布式文件系统有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 三个结点。
指标 | HDFS | GlusterFS | Ceph | TFS | FastDFS |
---|---|---|---|---|---|
开发语言 | Java | C | C++ | C++ | C |
复杂度 | 简单 | 简单 | 复杂 | 复杂 | 简单 |
在线扩容 | 支持 | 支持 | 支持 | 支持 | 支持 |
冗余备份 | 支持 | 支持 | 支持 | 支持 | 支持 |
单点故障 | 不存在 | 不存在 | 不存在 | 存在 | 不存在 |
易用性 | 安装简单,官方文档专业化 | 安装简单,官方文档专业化 | 安装简单,官方文档专业化 | 安装复杂,官方文档少 | 安装简单,社区相对活跃 |
适用场景 | 适合存储大文件 | 跨集群云存储 | 单集群的大中小文件 | 跨集群的小文件 | 单集群的中小文件 |
分布式文件系统需要满足的要求
对一个分布式文件系统而言,有一些特性是必须要满足的,否则就无法有竞争力。主要如下:
- 应该符合 POSIX 的文件接口标准,使该系统易于使用,同时对于用户的遗留系统也无需改造;
- 对用户透明,能够像使用本地文件系统那样直接使用;
- 持久化,保证数据不会丢失;
- 具有伸缩性,当数据压力逐渐增长时能顺利扩容;
- 具有可靠的安全机制,保证数据安全;
- 数据一致性,只要文件内容不发生变化,什么时候去读,得到的内容应该都是一样的。
除此之外,还有些特性是分布式加分项,具体如下:
- 支持的空间越大越好;
- 支持的并发访问请求越多越好;
- 性能越快越好;
- 硬件资源的利用率越高越合理,就越好。
分布式文件系统的架构模型
从业务模型和逻辑架构上,分布式文件系统需要这几类组件:
- 存储组件:负责存储文件数据,它要保证文件的持久化、副本间数据一致、数据块的分配 / 合并等等;
- 管理组件:负责 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。
Tracker
tracker负责文件访问的调度和负载均衡,跟踪程序或存储群集中的服务器可以随时添加到群集中或从集群中删除,而不会影响在线服务。tracker集群中的服务器是对等的,可以根据服务器的压力情况随时增加或减少。Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
Storage
storage 负责存储文件,其功能是文件管理,包括:文件存储、文件同步、提供文件访问接口。它还管理元数据,这些元数据表示为文件键值对的属性。例如:name = “大都督”,其中 key为name,value为 大都督。文件元数据是文件属性列表,可以包含多个键值对。
存储服务器按文件卷/组进行组织以获得高容量,存储系统包含一个或多个卷,其文件独立于这些卷。整个存储系统的容量等于所有卷的容量之和。文件卷包含一个或多个存储服务器,这些服务器中的文件相同。文件卷中的服务器相互备份,所有这些服务器都是负载均衡的。将存储服务器添加到卷时,此卷中已有的文件将自动复制到此新服务器,复制完成后,系统将联机切换此服务器以提供存储服务。
当整个存储容量不足时,可以添加一个或多个卷以扩展存储容量。为此,您需要添加一个或多个存储服务器。
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
tracker 和 storage 包含一个或多个服务器。
用户列表
UC
支付宝
京东商城
赶集网
迅雷
除此之外,还有 58 同城等等。
FastDFS 架构
Client为使用FastDFS服务的调用方,并且也是一台服务器,它对tracker和storage的调用均为服务器间的调用。存储服务器采用分组方式,同组内的存储服务器上的文件完全相同。不同组的storage server之间不会相互通信。由storage server主动向tracker server报告状态信息,tracker server之间不会相互通信。
上传交互过程
- client询问tracker上传到的storage,不需要附加参数;
- tracker返回一台可用的storage;
- client直接和storage通讯完成文件上传。
客户端上传文件后,存储服务器将 文件ID 返回给客户端,此文件ID用于以后访问该文件的索引信息。
文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
**组名:**文件上传后所在的storage组名称,在文件上传成功后由storage服务器返回,需要客户端自行保存。
**虚拟磁盘路径:**storage配置的虚拟路径,与磁盘选项store_path对应。如果配置了store_path0,则虚拟路径是M00,如果配置了store_path1,则虚拟路径是M01,以此类推。
**数据两级目录:**storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
**文件名:**与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
下载交换过程
- client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
- tracker返回一台可用的storage;
- client直接和storage通讯完成文件下载。
tracker 通过组名/卷名能够很快的定位到客户端需要访问的存储服务器组,并选择合适的存储服务器提供客户端访问。
storage 根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
文件的标识由两部分组成:卷名和文件名,二者缺一不可。
FastDFS 搭建
部署规划
部署程序 | 集群/组 | 主机名称/IP | 描述 |
---|---|---|---|
tracker 1 | tracker cluster | linux30/192.168.10.30 | tracker 高可用 |
tracker 2 | tracker cluster | linux31/192.168.10.31 | tracker 高可用 |
storage 1 | storage server group 1 | linux32/192.168.10.32 | storage 线性扩展 |
storage 2 | storage server group 1 | linux33/192.168.10.33 | storage 线性扩展 |
storage 3 | storage server group 2 | linux34/192.168.10.34 | storage 线性扩展 |
storage 4 | storage server group 2 | linux35/192.168.10.35 | storage 线性扩展 |
由于使用Nginx提供文件的浏览访问功能,同时也需要安装Nginx服务。
环境准备
JDK1.8 安装
可以通过如下命令查看是否已经安装 JDK1.8 版本
[root@linux30 ~]# java -version
Apache Maven 3.6.1 安装
可以通过如下命令查看是否已经安装 Maven
[root@linux30 ~]# mvn -v
Git 安装
可以通过如下命令查看是否已经安装 Git
[root@linux30 ~]# git --version
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
如果由于网络问题导致无法使用git下载源码,则手动到官方地址下载压缩包 fastdfs-6.08.tar.gz
安装FastDFS需要编译依赖gcc环境,如果没有gcc环境,需要安装gcc
[root@linux30 projects]# yum install gcc-c++
libevent 安装
FastDFS依赖libevent库,安装命令如下:
[root@linux30 projects]# yum -y install libevent
libfastcommon 安装
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。下载 libfastcommon-1.0.58.tar.gz安装包,进行解压
[root@linux30 projects]# tar -zxvf libfastcommon-1.0.58.tar.gz
[root@linux30 libfastcommon-1.0.58]# ./make.sh
[root@linux30 libfastcommon-1.0.58]# ./make.sh install
安装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
配置 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
安装Storage
启动 linux32/192.168.10.32 虚拟机,同样需要安装 libevent、libfastcommon-1.0.58.tar.gz 以及下载 fastdfs-6.08.tar.gz 安装包,安装方法同Tracker。
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
当我们在编译过程中遇到如下报错时,是因为系统中缺少相关的运行环境,所以需要执行以下命令后,再重新编译安装
## 安装运行环境
[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
启动失败,查看日志如下:
[root@linux32 fdfs]# cd /opt/fastdfs/storage/
[root@linux32 storage]# cat logs/storaged.log
需要创建 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
使用 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.
使用 fdfs_test 命令上传文件,其使用方法如图所示
执行上传文件命令
[root@linux30 fdfs]# fdfs_test /etc/fdfs/client.conf upload test.txt
返回的结果如下:
## 组名称
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
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
登录 storage 服务器(linux32/192.168.10.32),查看是否删除成功
[root@linux32 00]# cd /tmp/fastdfs/storage/files/data/00/00
[root@linux32 00]# ll
确实已经将 wKgKIGK-gTuAMA0UAAAAKibWwMI239.txt 文件删除了,但还有一个备份文件,我们能不能在浏览器访问一下呢?记得之前返回响应是:
example file url: http://192.168.10.32/group1/M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239_big.txt
无法访问此网站,所以我们需要安装 Nginx
安装 Nginx
在 storage 中安装 Nginx
找到 Nginx下载网址,下载 相应的安装包,这里我们选择 nginx-1.23.0.tar.gz安装包,上传到 linux32 服务器,解压缩
[root@linux32 opt]# tar -zxvf nginx-1.23.0.tar.gz
在编译安装 Nginx 之前,需要下载 fastdfs-nginx-module 模块,下载成功后,上传至linux32服务器,并解压
接下来,可以编译安装 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
配置 conf/nginx.conf 文件,添加如下内容
location /group1/M00 {
ngx_fastdfs_module;
}
测试配置没问题
在启动 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
再次访问
example file url: http://192.168.10.32/group1/M00/00/00/wKgKIGK-gTuAMA0UAAAAKibWwMI239_big.txt
访问 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,以实现负载均衡和数据的访问功能
在 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
配置 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
刷新浏览器,再次访问
http://192.168.10.30/group1/M00/00/00/wKgKIGLBE9CAAMlcAAAAKibWwMI230.txt
Spring Boot 整合 FastDFS
FastDFS java client SDK
使用maven从源码安装
下载源码到本地磁盘(E:\project),执行 git clone 命令
E:\project>git clone https://github.com/happyfish100/fastdfs-client-java.git
使用maven命令打成jar包
E:\project\fastdfs-client>mvn clean package
安装到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 配置文件、启动
文件的上传
文件的下载
文件的删除
总结
对于文件的操作需要使用 StorageClient,StorageClient的构造函数需要 TrackerServer 和 StorageServer,所以,我们首先通过加载配置文件,获取到 TrackerClient,再通过 TrackerClient获取 TrackerServer 和 StorageServer,最后通过 StorageClient 实现对文件的管理。
FastDFS高级特性
FastDFS 集群
上面介绍的FastDFS分布式文件系统还不满足高可用,没有对数据进行备份存储,存在单点故障问题。所以,接下来,我们需要真正的部署FastDFS的集群,实现FastDFS的高可用。并对其存储过程中的配置,特性进行详细分析。
FastDFS 集群部署
集群的架构图如下:
检查每台服务器是否已经下载了压缩包 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
linux32节点之前安装过storage,无需重复下载。
重复上述步骤,在linux33(192.168.10.33)和linux34(192.168.10.34)服务器分别创建项目目录,上传源码
在编译之前,需要安装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
接下来,在每台服务器分别进行编译、安装
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分别执行上述操作,进行编译、安装
安装成功之后,分别对 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
启动失败,启动前需要创建目录
[root@linux30 fdfs]# mkdir -p /tmp/fastdfs/tracker
再次启动,成功
在linux31服务器启动tracker
接下来启动 linux32、linux33、linux34服务器的storage
在linux32节点启动storage
[root@linux32 fdfs]# fdfs_storaged /etc/fdfs/storage.conf start
出现如下报错信息,需要提前创建目录
[root@linux32 fdfs]# mkdir -p /tmp/fastdfs/storage
[root@linux32 fdfs]# mkdir -p /tmp/fastdfs/storage/files
再次启动,成功
除此之外,linux33、linux34服务器的storage启动方式和上述操作步骤相同,这里不再赘述。
集群环境已经搭建成功,接下来启动 FastDFS客户端,上传文件测试:
文件上传成功,当我们频繁上传几次文件时,依然会将文件上传到组 group1,这是为什么呢?
此时需要查看 linux30服务器的tracker.conf配置情况:
如果想实现负载均衡,轮询的效果,该如何实现呢?
FastDFS 集群负载均衡
修改 linux30(192.168.10.30)和 linux31(192.168.10.31)服务器的tracker.conf配置文件,配置如下:
vi /etc/fdfs/tracker.conf
store_lookup = 0
重启两台 tracker服务
fdfs_trackerd /etc/fdfs/tracker.conf restart
修改配置文件,只让客户端连接到一台tracker
fastdfs.tracker_servers=192.168.10.30:22122
如果连接两台tracker,则在两个tracker之间会出现轮询的现象,不易发现文件上传时的负载均衡效果。
启动客户端服务,多次上传文件后,出现轮询效果,如图:
除此之外,如果想指定组进行上传,就容易多了。往下看…
FastDFS 集群指定组
这次,我们只修改 linux31(192.168.10.31)服务器的 tracker.conf 配置文件
重启tracker
[root@linux31 ~]# fdfs_trackerd /etc/fdfs/tracker.conf restart
修改客户端配置文件,连接到 linux31节点的tracker进行测试
测试成功,所有的文件都上传到了组group2
打开浏览器,选择上传成功的文件,拼接连接地址如下:
http://192.168.10.31/group2/M00/00/00/wKgKImMEf2mAM-SIAAAAEj1ApV0947.txt
无法访问此网站,所以接下来,需要安装 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安装包并解压
在linux32、linux33、linux34上传Nginx安装包和扩展模块。解压缩后,如图所示:
在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/
接下来在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
至此,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
接下来在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
再次访问浏览器,访问成功
Tracker的高可用,轮询方式
同组内的存储服务器是负载均衡的
扩缩容的实现
数据的安全可靠