phpguus/flysystem-raid

用于冗余独立磁盘配置的flysystem驱动程序。

v1.1.2 2019-09-17 10:44 UTC

This package is auto-updated.

Last update: 2024-09-18 03:44:50 UTC


README

Latest Version on Github Latest Version on Packagist Build Status StyleCI Quality Score Total Downloads

Flysystem-raid提供了跨多个flysystem文件系统的RAID功能。

安装

使用composer安装此包

composer require phpguus/flysystem-raid

用法

RAID-0

RAID-0通常被用来提供数据条带化。

我们目前还不支持这种RAID配置。

RAID-1

RAID-1通常被用来提供数据镜像。由于我们使用了Flysystem抽象,我们可以在任何Flysystem之间镜像数据,并使其冗余可用。

这在某些方面比CDN提供的要好。CDN通常只覆盖一个供应商,例如DigitalOcean的Spaces CDN。然而,此包允许您在许多供应商之间创建镜像数据,包括本地磁盘。

如果您想在您的Web服务器上以及云中保存文件,这种RAID配置就是您需要的全部。

use Aws\S3\S3Client;
use League\Flysystem\Adapter\Local;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Config;
use League\Flysystem\Filesystem;
use PHPGuus\FlysystemRaid\RaidOneAdapter;

include __DIR__ . '/vendor/autoload.php';

$s3Client = new S3Client([
    'credentials' => [
        'key'    => 'your-key',
        'secret' => 'your-secret'
    ],
    'region' => 'your-region',
    'version' => 'latest|version',
]);
$this->adapter = new RaidOneAdapter([
    new Filesystem(new Local('/local_files')),
    new Filesystem(new AWSS3Adapter($s3Client, 'your-bucket-name')),
]);

$this->adapter->write('myFirstFile.txt',
    'The quick brown fox jumps over the lazy dog.', new Config());

文件myFirstFile.txt现在同时写入/local_files和AWS云中。

扩展镜像到新位置

将您的RAID-1配置的镜像扩展到新位置非常简单

$this->adapter = new RaidOneAdapter([
    new Filesystem(new Local('/my_other_local_drive')),
    new Filesystem(new Local('/local_files')),
    new Filesystem(new AWSS3Adapter($s3Client, 'your-bucket-name')),
]);
$this->adapter->rebuildArray();

替换镜像的一个位置

如果您想替换一个位置,例如从AWS更改为Digital Ocean,您需要执行两步方法

第一步是确保您的镜像完全冗余

$this->adapter = new RaidOneAdapter([
    new Filesystem(new Local('/local_files')),
    new Filesystem(new AWSS3Adapter($s3Client, 'your-bucket-name')),
]);
/* Ensure that both locations have identical data */
$this->adapter->rebuildArray();

第二步是用新的适配器配置替换AWS适配器配置,并重新构建数组

$s3Client = new S3Client([
    'credentials' => [
        'key'    => 'your-digital-ocean-key',
        'secret' => 'your-digital-ocean-secret'
    ],
    'region' => 'your-digital-ocean-region',
    'version' => 'latest|version',
]);
$this->adapter = new RaidOneAdapter([
    new Filesystem(new Local('/my_other_local_drive')),
    new Filesystem(new AWSS3Adapter($s3Client, 'your-digital-ocean-bucket-name')),
]);
$this->adapter->rebuildArray();

知道何时重新构建数组

$this->adapter->getMetadata($filePath);返回一个具有mirrors键的数组。此键的值表示此文件存在的镜像数量。如果这个数量小于您适配器中配置的位置数量,您需要重新构建数组。

运行一个至少每天调用一次rebuildArray()的预定脚本是有意义的。

RAID-5

RAID-5通常可以通过使用单个奇偶校验磁盘来计算丢失的数据来承受其配置组件中的一个故障。至少需要3个磁盘来提供RAID-5保护,其中两个用于数据,一个用于奇偶校验计算。

在现代实现中,RAID-5奇偶校验数据与主数据一样存储在所有三个磁盘上。

我们目前还不支持这种RAID配置。

RAID-6

RAID-6,也称为双奇偶校验RAID,通常可以通过使用两个奇偶校验磁盘来承受其配置组件中的两个故障来计算丢失的数据。至少需要4个磁盘来提供RAID-6保护,其中两个用于数据,两个用于奇偶校验计算。

在现代实现中,RAID-6奇偶校验数据与主数据一样存储在所有四个磁盘上。

我们目前还不支持这种RAID配置。

RAID-10

这是条带化和镜像的组合,您的数据被条带化到所有磁盘上,每个条带(通常为8KiB)都被镜像。

我们目前还不支持这种RAID配置。

贡献

欢迎拉取请求。对于重大更改,请首先打开一个问题来讨论您想更改的内容。

请确保适当地更新测试。

许可证

MIT