FastDFS - 分布式文件系统,结合nginx在python和Django框架中的应用

本文详细介绍了FastDFS,一种用C语言编写的开源分布式文件系统。它能够轻松搭建高性能的文件服务器集群,提供文件上传和下载服务,并支持冗余备份、负载均衡等功能。文中还介绍了其组成部分、工作原理及如何在Django框架中结合nginx使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

c语言编写,开源的分布式文件系统
充分考虑了冗余备份,负载均衡,线性扩容等机制
很容易搭建一套高性能的文件服务器集群提供文件下载和上传服务。

组成

● Tracker server
● Storage server

客户端请求向 Tracker server 进行文件的上传和下载,Tracker server 调度后最终由 Storage server 完成文件的下载和上传

作用

● Tracker server

负载均衡和调度,在文件上传时Tracker server 根据一些策略找到Storage server 提供文件上传服务。又叫做追踪服务器或调度服务器

·

● Storage server

文件存储,客户端上传的文件最终存储在Storage服务器上。 Storage server 并没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。又叫做存储服务器

·

原理

在这里插入图片描述
● Tracker可以实现集群,每个Tracker节点地位平等,收集Storage集群状态

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

·

好处

● 解决了海量存储的问题。在需要扩容的时候只需要添加一组 Storage server(存储服务器)即可

● 同样的文件内容不同的文件名保存只存储一份

Storage server在保存文件时,会保存该文件的hash值即唯一值(又叫做文件的指纹),并生成该文件的唯一名字返回给客户端,当不同用户存储不同文件名但是文件内容在Storage server中有相同的文件内容时,会直接返回该文件内容的唯一名字给客户端,不会再为这个文件存储到新的空间。

● 结合nginx可以提高网站提供图片的效率

结合nginx是因为fastdfs提供的http服务较为简单,无法提供负载均衡等高性能服务,而nginx恰好是一个高性能Web和反向代理服务器,具有非常多优越的特性,同时fastdfs的创作者也提供了fastdfs-nginx-module-master.zip模块来快速结合fastdfs和nginx。

·

·

应用

● 在Django框架中使用FastDFS,与nginx配合使用
在这里插入图片描述

·

安装

快速安装配置fastDFS和nginx(目前只支持在Linux上)参考该博文:
https://www.cnblogs.com/ibcdwx/p/13751407.html

● 安装常见问题:

Ubuntu安装nginx时依赖库zlib,pcre,openssl安装方法
https://blog.youkuaiyun.com/z920954494/article/details/52132125

·

编译nginx时struct crypt_data’没有名为‘current_salt’的成员:
cd.current_salt[0] = ~salt[0];的解决方案

https://blog.youkuaiyun.com/yu_pan_love_cat/article/details/103035513

·

解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)错误
https://www.cnblogs.com/chengfengchi/p/11393372.html

·

启动

启动FastDFS的tracker和storage服务器

/etc/init.d/fdfs_trackerd start //启动tracke

/etc/init.d/fdfs_storaged start //启动storage

Ubuntu防火墙的关闭/启动/查看状态

sudo ufw disable

sudo ufw enable

sudo ufw status

启动nginx

/usr/local/nginx/sbin/nginx -s reload

·

Fast DFS与python 的交互

在这里插入图片描述链接:https://pan.baidu.com/s/1TaiXAjKt4-cFHTw-j5mtfg
提取码:1298

·

下载fdfs_client-py-master.zip和client.conf文件到本地

在下载路径中安装到python包里

pip install fdfs_client-py-master.zip

In [1]: from fdfs_client.client import Fdfs_client                                              

# 创建client对象
In [2]: client = Fdfs_client('/etc/fdfs/client.conf')                                           
# 调用上传文件的方法
In [3]: ret = client.upload_by_filename('manage.py')                                            
getting connection
<fdfs_client.connection.Connection object at 0x7f50bf724940>
<fdfs_client.fdfs_protol.Tracker_header object at 0x7f50bf724970>

In [4]: ret                                                                                     
Out[4]: 
{'Group name': 'group1',
 'Remote file_id': 'group1/M00/00/00/wKgrVV_Mw9WAYdKEAAAA_Wp_1pk9576.py',
 'Status': 'Upload successed.',
 'Local file name': 'manage.py',
 'Uploaded size': '253B',
 'Storage IP': '192.168.43.85'}

这里ret返回一个字典格式

·

·

在Django中用Fast DFS自定义文件存储类

当fdfs_client-py-master.zip安装失败时可安装py3Fdfs替代

pip install py3Fdfs

代码实例:

settings.py

# 设置Django的默认文件存储类为自定义的fastdfs存储,如不设置则默认使用django的默认存储
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'

# 设置fastdfs使用的client.conf文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'

# 设置fastdfs存储服务器上nginx的ip和端口号
FDFS_BASE_URL = 'http://192.168.43.85:80/'

utils/fdfs/storage.py

from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings


class FDFSStorage(Storage):
    '''fast dfs文件存储类'''

    def __init__(self, fdfs_clientConf=None, fdfs_nginx_url=None):
        if fdfs_clientConf is None:
            fdfs_clientConf = settings.FDFS_CLIENT_CONF
        self.fdfs_clientConf = fdfs_clientConf

        if fdfs_nginx_url is None:
            fdfs_nginx_url = settings.FDFS_BASE_URL
        self.fdfs_nginx_url = fdfs_nginx_url

    def _open(self, name, mode='rb'):
        '''打开文件时使用'''
        pass

    def _save(self, name, content, max_length=None):
        '''保存文件时使用'''
        # name:选择上传文件的名字
        # content:上传的文件的File对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.fdfs_clientConf)

        # 创建文件到fast dfs系统中, 通过文件内容上传,返回一个字典类型ret
        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.fdfs_nginx_url + name

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此时一位小白路过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值