FastDFS

1、介绍

FastDFS是基于http协议的分布式文件系统,其设计理念是一切从简。主要解决了海量数据存储的问题,特别适合系统中的中小文件的存储和在线服务。中小文件的范围大致为4KB-500MB之间。

2、 FastDFS的组件以及工作原理

在FastDFS分布式文件存储系统中,由三种角色组成,分别是:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

  • 跟踪服务器主要是做调度工作,担负起负载均衡的作用,跟踪服务器主要负责管理所有的存储服务器,以及服务器的分组情况,存储服务器启动后会与跟踪服务器保持链接,并进行周期性的信息同步。
  • 存储服务器,顾名思义就是用于存储数据的服务器,主要提供存储容量和备份服务,存储服务器为了保证数据安全,会多台服务器组成一个组,称为group,同一个组中的数据互相备份。
  • 客户端:主要负责上传和下载文件数据,客户端所部署的机器就是实际项目部署所在的机器。

3、文件上传过程

(1)存储服务器会定期向跟踪服务器发送自己的存储信息。

(2)当跟踪服务器收到客户端上传请求时,跟踪服务器会查询可用的存储服务器信息,并将查到的信息返回给客户端。

(3)客户端收到信息后,进行连接存储服务器,并将文件上传到存储服务器上,存储服务器生成一个文件ID,并将文件进行存储。将文件ID,组名,路径信息等返回给客户端。

(4)客户端自行保存存储信息,下载时候需要用。

4、文件下载过程

(1)存储服务器会定期向跟踪服务器发送自己的存储信息。

(2)客户端向跟踪器发起下载请求,跟踪器查询存储器,并将存储器的信息返回给客户端

(3)客户端连接存储器,并将文件ID,组名,路径等等信息发送给存储器。

(4)存储器查找文件,并将文件返回给客户端。

5、FastDFS集群

每个 Tracker 节点地位平等,收集 Storage 集群的状态。 工作方式是轮询。为了避免单点故障。

实际保存文件 Storage 分为多个组,每个组之间保存的文件是不同的,每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。不同组的主机之间不通讯。

安装FastDFS

1、下载libfastcommon并安装

libfastcommon是由FastDFS官方提供的软件库,其中包含了运行FastDFS所需的一些基础库。

git clone https://github.com/happyfish100/libfastcommon.git

下载完成以后,进入libfastcommon目录,并运行make.sh脚本进行编译

cd libfastcommon
./make.sh

编译完成后,进行安装

./make.sh install

2、下载FastDFS并安装

git clone https://github.com/happyfish100/fastdfs.git

和上面的步骤相同,进入fastdfs目录,运行make.sh脚本进行编译

cd fastdfs/
./make.sh

编译完成后,进行安装

./make.sh install

3、配置

在配置之前,我们需要在~目录下创建一个data目录,在data目录下分别创建fastdfs以及fastdfs_storage目录。

fastdfs目录主要存放生成的一些日志文件,fastdfs_storage目录主要存放我们的文件。

.

├── fastdfs

└── fastdfs_storage

fastDFS的配置文件默认存储目录: /etc/fdfs

.

├── client.conf.sample

├── storage.conf.sample

├── storage_ids.conf.sample

└── tracker.conf.sample

我们主要配置的是 client.conf.sample, storage.conf.sample,tracker.conf.sample这三个文件,我们分别进行对其复制并改名。

cp tracker.conf.sample tracker.conf
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
  • 配置tracker
vim tracker.conf

bind_addr =    // 追踪器对应的主机的IP地址,如果不写,会自动绑定本机的ip,如果是云服务器,空着就行
port=22122 //追踪器绑定的端口,只要是一个空闲的没有被占用的端口就可以,这里采用默认
base_path=/root/data/fastdfs
//追踪器存储log日志或者一些进程文件相关的目录,对应的路径必须要存在,这里填写我们创建的目录路径
http.server_port = 80 // http服务端口改成80
  • 配置storage
vim sorage.conf

group_name=group1  #当前存储节点所属的组,横向扩容还是纵向扩容, 是通过该属性控制的
bind_addr= #存储节点的IP地址,如果不写, 会自动绑定本机IP地址
port=23000 #客户端连接存储节点是时候使用的
base_path = /root/data/fastdfs_storage #存储节点存储log日志的目录,这个目录必须存在
store_path_count=2 #存储节点上, 存储文件的路径个数,一块硬盘对应一个存储路径就可以
store_path0=/root/data/fastdfs_storage # 存储文件的具体目录
tracker_server=123.56.243.64:22122 # 连接的追踪器的地址,这里填公网的ip
tracker_server=123.56.243.64:22122 #追踪去集群的声明方式
  • 配置client
base_path = /root/data/fastdfs  # 客户端写日志的地方
tracker_server = 123.56.243.64:22122 # 客户端要连接追踪器的地址

4、使用

  • tracker
fdfs_trackerd /etc/fdfs/tracker.conf   # 启动
fdfs_trackerd /etc/fdfs/tracker.conf stop # 停止
fdfs_trackerd /etc/fdfs/tracker.conf restart # 重启
  • storage
fdfs_storaged /etc/fdfs/storage.conf  # 启动
fdfs_storaged /etc/fdfs/storage.conf stop # 停止
fdfs_storaged /etc/fdfs/storage.conf restart # 重启

追踪服务器和存储服务器启动后,我们可以使用ps命令或者netstat命令进行查看

netstat -unltp|grep fdfs 

tcp     0    0 0.0.0.0:22122      0.0.0.0:*     LISTEN   12980/fdfs_trackerd
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 13515/fdfs_storaged
  • client
# 上传,会返回文件ID
fdfs_upload_file /etc/fdfs/client.conf 文件名
fdfs_upload_file /etc/fdfs/client.conf timg.jfif #timg.jfif是我上传的文件,返回文件ID group1/M00/00/00/ezjzQF_DoZ6ALKrwAACT29kipjA39.jfif
# group1 文件上传到哪个组
# MOO store_path0 # 下载
fdfs_download_file /etc/fdfs/client.conf 文件ID

Nginx和fastDFS整合

1、安装Nginx

git clone https://github.com/happyfish100/fastdfs-nginx-module.git  # 下载配置模块
wget -c https://nginx.org/download/nginx-1.10.1.tar.gz # 下载nginx # 安装nginx之前需要安装一些依赖环境
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel tar -zxvf nginx-1.10.1.tar.gz # 解压安装包
cd nginx-1.10.1
./configure --add-module=/root/fastdfs-nginx-module/src/ make && make install # 安装完成后,查看版本
/usr/local/nginx/sbin/nginx -V

2、配置fastdfs-nginx-module和Nginx

进入到fastdfs-nginx-module/src目录下,将mod_fastdfs.conf复制到/etc/fdfs目录下。并修改配置项。

cp mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf tracker_server=123.56.243.64:22122 # 修改成最终服务器的地址
storage_server_port=23000 # 存储服务器端口
url_have_group_name = true # 可以使用url进行访问
store_path0=/root/data/fastdfs_storage # 文件存储路径

拷贝http.conf和mime.types文件到/etc/fdfs目录(需要从fastdfs源码安装目录中找)

cd fastdfs/conf
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/

修改Nginx的配置文件,配置Nginx

vim /usr/local/nginx/conf/nginx.conf

user root;
...
server {
listen 80;
server_name 123.56.243.64; # 此处写公网IP,如果是虚拟机,则使用默认localhost #charset koi8-r; #access_log logs/host.access.log main; location / {
root html;
index index.html index.htm;
} location /group1/M00 {
root /root/data/fastdfs_storage; # fastDFS存储文件目录
ngx_fastdfs_module; # 与fastDFS存储节点进行通信 }
...
}

3、启动Nginx以及测试

/usr/local/nginx/sbin/nginx  # 启动nginx

fdfs_test /etc/fdfs/client.conf upload timg.jfif   # 上传文件进行测试,返回url,在浏览器上访问下载

Golang与FastDFS交互

我们可以使用代码实现上传,下载,删除功能

1、安装fastdfs的golang库

go get github.com/tedcy/fdfs_client

2、编写配置文件

tracker_server=123.56.243.64:22122
maxConns=100
http_server_port=http://123.56.243.64:80

说明:tracker_server就是我们跟踪服务器的地址(必须有)

​ maxConns 最大连接数(必须有)

​ http_server_port根据自己需求,此处为了方便拼接返回值。(返回一个可以下载文件的url)

3、代码

package tool

import (
"bufio"
"fmt"
"github.com/tedcy/fdfs_client"
"os"
"strings"
) // 上传文件到fastDFS系统
func UploadFile(fileName string)string{
client, err := fdfs_client.NewClientWithConfig("./config/fastdfs.conf")
if err != nil{
fmt.Println("打开fast客户端失败",err.Error())
return ""
}
defer client.Destory()
fileId, err := client.UploadByFilename(fileName)
if err != nil{
fmt.Println("上传文件失败",err.Error())
return ""
}
return fileId
} // 下载文件
func DownLoadFile(fileId,tempFile string){
client, err := fdfs_client.NewClientWithConfig("./config/fastdfs.conf")
if err != nil{
fmt.Println("打开fast客户端失败",err.Error())
return
}
defer client.Destory()
if err = client.DownloadToFile(fileId,tempFile,0,0);err != nil{
fmt.Println("下载文件失败", err.Error())
return
}
} // 删除
func DeleteFile(fileId string){
client, err := fdfs_client.NewClientWithConfig("./config/fastdfs.conf")
if err != nil{
fmt.Println("打开fast客户端失败",err.Error())
return
}
defer client.Destory()
if err = client.DeleteFile(fileId);err != nil{
fmt.Println("删除文件失败", err.Error())
return
}
} // 从配置文件中读取服务器的ip和端口配置
func FileServerAddr() string{
file,err := os.Open("./config/fastdfs.conf")
if err != nil{
fmt.Println(err)
return ""
}
reader := bufio.NewReader(file)
for{
line, err := reader.ReadString('\n')
line = strings.TrimSpace(line)
if err != nil{
return ""
}
line = strings.TrimSuffix(line,"\n")
str := strings.SplitN(line,"=",2)
switch str[0] {
case "http_server_port":return str[1]
}
}
}

Python与FastDFS交互

说明:Python与FastDFS交互是在Django框架下完成。

1、安装fastdfs库

pip install fdfs-client-py==1.2.6

2、修改setting.py文件

# 设置Django的文件存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage' # 具体以路径以及类名为主 # 设置fdfs使用的client.conf文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf' # 请根据自己实际路径编写 # 设置fdfs存储服务器上nginx的IP和端口号
FDFS_URL = 'http://123.56.243.64:80'

3、编写client配置文件

# connect timeout in seconds
# default value is 30s
connect_timeout=30 # network timeout in seconds
# default value is 30s
network_timeout=60 # the base path to store log files
base_path=E:\Pesticide\utils\fdfs # tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
tracker_server=10.35.166.81:22122 #standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info # if use connection pool
# default value is false
# since V4.05
use_connection_pool = false # connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600 # if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false # if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false # specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf #HTTP settings
http.tracker_server_port=80 #use "#include" directive to include HTTP other settiongs
##include http.conf

4、代码

from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client class FDFSStorage(Storage):
'''fast dfs文件存储类'''
def __init__(self, client_conf=None, base_url=None):
'''初始化'''
if client_conf is None:
client_conf = settings.FDFS_CLIENT_CONF
self.client_conf = client_conf if base_url is None:
base_url = settings.FDFS_URL
self.base_url = base_url def _open(self, name, mode='rb'):
'''打开文件时使用'''
pass def _save(self, name, content):
'''保存文件时使用'''
# name:你选择上传文件的名字
# content:包含你上传文件内容的File对象 # 创建一个Fdfs_client对象
client = Fdfs_client(self.client_conf) # 上传文件到fastdfs系统中
res = client.upload_by_buffer(content.read()) # dict
# {
# 'Group name': group_name,
# 'Remote file_id': remote_file_id,
# 'Status': 'Upload successed.',
# 'Local file name': '',
# 'Uploaded size': upload_size,
# 'Storage IP': storage_ip
# }
if res.get('Status') != 'Upload successed.':
# 上传失败
raise Exception('上传文件到fast dfs失败') # 获取返回的文件ID
filename = res.get('Remote file_id') return filename def exists(self, name):
'''Django判断文件名是否可用'''
return False def url(self, name):
'''返回访问文件的url路径'''
return self.base_url+name

FastDFS分布式文件服务器搭建以及Golang和Python调用的更多相关文章

  1. FastDFS分布式文件服务器

    5.分布式文件服务器FastDFS(阿里巴巴) 5.1什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制,充分考虑了冗余备份.负载均衡 ...

  2. FastDFS 分布式文件系统搭建

    安装依赖环境yum install make cmake gcc gcc-c++ pcre-devel zlib-devel perl-devel 安装libfastcommon-master.zip ...

  3. Linux - 搭建FastDFS分布式文件系统

    1. FastDFS简介 说明:FastDFS简介部分的理论知识全部来自于博主bojiangzhou的 <用FastDFS一步步搭建文件管理系统>,在此感谢博主的无私分享.当然最最要感谢的 ...

  4. 分布式文件服务器FastDFS的使用

    分布式项目中涉及到的文件上传与下载,此时使用之前的上传方式,将上传的文件与当前项目所在服务器放在同一个位置,显然不符合分布式项目的理念,此时我们借助FastDFS将上传的文件数据存储到单纯的一个服务器 ...

  5. 基于【 centos7】三 || 分布式文件系统FastDFS+Nginx环境搭建

    1. FastDFS介绍 1.1 FastDFS定义 FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用 ...

  6. FastDFS分布式图片服务器搭建

    一:Fastdfs简介 1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注 ...

  7. 分布式文件系统FastDFS简介、搭建、与SpringBoot整合实现图片上传

    之前大学时搭建过一个FastDFS的图片服务器,当时只是抱着好奇的态度搭着玩一下,当时搭建采用了一台虚拟机,tracker和storage服务在一台机器上放着,最近翻之前的博客突然想着在两台机器上搭建 ...

  8. 简单搭建FastDFS分布式文件系统(简单易懂)

    一.什么是FastDFS FastDFS一个开源的轻量级分布式文件系统,它对文件进行管理,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,功能包括:文件存储.文件同步.文件访 ...

  9. 07.Linux系统-Fastdfs分布式文件系统-互为主从配置搭建部署

    Fastdfs分布式文件系统-互为主从配置部署 1.安装基础依赖 yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl ...

  10. docker安装部署、fastDFS文件服务器搭建与springboot项目接口

    一.docker安装部署 1.更新yum包:sudo yum update 2.安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动 ...

随机推荐

  1. 用DeepSeek+可灵AI+剪映制作哪吒2走T台秀AI视频 (保姆级教程)

    内容首发周老师的付费社群,挑其中部分内容免费同步给公号读者 今天给大家分享如何利用DeepSeek这类AI工具,制作哪吒2走T台秀视频,保姆级的制作方法,简单易懂,小白也能轻松上手. 关键操作,分为四 ...

  2. php 过滤掉emoji表情

    <?php function filter_emoji($str) { $str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换 '/./u ...

  3. 130道基础OJ编程题之: 89~107

    130道基础OJ编程题之: 89~107 @ 目录 130道基础OJ编程题之: 89~107 89. BC101 班级成绩输入输出 99. BC102 矩阵元素定位 100. BC103 序列重组矩阵 ...

  4. 使用Avalonia/C#构建一个简易的跨平台MCP客户端

    前言 前几天介绍了在C#中构建一个MCP客户端. 最近正在学习Avalonia,所以就想用Avalonia实现一个简易的跨平台MCP客户端.接入别人写的或者自己写的MCP服务器就可以利用AI做很多有意 ...

  5. 使用Shader画常见的数学函数

    使用Shader画常见的数学函数 本篇博文的灵感来自于Shader Books这一小节:https://thebookofshaders.com/05/?lan=ch 代码运行网站:http://ed ...

  6. BUUCTF---Morse

    1.题目 -..../.----/-..../-..../-..../...--/--.../....-/-..../-..../--.../-.../...--/.----/--.../...--/ ...

  7. Java容器集合经典面试题集

    目录 概述类面试题 1. 请说一下Java容器集合的分类,各自的继承结构 2. 请谈一谈Java集合中的fail-fast和fail-safe机制 3. 如何一边遍历一边删除Collection中的元 ...

  8. (原创)[开源][.Net Framework 4.5] SimpleMVVM(极简MVVM框架)更新 v1.1,增加NuGet包

    一.前言 意料之外,也情理之中的,在主业是传统行业的本人,技术的选型还是落后于时代. 这不,因现实需要,得将大库中的 WPF MVVM 相关部分功能拆分出来独立使用,想着来都来了,就直接开源得了,顺便 ...

  9. 使用Python解决Logistic方程

    引言 在数学和计算机科学中,Logistic 方程是描述人口增长.传播过程等现象的一种常见模型.它通常用于表示一种有限资源下的增长过程,比如动物种群.疾病传播等.本文将带领大家通过 Python 实现 ...

  10. Spring 的 resolveBeforeInstantiation 方法作用详解

    一.定义 resolveBeforeInstantiation 是 Spring 框架中 AbstractAutowireCapableBeanFactory 类的核心方法之一,它在 Bean 的实例 ...