機能説明
データベースにおいて、binlogはデータベース操作を記録するために使用されるログファイルであり、データベースの追加、削除、更新操作などを含みます。時間の経過とともに、binlogファイルはますます増加し、大量のディスクスペースを占有します。したがって、定期的なクリーンアップが必要であり、つまりpurge binlog操作です。しかし、purge binlogと通常のrotateおよび書き込みトランザクションが競合します。特に、binlogファイルの数が多い場合、purge binlog操作時にパフォーマンスの揺らぎを容易に引き起こす可能性があります。Tencent Cloudカーネルチームは、binlogファイルのクリーンアップシナリオの分析を通じて、purge binlogのパフォーマンスを最適化しました。
purge binlogとrotate binlogのLOCK_index競合を最適化し、rotate binlogがロックを取得できずにbinlogの書き込みを続けられないのを防ぎます。。
現在、purge binlogがindex lockを保持している期間中に、binlogが256Mに達した後、rotate binlogが必要な時にロックを読み取れず、書き込みが停止します。index lockを取得するまで続けられません。上記の問題に対して、主な最適化は、rotate binlogがindex lockを読み取れない場合、rotate binlogを行わず、現在のbinlogファイルにbinlogを書き続けることです。その後、index lockを取得しようと試み続け、index lockを読み取るまでrotate binlogを行いません。
パージが必要なbinlogファイルの読み取り量を削減し、それによりロックを減らします。。
purge binlogプロセスでは、パージが必要なすべてのbinlog内のGtid情報を読み取り、それをmysql.gtid executedテーブルに書き込む必要があります。そのため、パージ期間中はgtidの排他ロックを保持し続け、通常のトランザクションがgtidロックを取得できなくなることがあります。上記の問題に対し、主な最適化として、binlogリスト内の最後のbinlogファイルのgtidのみを読み取るように変更しました。これにより、gtidロックの保持時間を短縮し、通常のトランザクションへの影響を軽減します。
binlogの単一ファイル上限を10Gに引き上げ、それによりrotate binlogの回数を大幅に削減します。
デフォルトのbinlogサイズは256MBです。5000QPSの負荷下では、約1.4秒ごとにローテートが発生し、各ローテートに10~20msかかります。現在、max_binlog_sizeは256MBから10G(オープンソースMySQLは最大1Gをサポート)まで拡張可能です。同じ負荷条件下では、56秒に1回のローテートとなり、indexロックの取得頻度を削減します。現在の戦略は1Gに設定されていますが、業務負荷の必要性に応じてmax_binlog_sizeのパラメータ値をさらに調整できます。
サポートバージョン
カーネルバージョン TDSQL-C for MySQL 8.0 3.1.12 以上。
カーネルバージョン TDSQL-C for MySQL 5.7 2.1.12 以上。
適用シーン
binlogファイルの数が多い場合、purge binlog操作を実行するとロック競合が発生し、業務用binlogの書き込みがブロックされるシナリオです。
使用説明
txsql_binlog_rotate_try_lock_index および txsql_binlog_rotate_try_lock_log パラメータを ON に設定し、txsql_binlog_purge_check_file_count パラメータの値を10に設定することで、本機能を使用できます。詳細なパラメータ説明は以下の通りです:
|
txsql_binlog_rotate_try_lock_index | グローバル | bool | ON | ON/OFF | ONに設定した後、binlog rotateを実行する際にindexファイルのロックを取得できない場合、今回のrotateを放棄します。 |
txsql_binlog_rotate_try_lock_log | グローバル | bool | ON | ON/OFF | ONに設定した後、binlog rotateを実行する際にbinlogロックを取得できない場合、今回のrotateを放棄します。 |
txsql_binlog_purge_check_file_count | グローバル | ulonglong | 10 | 0-UINT64_MAX | purge binlogを実行すると、binlog indexファイルからbinlogファイル名を取得します。binlogの数が多い場合、この操作には時間がかかりますが、通常は1つのbinlogファイル名を取得するだけで目的を達成できます。このパラメータは取得するファイル名の数を制御し、0は制限なしを意味します。通常は10に設定すれば十分です。 |