web-dev-qa-db-ja.com

MySQL Galera Clusterの大量更新の遅延

単一のMariaDBセットアップを3ノードのGaleraクラスターに移行しました。私は現在ステージング中であり、通常の操作のほとんどは問題なく実行されています。

しかし、1つの問題があります。1つのテーブルの1つの列(500K行)の一括更新を行うと、トランザクションが完了した直後にSQL UPDATEを実行したノードで新しい値が利用可能になり、伝搬に数秒かかります。他のノードに。

Galeraクラスターは100%同期していると思ったので、ユーザーがさまざまなデータを見ることができることを意味するので、それを見て驚いた...

私のconfは:

[mysqld]
binlog_format=ROW
default_storage_engine=InnoDB
innodb_flush_log_at_trx_commit=0
innodb_autoinc_lock_mode=2
innodb_doublewrite=1
query_cache_size=0
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"
wsrep_cluster_name="xxxxx"
wsrep_cluster_address="gcomm://192.168.0.100,192.168.0.101,192.168.0.102"
wsrep_node_address="192.168.0.102"
wsrep_sst_auth="sst:yyyyyy"
wsrep_sst_method=xtrabackup-v2
wsrep_on=ON

これは本当に期待されていることですか、それとも微調整する必要があるものですか?

ありがとう!

2
nbonamy

Galeraレプリケーションは同期ではなく、「仮想同期」と呼ばれるものだけです。これは、書き込みセットが適用される時点までのみ同期します。

スレーブが同期していない期間が少しあるかもしれません。これは、マスターがスレーブよりも速くイベントを適用する可能性があるために発生します。そして、スレーブから読み取る場合、まだ変更されていないデータを読み取る可能性があります。

ただし、この動作はwsrep_causal_reads=ON変数を設定することで変更できます。この場合、スレーブでの読み取りは、イベントが適用されるまで待機します(これにより、読み取りの応答時間が明らかに増加します)。スレーブとマスター間のギャップが、このレプリケーションが実際の同期レプリケーションではなく、実質的に同期レプリケーションと呼ばれる理由です。

ソース: Multi-Master Replication (Percona XtraDB Cluster-このページには、問題を説明する図もあります)。

別のアプローチは、ノードの1つを「マスター」として定義し、そのノードにのみ書き込むことです。クリティカルな読み取りは「マスター」ノードにも送信する必要がありますが、クリティカルでない読み取りはどのノードにも送信できます。

PS:すべてのノードへの書き込みを計画している場合は、次の記事が役立つ場合があることに注意してください: GaleraのMySQLユーザーにとっての大きな問題 .

編集:

wsrep_causal_reads=ONwsrep_sync_wait=1 によって非推奨になっていることに注意してください。

2
dbdemon

アプリが小さな塊で「一括更新」を実行しても問題ない場合は、そうします。

一度に1000行ずつ、各チャンクの後に必ずCOMMIT(またはautocommitを使用)してください。

詳細 詳細

2
Rick James