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

MySQL準同期レプリケーションでのデータの整合性とパフォーマンスに関する考慮事項

    MySQL準同期レプリケーションでは、コミットが正常に返されると、データがマスターとそのスレーブの少なくとも2つの場所に存在することがわかっているため、データの整合性が向上します。このブログ投稿では、準同期レプリケーションのデータ整合性とパフォーマンスの側面に影響を与えるMySQLホスティング構成のいくつかを確認します。 3ノードのレプリカセット(マスターと2つのスレーブ)でInnoDBストレージエンジンとGTIDベースのレプリケーションを使用します。これにより、スレーブに冗長性が確保されます。これは、一方のスレーブに問題がある場合、もう一方のスレーブにフォールバックできることを意味します。

    マスターノードとスレーブノードの両方に適用可能な構成

    • innodb_flust_log_at_trx_commit =1
    • sync_binlog =1

    これらの構成は、データの高い耐久性と一貫性の設定を保証します。つまり、コミットされた各トランザクションはバイナリログに存在することが保証され、ログもディスクにフラッシュされます。したがって、電源障害やオペレーティングシステムのクラッシュが発生した場合でも、MySQLのデータの一貫性は常に維持されます。

    マスターノードの構成。

    • rpl_semi_sync_master_wait_for_slave_count:

    このオプションは、準同期マスターがトランザクションをコミットする前に確認応答を送信する必要があるスレーブの数を構成するために使用されます。 3ノードのレプリカセットでは、これを1に設定することをお勧めします。これにより、両方のスレーブからの確認応答の待機に伴うパフォーマンスへの影響を回避しながら、少なくとも1つのスレーブでデータが利用可能であることが常に保証されます。

    >
    • rpl_semi_sync_master_timeout:

    このオプションは、準同期マスターが非同期モードに戻る前にスレーブ確認応答を待機する時間を設定するために使用されます。これを大きな数値に設定して、非同期モードへのフォールバックが発生しないようにすることをお勧めします。これにより、データの整合性の目標が損なわれます。 2つのスレーブで動作しており、rpl_semi_sync_master_wait_for_slave_countが1に設定されているため、少なくとも1つのスレーブが妥当な時間内に確認応答し、この設定によるパフォーマンスへの影響を最小限に抑えることができます。

    #MySQLチュートリアル:準同期レプリケーションでのデータの整合性とパフォーマンスに関する考慮事項クリックしてツイート

    スレーブノードの構成

    スレーブでは、リレーログ内のSQLスレッドの現在の実行位置と、距離を示すIOスレッドの現在の位置の2つの位置を非常に正確に追跡することが常に重要です。母体のバイナリファイルが読み取られ、スレーブにコピーされます。これらの位置を維持しないことの結果は非常に明白です。スレーブがクラッシュして再起動した場合、SQLスレッドが間違ったオフセットからトランザクションの処理を開始したり、IOスレッドがマスターバイナリログの間違った位置からデータのプルを開始したりする可能性があります。これらの両方のケースは、データの破損につながります。

    次の構成を通じて、スレーブのクラッシュセーフを確保することが重要です。

    • relay_log_info_repository =TABLE
    • relay_log_recovery =ON

    reply_log_info_repositoryをTABLEに設定すると、SQLスレッドの位置がスレーブでの各トランザクションコミットとともに更新されます。ただし、IOスレッドの正確な位置を維持し、ディスクにフラッシュすることは困難です。これは、マスターバイナリログの読み取りとスレーブリレーログへの書き込みがトランザクションに基づいていないためです。スレーブリレーログに書き込むたびにIOスレッドの位置を更新してディスクにフラッシュする必要がある場合、パフォーマンスへの影響は非常に大きくなります。より洗練された解決策は、relay_log_recovery =ONを設定することです。この場合、MySQLが再起動すると、現在のリレーログが破損していると見なされ、SQLスレッドの位置に基づいてマスターから新たにプルされます。

    最後になりましたが、準同期レプリケーションでは、マスターがトランザクションをコミットする前に、データがスレーブの1つに「到達」したことを確認することが重要です。トランザクションはスレーブでコミットされます。したがって、SQLスレッドが良好なパフォーマンスで動作することを確認することをお勧めします。理想的なケースでは、SQLスレッドはIOスレッドと連携して移動するため、スレーブはトランザクションを受信するだけでなく、コミットすることもできます。スレーブSQLスレッドのパフォーマンスを向上させるために、マルチスレッドのスレーブ構成を使用することをお勧めします。マルチスレッドスレーブの重要な構成は次のとおりです。

    • slave_parallel_workers:これを> 1に設定すると、複数のスレーブSQLスレッドワーカーが有効になります。マスターに書き込んでいるスレッドの数に基づいて、スレーブが遅れないように最適な数を決定できます。
    • slave-parallel-type =LOGICAL_CLOCK
    • slave-preserve-commit-order =1

    上記の構成は、スレーブでの並列処理を約束すると同時に、マスターで見られるトランザクションの順序を維持します。

    要約すると、MySQLレプリカセットで上記の構成を使用することにより、最適なパフォーマンスとともに高いデータ整合性を維持できます。

    いつものように、ご不明な点がございましたら、コメントを残すか、Twitterの@scalegridioまでご連絡いただくか、サポートまでメールをお送りください。 @scalegrid.io。


    1. Django1.6を使用したトランザクション管理

    2. SET TEXTSIZEがSQLServerで機能しませんか?これをチェックして。

    3. Entity Frameworkコア-大文字と小文字が区別されますか、それとも大文字と小文字が区別されませんか?

    4. Oracleの一時データのパフォーマンスに関する考慮事項