FastDFS分布式存储

FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文 件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。

Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些 策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务 器。

Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上, Storageserver 没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将 storage 称为存储服务器。

服务端两个角色:

Tracker:管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。

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

Django文件默认保存在medai_root文件下,,MEDIA_ROOT在django服务器上,服务器的硬盘是有限制的,由于电商网站图片太多 ,会受到django服务器的限制,所以图片通常会保存在单独的文件服务器上,不会保存在网站服务器上

客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文 件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

海量存储,存储容量扩展方便。  解决文件内容重复。  结合nginx提高网站访问图片的效率

上传文件的时候上传至fastFDS,获取文件的时候要借助nginx服务器

启动FastDFS的方法,需要的操作:

  1. 修改如下的配置文件  (在/etc/fdfs目录中)
  2. tracker_server=自己的ip地址:22122

  3. 启动tracker、storage、nginx服务:
  4. sudo service fdfs_trackerd start

    sudo service fdfs_storaged start

    sudo /usr/local/nginx/sbin/nginx

    1. 执行如下命令测试是否成功

    fdfs_upload_file /etc/fdfs/client.conf 要上片文件

    如果返回类似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg的文件id则说明文件上传成功

    在浏览器中可以用   127.0.0.1:8888/返回的文件id  

    访问图片

新建一个utils的python包,再创建一个fdfs的python文件包

  然后创建一个storage.py的文件

# coding=utf-8
from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client

# client_conf配置文件,配置文件中一定不要出现中文
'''faftDFS文件存储类'''
class FDFSStorage(Storage):
    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(r'D:workplacepy_djangofreshmallutilsfdfsclient.conf')
        client = Fdfs_client(self.client_conf)

        #上传文件到fastfds系统中

        ret = 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 ret.get('Status') != 'Upload successed.':
            # 上传失败
            raise Exception('上传文件到fast dfs失败')

            # 获取返回的文件ID
        filename = ret.get('Remote file_id')

        return filename

    def exists(self, name):
        '''Django判断文件名是否可用'''
        return False

    def url(self, name):
        '''返回访问文件的url路径'''
        # return 'http://192.168.170.141:8888/'+name
        return self.base_url + name

配置文件client-conf放在fdfs文件夹下

# 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=D:workplace

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
tracker_server=192.168.170.141: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
View Code

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://192.168.170.141:8888/'

把对应的商品图片类注册到admin,然后后台上传文件

原文地址:https://www.cnblogs.com/chvv/p/10416091.html