定义
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