このページは機械翻訳したものです。
daemon_memcached プラグインは MySQL binary log をサポートしているため、memcached インタフェースを介してソースサーバーをレプリケートし、バックアップ、集中型の読取りワークロードおよび高可用性のバランスを取ることができます。 バイナリロギングでは、すべての memcached コマンドがサポートされます。
レプリカサーバーに daemon_memcached プラグインを設定する必要はありません。 この構成の主な利点は、ソースでの書込みスループットの向上です。 レプリケーションメカニズムの速度は影響を受けません。
次のセクションでは、MySQL レプリケーションで daemon_memcached プラグインを使用するときにバイナリログ機能を使用する方法について説明します。 セクション15.20.3「InnoDB memcached プラグインの設定」 で説明されている設定が完了していることを前提としています。
-
MySQL binary log で
daemon_memcachedプラグインを使用するには、ソースサーバーでinnodb_api_enable_binlog構成オプションを有効にします。 このオプションは、サーバーの起動時にのみ設定できます。--log-binオプションを使用して、ソースサーバーで MySQL バイナリログを有効にする必要もあります。 これらのオプションは、MySQL 構成ファイルまたは mysqld コマンドラインに追加できます。mysqld ... --log-bin -–innodb_api_enable_binlog=1 セクション17.1.2「バイナリログファイルの位置ベースのレプリケーションの設定」 の説明に従って、ソースサーバーとレプリカサーバーを構成します。
-
mysqldump を使用して、ソースデータスナップショットを作成し、スナップショットをレプリカサーバーに同期します。
source shell> mysqldump --all-databases --lock-all-tables > dbdump.db replica shell> mysql < dbdump.db -
ソースサーバーで、
SHOW MASTER STATUSを発行してソースバイナリログ座標を取得します。mysql> SHOW MASTER STATUS; -
レプリカサーバーで、(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; -
レプリカを起動します。
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
この例では、memcached および telnet を使用して InnoDB memcached レプリケーション構成をテストし、データを挿入、更新および削除する方法を示します。 MySQL クライアントは、ソースサーバーとレプリカサーバーの結果を検証するために使用されます。
この例では、daemon_memcached プラグインの初期設定時に innodb_memcached_config.sql 構成スクリプトによって作成された demo_test テーブルを使用します。 demo_test テーブルには、単一のサンプルレコードが含まれます。
-
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 -
ソースサーバーで、レコードが
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 | +-------+--------------+------+------+------+ -
同じレコードがレプリカサーバーにレプリケートされたことを確認する場合に選択します。
mysql> SELECT * FROM test.demo_test; +-------+--------------+------+------+------+ | c1 | c2 | c3 | c4 | c5 | +-------+--------------+------+------+------+ | AA | HELLO, HELLO | 8 | 0 | 0 | | test1 | t1 | 10 | 1 | 0 | +-------+--------------+------+------+------+ -
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 | +-------+--------------+------+------+------+ -
deleteコマンドを使用してtest1レコードを削除します。telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. delete test1 DELETEDdelete操作がレプリカにレプリケートされると、レプリカ上のtest1レコードも削除されます。mysql> SELECT * FROM test.demo_test; +----+--------------+------+------+------+ | c1 | c2 | c3 | c4 | c5 | +----+--------------+------+------+------+ | AA | HELLO, HELLO | 8 | 0 | 0 | +----+--------------+------+------+------+ -
flush_allコマンドを使用して、テーブルからすべての行を削除します。telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. flush_all OKmysql> SELECT * FROM test.demo_test; Empty set (0.00 sec) -
ソースサーバーに 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 -
2 つのレコードがレプリカサーバーにレプリケートされたことを確認します。
mysql> SELECT * FROM test.demo_test; +-------+--------------+------+------+------+ | c1 | c2 | c3 | c4 | c5 | +-------+--------------+------+------+------+ | test2 | again | 10 | 4 | 0 | | test3 | again1 | 10 | 5 | 0 | +-------+--------------+------+------+------+ -
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 -
flush_all操作がレプリカサーバーでレプリケートされたことを確認します。mysql> SELECT * FROM test.demo_test; Empty set (0.00 sec)
バイナリログ形式:
ほとんどの 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_allはDELETEにマップされますが、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_sizeを1より大きい値に設定すると、memcached を介して挿入または更新されたレコードはすぐにソースサーバーに表示されません。コミット前にソースサーバー上のレコードを表示するには、SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDを発行します。