limen/fileflake

一个分布式文件服务器,使用mongodb作为存储后端。

v0.2.3 2017-04-05 02:32 UTC

This package is not auto-updated.

Last update: 2024-09-28 20:03:43 UTC


README

一个分布式文件服务器,使用mongodb(不是mongo GridFS)作为Larevel的存储后端。

Build Status Packagist

特性

  • 支持的操作:上传、下载、删除
  • 分布式存储节点
  • 存储节点负载均衡
  • 易于扩展(动态添加更多存储节点)
  • 文件流存储在mongodb中
  • 文件流被分割成块,块大小可配置
  • 可以迭代文件块而不需要本地复制
  • 具有相同校验和的文件只存储一个副本

开始使用

安装

建议通过 composer 进行安装。

composer require "limen/fileflake"

用法

use Limen\Fileflake\Config;

$config = [
    Config::KEY_FILE_META_CONNECTION => 'mongodb',          // required, file meta connection
    Config::KEY_FILE_META_COLLECTION => 'FileMeta',         // required, file meta collection
    Config::KEY_NODE_META_CONNECTION => 'mongodb',          // required, node meta connection
    Config::KEY_NODE_META_COLLECTION => 'NodeMeta',         // required, node meta collection

    Config::KEY_FILE_CHUNK_SIZE     => 51200,               // required, chunk size in byte

    // if set to true, the load balance would consider file count and file volume of each storage node,
    // or the load balance would pick one node randomly
    Config::KEY_LOAD_BALANCE_STRICT => true,                // optional, default value is false

    // required
    Config::KEY_FILE_CONTENT_STORAGE_NODES => [
        [
            'id'         => 1,                              // storage node id, should be unique and unmodifiable
            'connection' => 'mongodb',                      // storage node connection
            'collection' => 'FileStorage1',                 // storage node collection
        ],
        [
            'id'         => 2,
            'connection' => 'mongodb',
            'collection' => 'FileStorage2',
        ],
    ],

    Config::KEY_LOCALIZE_DIR     => '/tmp/fileflake/localize',      // required, the temp local files stored in this directory

    // optional, see default values below
    Config::KEY_CONTRACT_CONCRETE_MAP => [
        \Limen\Fileflake\Contracts\UidGeneratorContract::class => \Limen\Fileflake\Support\UidGenerator::class,
        \Limen\Fileflake\Contracts\BalancerContract::class => \Limen\Fileflake\LoadBalancer::class,
        \Limen\Fileflake\Contracts\LockContract::class => \Limen\Fileflake\Lock\RedLock::class,
        \Limen\Fileflake\Contracts\FileContainerContract::class => \Limen\Fileflake\FileContainer::class,
        \Limen\Fileflake\Contracts\FileMetaContract::class => \Limen\Fileflake\Storage\FileMetaStorage::class,
    ],
];

$filePath = '/path/to/file';
$file = new \Limen\Fileflake\Protocols\InputFile($filePath, 'fileflake.png', filesize($filePath), 'png', 'image/png');
$fileflake = new \Limen\Fileflake\Fileflake($config);

/** @var string $fileId md5 */
$fileId = $fileflake->put($file);

/** @var \Limen\Fileflake\Protocols\OutputFile only file meta data */
$fileMeta = $fileflake->getMeta($fileId);

/** @var \Limen\Fileflake\Protocols\OutputFile  */
$localFile = $fileflake->get($fileId);

$localFile->localize();     // make a local copy

/** @var string $localPath path of local copy */
$localPath = $localFile->path;

while ($chunk = $localFile->nextChunk()) {      // iterate file chunks without making a local copy
    // do something
}
        
// remove file
$fileflake->remove($fileId);

$fileflake->get($fileId);           // return null

系统图

fileflake

概念

文件元数据

每个文件都有一个元数据记录。

引用类似于Linux文件系统中的软链接。

没有引用的文件是“源文件”。相反,有引用的文件是“软链接”。

文件的引用计数(默认为1)显示有多少个文件(包括自身)引用它。

系统只会存储具有相同校验和的文件中的第一个,其他文件的引用指向第一个文件。

当删除软链接文件时,其元数据将被删除,其源文件的引用计数将递减1。

当删除源文件时,其引用计数将递减1。

当源文件的引用计数减少到0时,其元数据将被删除,其块将从存储节点中删除。

元数据字段

  • 文件ID
  • 文件名
  • 文件校验和
  • 文件引用计数
  • 文件引用
  • 存储节点ID
  • 块ID
  • 扩展名
  • MIME类型

存储节点

节点存储源文件的块。

字段

  • 块ID
  • 块内容

节点元数据

存储节点元数据,用于负载均衡

字段

  • 节点ID
  • 文件数量
  • 文件大小

许可证

MIT