limen / fileflake
一个分布式文件服务器,使用mongodb作为存储后端。
v0.2.3
2017-04-05 02:32 UTC
Requires
- php: >=5.5.9
- jenssegers/mongodb: ^3.0
- laravel/lumen-framework: 5.2.*
- limen/redmodel: >=0.1.3
- mongodb/mongodb: ^1.0.0
Requires (Dev)
- phpunit/phpunit: ~4.8
This package is not auto-updated.
Last update: 2024-09-28 20:03:43 UTC
README
一个分布式文件服务器,使用mongodb(不是mongo GridFS)作为Larevel的存储后端。
特性
- 支持的操作:上传、下载、删除
- 分布式存储节点
- 存储节点负载均衡
- 易于扩展(动态添加更多存储节点)
- 文件流存储在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
系统图
概念
文件元数据
每个文件都有一个元数据记录。
引用类似于Linux文件系统中的软链接。
没有引用的文件是“源文件”。相反,有引用的文件是“软链接”。
文件的引用计数(默认为1)显示有多少个文件(包括自身)引用它。
系统只会存储具有相同校验和的文件中的第一个,其他文件的引用指向第一个文件。
当删除软链接文件时,其元数据将被删除,其源文件的引用计数将递减1。
当删除源文件时,其引用计数将递减1。
当源文件的引用计数减少到0时,其元数据将被删除,其块将从存储节点中删除。
元数据字段
- 文件ID
- 文件名
- 文件校验和
- 文件引用计数
- 文件引用
- 存储节点ID
- 块ID
- 扩展名
- MIME类型
存储节点
节点存储源文件的块。
字段
- 块ID
- 块内容
节点元数据
存储节点元数据,用于负载均衡
字段
- 节点ID
- 文件数量
- 文件大小
许可证
MIT