Swoole が高パフォーマンスのデータ バックアップを実装する方法

WBOY
リリース: 2023-06-25 13:06:42
オリジナル
906 人が閲覧しました

近年、企業の情報構築においてデータのバックアップは欠かせないものとなっています。企業のビジネス量とデータ量が増加するにつれて、従来のバックアップ ソリューションではニーズを満たすことができなくなり、いくつかの新しいバックアップ ツールが登場しました。 Swoole は、PHP 言語をベースとした高性能ネットワーク通信フレームワークで、主にサーバー アプリケーションの実装に使用されます。この記事では、Swooleを使って高パフォーマンスなデータバックアップを実現する方法を紹介します。

1. データのバックアップ

まず、データをバックアップする必要があります。 MySQL などのデータベース ソフトウェアには関連するツールが提供されているため、対応するコマンドを呼び出すだけでデータをバックアップできます。以下は単純なバックアップ関数です:

function backupDatabase($db, $user, $password, $host, $port, $output)
{
    $exec = "mysqldump --opt --skip-lock-tables --extended-insert --user={$user} --password={$password} --host={$host} --port={$port} {$db}";
    if($output)
    {
        $exec .= " > {$output}";
    }
    exec($exec);
}
ログイン後にコピー

この関数は次のパラメータを受け取ります:

$db: バックアップする必要があるデータベースの名前;

$ user: データベースのユーザー名;

$password: データベースのパスワード;

$host: データベースのホスト名;

$port: データベースのポート番号;

$output: バックアップ ファイルのパス。null にすることもできます。

この関数は、データベースをファイルにバックアップします。このファイルは、データの復元時に使用される SQL スクリプト ファイルにすることができます。もちろん、データベース ファイルのコピーなど、他のバックアップ方法も使用できます。

2. 同時バックアップ

データが大きい場合、バックアップ処理に時間がかかることがあります。従来のバックアップ方法では、指定されたバックアップ順序に従って 1 つずつバックアップすることしかできず、複数のバックアップ タスクを同時に実行することはできません。 Swoole は、非同期および同時バックアップ タスクを実装できるコルーチン サポートを提供します。

以下は、Swoole を使用して実装された同時バックアップ関数です:

function concurrentBackup($max, $databases)
{
    $num = count($databases);
    $max = min($max, $num);
    $chan = new chan($max);

    for($i = 0; $i < $max; $i++)
    {
        $chan->push($i);
    }

    $results = [];
    $i = 0;
    $executor = new SwooleCoroutineMysql();

    while($i < $num)
    {
        if($result = $chan->pop())
        {
            $database = $databases[$i];
            go(function() use($database, $executor, $chan, &$results) {
                $executor->connect([
                    'host' => $database['host'],
                    'user' => $database['user'],
                    'password' => $database['password'],
                    'database' => $database['schema']
                ]);

                $filename = "/tmp/{$database['schema']}.sql";
                backupDatabase($database['schema'], $database['user'], $database['password'], $database['host'], $database['port'], $filename);

                $executor->query('DROP TABLE IF EXISTS test');

                $result = $executor->query("source {$filename}");
                if($result === false) {
                    $results[$database['schema']] = 'error';
                } else {
                    $results[$database['schema']] = 'ok';
                }

                $executor->close();

                $chan->push(1);
            });

            $i++;
            if($i == $num) break;
        }
    }

    while(count($results) < $num)
    {
        Co::sleep(0.01);
    }

    return $results;
}
ログイン後にコピー

この関数は 2 つのパラメーターを受け取ります:

$max: 同時バックアップの最大数;

$databases: バックアップする必要があるデータベース (各データベースの接続情報を含む)。

この関数は、コルーチンを通じて複数の同時バックアップ タスクを開始します。まず、同時実行数を制御するために $max のサイズのチャネルを作成します。次に、バックアップ タスクがループ内で実行され、そのたびにチャネルから利用可能な位置を取得してコルーチンを開始します。コルーチンで指定したデータベースをバックアップし、バックアップ ファイルの内容をターゲット データベースに復元します。最後に、結果は $results 配列に保存されます。

コルーチンは、1 つのスレッドで複数のタスクを同時に処理できる軽量のスレッドであるため、効率的な同時バックアップを実現できます。

3. バックアップ ファイルの圧縮

データをバックアップする場合、ストレージ領域を節約するために、通常はバックアップ ファイルを圧縮する必要があります。 Swoole では、バックアップ ファイルを簡単に圧縮できる gzip と zlib という 2 つの圧縮方法が提供されています。

以下はバックアップ ファイルを圧縮する関数です。

function compressBackupFile($filename, $level = 6, $mode = SWOOLE_ZLIB)
{
    $output = $filename . '.gz';
    $ouputFile = gzopen($output, 'wb' . $level);
    $inFile = fopen($filename, 'rb');

    if ($ouputFile && $inFile) {
        if($mode == SWOOLE_ZLIB) {
            $z = new SwooleZlib(SW_ZLIB_DEFLATE, $level, SW_ZLIB_ENCODING_GZIP);
            while(!feof($inFile)) {
                $data = fread($inFile, 1024 * 4);
                if(!$data) break;
                if($z->deflate($data)) {
                    gzwrite($ouputFile, $z->output);
                }
            }
            $z->flush(true);
            gzwrite($ouputFile, $z->output);
        } else {
            while(!feof($inFile)) {
                $data = fread($inFile, 1024 * 4);
                if(!$data) break;
                gzwrite($ouputFile, $data);
            }
        }
        fclose($inFile);
        gzclose($ouputFile);
        unlink($filename);
        return true;
    } else {
        return false;
    }
}
ログイン後にコピー

この関数は 3 つのパラメータを受け取ります。

$filename: 圧縮する必要があるバックアップ ファイルの名前。

$level: 圧縮レベル、値の範囲は 1 ~ 9、デフォルトは 6;

$mode: 圧縮モード、値は SWOOLE_ZLIB または SWOOLE_GZIP、デフォルトは SWOOLE_ZLIB です。

この機能を使用すると、バックアップ ファイルを gz または zlib 形式に圧縮できます。

4. 高パフォーマンスのバックアップを実現

上記 3 つの機能を組み合わせることで、高パフォーマンスのデータ バックアップを実現します。以下はサンプル プログラムです:

$databases = [
    [
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '',
        'schema' => 'db1',
    ],
    [
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '',
        'schema' => 'db2',
    ],
    [
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '',
        'schema' => 'db3',
    ],
    [
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '',
        'schema' => 'db4',
    ],
];

$max = 4;

$s1 = microtime(true);
$results = concurrentBackup($max, $databases);

foreach($results as $schema => $result)
{
    echo "{$schema} backup: {$result}
";
}

$s2 = microtime(true);
echo "time consumed: " . round($s2 - $s1, 3) . "s
";

foreach($databases as $database)
{
    $filename = "/tmp/{$database['schema']}.sql.gz";
    compressBackupFile($filename, 6, SWOOLE_GZIP);
}
ログイン後にコピー

このプログラムは、バックアップする必要がある 4 つのデータベースを定義し、同時実行の最大数を 4 に設定します。まず concurrentBackup 関数を呼び出してデータを並列バックアップし、バックアップ結果とバックアップ プロセスの実行時間を出力します。最後に、バックアップ ファイルを圧縮します。

Swoole を使用して高パフォーマンスのデータ バックアップを実現すると、従来のバックアップ方法と比較してバックアップ効率が大幅に向上します。ただし、データのバックアップに Swoole を使用する場合は、Swoole を活用するためにスレッド プール サイズなどのパフォーマンス パラメーターのチューニングに注意する必要があります。

以上がSwoole が高パフォーマンスのデータ バックアップを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート