l-alexandrov/laravel-zero-downtime-migration

该包已被弃用且不再维护。作者建议使用 daursu/laravel-zero-downtime-migration 包。

Laravel 和 Percona 工具套件的无停机迁移

v1.0.0 2022-06-07 07:49 UTC

This package is auto-updated.

Last update: 2023-05-23 08:57:33 UTC


README

使用 Laravel 和 gh-ostpt-online-schema-change 进行无停机迁移。

注意:仅与 MySQL 数据库兼容,包括(Percona & MariaDB)。

安装

兼容 Laravel 5.55.65.75.86.07.08.0 & 9.0

先决条件

如果你使用 gh-ost,请确保从他们的发布页面下载二进制文件

如果你使用 pt-online-schema-change,请确保已安装 percona-toolkit

  • 在 Mac 上,你可以使用 brew 安装它:brew install percona-toolkit
  • 在 Debian/Ubuntu 上 apt-get install percona-toolkit

安装步骤

  1. 运行 composer require l-alexandrov/laravel-zero-downtime-migration
  2. (可选) 如果你没有使用自动加载,请将服务提供者添加到你的 config/app.php 文件中。
LAlexandrov\ZeroDowntimeMigration\ServiceProvider::class,
  1. 更新你的 config/database.php 并添加新的连接

此包支持 pt-online-schema-changegh-ost。以下是每个包的配置

gh-ost
'connections' => [
    'zero-downtime' => [
        'driver' => 'gh-ost',
        
        // This is your master write access database connection details
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        
        // Additional options, depending on your setup
        // all options available here: https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md
        'options' => [
            '--max-load=Threads_running=25',
            '--critical-load=Threads_running=1000',
            '--chunk-size=1000',
            '--throttle-control-replicas=myreplica.1.com,myreplica.2.com',
            '--max-lag-millis=1500',
            '--verbose',
            '--switch-to-rbr',
            '--exact-rowcount',
            '--concurrent-rowcount',
            '--default-retries=120',
        ],
    ],
],
pt-online-schema-change
'connections' => [
    'zero-downtime' => [
        'driver' => 'pt-online-schema-change',
        
        // This is your master write access database connection details
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        
        // Additional options, depending on your setup
        // all options available here: https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html
        'options' => [
            '--nocheck-replication-filters',
            '--nocheck-unique-key-change',
            '--recursion-method=none',
            '--chunk-size=2000',
        ],
    ],
],

用法

在编写新迁移时,使用辅助门面 ZeroDowntimeSchema 而不是 Laravel 的 Schema,所有命令都将通过 gh-ostpt-online-schema-change 运行。

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use LAlexandrov\ZeroDowntimeMigration\ZeroDowntimeSchema;

class AddPhoneNumberToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        ZeroDowntimeSchema::table('users', function (Blueprint $table) {
            $table->string('phone_number')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        ZeroDowntimeSchema::table('users', function (Blueprint $table) {
            $table->dropColumn('phone-number');
        });
    }
}

运行 php artisan:migrate

配置

所有配置都在连接本身的 config/database.php 内进行。你可以将自定义标志传递给原始的 pt-online-schema-change 命令。只需在 options 数组中添加你想要的参数即可,如下所示

'options' => [
    '--nocheck-replication-filters',
    '--nocheck-unique-key-change',
    '--recursion-method=none',
    '--chunk-size=2000',
]

你可以在以下位置找到所有可能的选项:https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

测试

ZeroDowntimeSchema 门面允许你在测试期间禁用 pt-online-schema-change 的运行。要这样做,在你的基本测试用例 TestCase.php 下的 setUp 方法中添加以下内容

public function setUp()
{
   // ... existing code
   ZeroDowntimeSchema::disable();
}

这将禁用 pt-online-schema-change,并且使用辅助门面运行的所有迁移将通过默认的 Laravel 迁移器运行。

自定义连接名称

默认情况下,ZeroDowntimeSchema 辅助使用的连接名称设置为 zero-downtime,但是如果你在 config/database.php 中将连接名称设置为其他名称,则可以覆盖此设置。

要这样做,在你的 AppServiceProvider.php 中,在 boot() 方法下添加以下内容

public function boot()
{
    // ... existing code
    ZeroDowntimeSchema::$connection = 'your-custom-name';
}

复制

如果你的数据库在一个带有复制的集群中运行,那么你需要配置pt-online-schema-changes如何找到你的复制从节点。以下是一个示例设置,但请根据您的需求进行自定义。

'options' => [
    '--nocheck-replication-filters',
    '--nocheck-unique-key-change',
    '--recursion-method=dsn=D=database_name,t=dsns',
    '--chunk-size=2000',
]
  1. database_name替换为您的数据库名称。
  2. 创建一个名为dsns的新表。
CREATE TABLE `dsns` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `dsn` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
  1. 为每个您拥有的复制添加一行,例如
INSERT INTO `dsns` (`id`, `parent_id`, `dsn`)
VALUES
 (1, NULL, 'h=my-replica-1.example.org,P=3306');

注意事项

  • 此方法仅适用于MySQL、Percona和MariaDB。
  • 当您需要更改表结构时使用此工具,而不是在创建或删除表时使用。