MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  InnoDB memcached プラグインとレプリケーション

15.20.7 InnoDB memcached プラグインとレプリケーション

daemon_memcached プラグインは MySQL binary log をサポートしているため、memcached インタフェースを介してソースサーバーをレプリケートし、バックアップ、集中型の読取りワークロードおよび高可用性のバランスを取ることができます。 バイナリロギングでは、すべての memcached コマンドがサポートされます。

レプリカサーバーに daemon_memcached プラグインを設定する必要はありません。 この構成の主な利点は、ソースでの書込みスループットの向上です。 レプリケーションメカニズムの速度は影響を受けません。

次のセクションでは、MySQL レプリケーションで daemon_memcached プラグインを使用するときにバイナリログ機能を使用する方法について説明します。 セクション15.20.3「InnoDB memcached プラグインの設定」 で説明されている設定が完了していることを前提としています。

InnoDB memcached バイナリログの有効化

  1. MySQL binary logdaemon_memcached プラグインを使用するには、ソースサーバーで innodb_api_enable_binlog 構成オプションを有効にします。 このオプションは、サーバーの起動時にのみ設定できます。 --log-bin オプションを使用して、ソースサーバーで MySQL バイナリログを有効にする必要もあります。 これらのオプションは、MySQL 構成ファイルまたは mysqld コマンドラインに追加できます。

    mysqld ... --log-bin -–innodb_api_enable_binlog=1
  2. セクション17.1.2「バイナリログファイルの位置ベースのレプリケーションの設定」 の説明に従って、ソースサーバーとレプリカサーバーを構成します。

  3. mysqldump を使用して、ソースデータスナップショットを作成し、スナップショットをレプリカサーバーに同期します。

    source shell> mysqldump --all-databases --lock-all-tables > dbdump.db
    replica shell> mysql < dbdump.db
  4. ソースサーバーで、SHOW MASTER STATUS を発行してソースバイナリログ座標を取得します。

    mysql> SHOW MASTER STATUS;
  5. レプリカサーバーで、(MySQL 8.0.23 の) CHANGE REPLICATION SOURCE TO ステートメントまたは (MySQL 8.0.23 の前の) CHANGE MASTER TO ステートメントを使用して、ソースバイナリログ座標を使用するレプリカサーバーを設定します。

    mysql> CHANGE MASTER TO
           MASTER_HOST='localhost',
           MASTER_USER='root',
           MASTER_PASSWORD='',
           MASTER_PORT = 13000,
           MASTER_LOG_FILE='0.000001,
           MASTER_LOG_POS=114;
    
    Or from MySQL 8.0.23:
    mysql> CHANGE REPLICATION SOURCE TO
           SOURCE_HOST='localhost',
           SOURCE_USER='root',
           SOURCE_PASSWORD='',
           SOURCE_PORT = 13000,
           SOURCE_LOG_FILE='0.000001,
           SOURCE_LOG_POS=114;
  6. レプリカを起動します。

    mysql> START SLAVE;
    Or from MySQL 8.0.22:
    mysql> START REPLICA;

    エラーログに次のような出力が出力された場合、レプリカはレプリケーションの準備ができています。

    2013-09-24T13:04:38.639684Z 49 [Note] Replication I/O thread: connected to
    source 'root@localhost:13000', replication started in log '0.000001'
    at position 114

InnoDB memcached レプリケーション構成のテスト

この例では、memcached および telnet を使用して InnoDB memcached レプリケーション構成をテストし、データを挿入、更新および削除する方法を示します。 MySQL クライアントは、ソースサーバーとレプリカサーバーの結果を検証するために使用されます。

この例では、daemon_memcached プラグインの初期設定時に innodb_memcached_config.sql 構成スクリプトによって作成された demo_test テーブルを使用します。 demo_test テーブルには、単一のサンプルレコードが含まれます。

  1. set コマンドを使用して、キーが test1、フラグ値が 10、有効期限値が 0、cas 値が 1 および t1 のレコードを挿入します。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    set test1 10 0 1
    t1
    STORED
  2. ソースサーバーで、レコードが demo_test テーブルに挿入されたことを確認します。 demo_test テーブルが以前に変更されていないと仮定すると、2 つのレコードがあります。 キーが AA で、キーが test1 のレコードの例を示します。 c1 カラムはキーに、c2 カラムは値に、c3 カラムはフラグ値に、c4 カラムは cas 値に、c5 カラムは有効期限にマップされます。 有効期限は未使用であるため、0 に設定されました。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | AA    | HELLO, HELLO |    8 |    0 |    0 |
    | test1 | t1           |   10 |    1 |    0 |
    +-------+--------------+------+------+------+
  3. 同じレコードがレプリカサーバーにレプリケートされたことを確認する場合に選択します。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | AA    | HELLO, HELLO |    8 |    0 |    0 |
    | test1 | t1           |   10 |    1 |    0 |
    +-------+--------------+------+------+------+
  4. set コマンドを使用して、キーを new の値に更新します。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    set test1 10 0 2
    new
    STORED

    更新はレプリカサーバーにレプリケートされます (cas 値も更新されます)。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | AA    | HELLO, HELLO |    8 |    0 |    0 |
    | test1 | new          |   10 |    2 |    0 |
    +-------+--------------+------+------+------+
  5. delete コマンドを使用して test1 レコードを削除します。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    delete test1
    DELETED

    delete 操作がレプリカにレプリケートされると、レプリカ上の test1 レコードも削除されます。

    mysql> SELECT * FROM test.demo_test;
    +----+--------------+------+------+------+
    | c1 | c2           | c3   | c4   | c5   |
    +----+--------------+------+------+------+
    | AA | HELLO, HELLO |    8 |    0 |    0 |
    +----+--------------+------+------+------+
  6. flush_all コマンドを使用して、テーブルからすべての行を削除します。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    flush_all
    OK
    mysql> SELECT * FROM test.demo_test;
    Empty set (0.00 sec)
  7. ソースサーバーに Telnet し、2 つの新しいレコードを入力します。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'
    set test2 10 0 4
    again
    STORED
    set test3 10 0 5
    again1
    STORED
  8. 2 つのレコードがレプリカサーバーにレプリケートされたことを確認します。

    mysql> SELECT * FROM test.demo_test;
    +-------+--------------+------+------+------+
    | c1    | c2           | c3   | c4   | c5   |
    +-------+--------------+------+------+------+
    | test2 | again        |   10 |    4 |    0 |
    | test3 | again1       |   10 |    5 |    0 |
    +-------+--------------+------+------+------+
  9. flush_all コマンドを使用して、テーブルからすべての行を削除します。

    telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    flush_all
    OK
  10. flush_all 操作がレプリカサーバーでレプリケートされたことを確認します。

    mysql> SELECT * FROM test.demo_test;
    Empty set (0.00 sec)

InnoDB memcached バイナリログノート

バイナリログ形式:

  • ほとんどの memcached 操作は (挿入、削除、更新に類似した) DML ステートメントにマップされます。 MySQL サーバーでは実際の SQL ステートメントが処理されないため、すべての memcached コマンド (flush_all を除く) で行ベースのレプリケーション (RBR) ロギングが使用され、これはサーバーの binlog_format 設定とは無関係です。

  • memcached flush_all コマンドは、MySQL 5.7 以前の TRUNCATE TABLE コマンドにマップされます。 DDL コマンドはステートメントベースのロギングのみを使用できるため、flush_all コマンドは TRUNCATE TABLE ステートメントを送信することによってレプリケートされます。 MySQL 8.0 以降では、flush_allDELETE にマップされますが、TRUNCATE TABLE ステートメントを送信することでレプリケートされます。

トランザクション:

  • トランザクションの概念は、これまで通常は memcached アプリケーションの一部をなすものではありませんでした。 パフォーマンスを考慮するために、daemon_memcached_r_batch_size および daemon_memcached_w_batch_size を使用して、読取りおよび書込みトランザクションのバッチサイズを制御します。 これらの設定はレプリケーションには影響しません。 基礎となる InnoDB テーブルに対する各 SQL 操作は、正常に完了した後にレプリケートされます。

  • daemon_memcached_w_batch_size のデフォルト値は 1 です。これは、各 memcached 書込み操作がただちにコミットされることを意味します。 このデフォルト設定では、ソースサーバーとレプリカサーバーに表示されるデータの不整合を回避するために、一定量のパフォーマンスオーバーヘッドが発生します。 レプリケートされたレコードは、常にレプリカサーバーですぐに使用できます。 daemon_memcached_w_batch_size1 より大きい値に設定すると、memcached を介して挿入または更新されたレコードはすぐにソースサーバーに表示されません。コミット前にソースサーバー上のレコードを表示するには、SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED を発行します。


関連キーワード:  InnoDB, テーブル, 構成, サーバー, 設定, レコード, ステートメント, 圧縮, ソース, スペース