sql >> データベース >  >> RDS >> Mysql

従来のレプリケーションからGTIDに移行します

    この記事では、従来のレプリケーションからGTIDへの移行について見ていきます。

    完全にオンラインで行う方法について説明します。まず、GTID関連の構成オプションについて説明します。 GTIDモードは、サーバーの使用状況がGTIDであるかどうかを判断します。これは、レプリケーションバイナリログインだけでなく、バ​​イナリログにGTIDが含まれるためにも影響します。 GTID整合性の強制オプションにより、サーバーはGTIDモードで安全に実行できるステートメントのみを許可します。実行するのが安全でないステートメントは、selectとしてのテーブルの作成のようなものですが、ほとんどの場合、実行中のトランザクションでGTIDを監視できるgtid_ownedの貴重なものがいくつかあります。これは、GTIDをオンラインでオフにする場合に非常に便利です。

    いくつかについて説明しましょう。正確には、GTIDに関連するステータス変数は1つだけです。 ONGOING_ANONYMOUS_TRANSACTION_ COUNTは、所有するGTIDの対応物ですが、ONGOING_ANONYMOUS_TRANSACTION_COUNTと同様に移行の場合、GTIDである識別子がないため、匿名トランザクションと呼ばれます。

    すべての操作は、レプリケーショントポロジのノードの1つで実行する必要があり、最終的にはすべてのノードで実行する必要があります。ベストプラクティスは、最初にスレーブとマスターを実行することですが、多くの操作の場合、レプリケーショントポロジの各インスタンスで実行される限り、順序は実際には重要ではありません。

    この環境では、3つの仮想マシンがあります。そのうちの2つはデータベースで、1つはトラフィックを生成するsysbenchマシンなので、始めましょう。

    マスター:192.168.66.5

    スレーブ:192.168.66.7

    sysbenchノードで、preparedコマンドを実行してsysbenchデータベースを作成しましょう。下からコピーして貼り付けるだけです。

    sysbench \
    --db-driver=mysql \
    --mysql-user=sbtest_user \
    --mysql_password= password \
    --mysql-db=sbtest \
    --mysql-host=192.168.66.5 \
    --mysql-port=3306 \
    --tables=16 \
    --table-size=10000 \
    /usr/share/sysbench/oltp_read_write.lua prepare

    sysbenchノードで、タスクの実行中に実行していたマスターに対してワークロードを実行します。

    sysbench \
    --db-driver=mysql \
    --mysql-user=sbtest_user \
    --mysql_password=password \
    --mysql-db=sbtest \
    --mysql-host=192.168.66.5 \
    --mysql-port=3306 \
    --tables=16 \
    --table-size=10000 \
    --threads=4 \
    --time=0 \
    --events=0 \
    --rate=10 \
    --report-interval=1 \
    /usr/share/sysbench/oltp_read_write.lua run

    すべてのノード、すべてのデータベースノードでMySQLクライアントを起動しましょう。マスターの表示プロセスリストを確認して、これがここで実行されていることを確認しましょう。

    mysql> show processlist;
    +----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
    | Id | User            | Host               | db     | Command     | Time | State                                                         | Info             |
    +----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
    |  5 | event_scheduler | localhost          | NULL   | Daemon      | 2350 | Waiting on empty queue                                        | NULL             |
    |  8 | root            | localhost          | sbtest | Query       |    0 | starting                                                      | show processlist |
    | 15 | syncstndby      | 192.168.66.7:47894 | NULL   | Binlog Dump |  156 | Master has sent all binlog to slave; waiting for more updates | NULL             |
    | 17 | sbtest_user     | 192.168.66.6:38130 | sbtest | Sleep       |    0 |                                                               | NULL             |
    | 18 | sbtest_user     | 192.168.66.6:38132 | sbtest | Sleep       |    1 |                                                               | NULL             |
    | 19 | sbtest_user     | 192.168.66.6:38134 | sbtest | Sleep       |    0 |                                                               | NULL             |
    | 20 | sbtest_user     | 192.168.66.6:38136 | sbtest | Sleep       |    0 |                                                               | NULL             |
    +----+-----------------+--------------------+--------+-------------+------+---------------------------------------------------------------+------------------+
    7 rows in set (0.00 sec)
    
    

    さて、これからは最初に軟膏とマスターと一緒に働きます。

    したがって、最初に、enforce_gtid_consistency =‘warn’ on slave、toslavemasterを設定します。

    スレーブ192.168.66.7

    set global enforce_gtid_consistency = 'warn';

    マスター192.168.66.5

    set global enforce_gtid_consistency = 'warn';

    これで完了です。MySQLエラーを確認します。エラーログを参照してください。これで問題ありません。エラーログにエラーは表示されません。次のステップは、set global Enforcement_gtid_consistency =’on’をどこでも実行してから、矢印をもう一度確認することです。

    スレーブ192.168.66.7

    set global enforce_gtid_consistency='on';

    マスター192.168.66.5

    set global enforce_gtid_consistency='on';

    したがって、次のステップはグローバルgtid_mode =’off_permissive’を設定することです。もう一度、MySQLクライアントを起動して設定します。次に、エラーログを確認します

    スレーブ192.168.66.7

    set global gtid_mode='off_permissive';

    マスター192.168.66.5

    set global gtid_mode='off_permissive';

    各サーバーで、gtid_mode =’on_permissive’を設定します。そのため、この時点でGTIDトランザクションを生成します。

    スレーブ192.168.66.7

    set global gtid_mode='on_permissive';

    マスター192.168.66.5

    set global gtid_mode='on_permissive';

    だから、それはどこにでも設定されています。エラーログを確認しましょう

    さて、ここで、ノードのいずれかに進行中の匿名トランザクションがあるかどうかを確認します。進行中の場合、gtid_mode =’on’を設定すると、サーバーは匿名トランザクションを受け入れなくなり、エラーが発生します。

    スレーブ192.168.66.7

    mysql> show status like 'ongoing_anonymous_transaction_count';
    +-------------------------------------+-------+
    | Variable_name                       | Value |
    +-------------------------------------+-------+
    | Ongoing_anonymous_transaction_count | 0     |
    +-------------------------------------+-------+
    1 row in set (0.22 sec)

    マスター192.168.66.5

    mysql> show status like 'ongoing_anonymous_transaction_count';
    +-------------------------------------+-------+
    | Variable_name                       | Value |
    +-------------------------------------+-------+
    | Ongoing_anonymous_transaction_count | 0     |
    +-------------------------------------+-------+
    1 row in set (0.04 sec)

    したがって、両方のサーバーにはありません。つまり、GTIDをオンにする準備ができています。 gtid_mode=onを有効にします。

    マスター192.168.66.5

    mysql> set global gtid_mode='on';
    
    Query OK, 0 rows affected (0.03 sec)

    スレーブ192.168.66.7

    mysql> set global gtid_mode='on';
    
    Query OK, 0 rows affected (0.03 sec)

    スレーブでは、master-auto-position =1

    を使用するようにレプリケーションを再初期化する必要があります。

    スレーブ192.168.66.7

    stop slave;
    change master to master_auto_position=1;
    start slave;

    つまり、これが何をするのか、ここでのこの「マスターの変更」は、軟膏スレッドがすでに構成されている場合、マスターの変更コマンドによって一部のパラメーターが変更されない場合、現在の値のままになります。

    スレーブにスレーブステータスを表示し、マスターにマスターステータスを表示するを確認しましょう。正常に動作しているはずのすべて。

    mysql> show salve status\G;
    
    mysql> show master status;

    これで移行が完了しました:

    ロールバックプランがない場合、アップグレードは成功しないことがわかっているため、ロールバックするには、以下のリンクをクリックして次の記事を読んでください。

    GTIDから従来のレプリケーションにロールバック


    1. 実際のMySQLクエリ時間の測定

    2. テーブルGrupocakephpのFROM句エントリがありません

    3. エラー:INSERTEXECステートメントをネストできません。およびINSERT-EXECステートメント内でROLLBACKステートメントを使用することはできません。これを解決する方法は?

    4. MySQLでの文字列の連結