• 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,然后后台上传文件

  • 相关阅读:
    linux自动清理30天之前的文件
    Oracle树查询及相关函数
    jackson循环引用导致序列化stackOverFlow的解决
    java核心技术36讲笔记
    Quartz学习
    Quartz学习
    java核心技术36讲
    git常用命令
    CTCall简介(后续会继续补充)
    自定义导航栏,隐藏导航栏底部的灰色线条
  • 原文地址:https://www.cnblogs.com/chvv/p/10416091.html
Copyright © 2020-2023  润新知