您的位置:首页 > 编程语言 > PHP开发

Fileflake:为Laravel定制的分布式文件存储服务

2016-11-22 15:03 495 查看

Fileflake

为Laravel定制的分布式文件存储服务,使用mongodb作为后端存储引擎。

Github仓库

fileflake

特性

支持的操作:上传,下载,删除

分布式的文件存储节点

存储节点负载均衡

易于横向扩展(添加存储节点)

文件流存储于mongodb

文件流分块存储,块大小可配置

拥有同样签名的文件只存储一个拷贝

上手

安装

推荐使用composer安装. 参考 php 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_
4000
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 $fileMeta no local copy */
$fileMeta = $fileflake->getMeta($fileId);
/** @var \Limen\Fileflake\Protocols\OutputFile $fileMeta have a local copy */
$localFile = $fileflake->get($fileId);
/** @var string $localPath path of local copy */
$localPath = $localFile->path;

// remove file
$fileflake->remove($fileId);

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


存储架构

文件元数据

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

元数据的“引用”类似于Linux文件系统的软链接。

“引用计数”表示目前有多个文件指向当前文件(源文件)。

拥有相同签名的多个文件只存储一个拷贝,它们通过“引用”值与源文件产生关联。

当删除一个软链接文件时,删除文件元数据,软链接文件指向的源文件的引用计数减1。

当删除一个源文件时,源文件的引用计数减1。

当一个文件的引用计数为0时,删除该文件的元数据,并将该文件从后端存储中删除。

文件id

文件名

文件签名

引用计数

引用(源文件id)

存储节点id

分块id

扩展名

mime

存储节点

分块id

分块内容

节点元数据

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

文件数量

文件占用空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐