提案#1:配布マスターを使用する
配布マスターは、log-binが有効、log-slave-updatesが有効なmysqlスレーブであり、BLACKHOLE Storage Engineを持つテーブルのみが含まれます。replicate-do-dbをディストリビューションマスターに適用し、バイナリログに記録するDBスキーマのみを含むバイナリログをディストリビューションマスターで作成できます。このようにして、配布マスターからの発信バイナリログのサイズを縮小します。
次のように配布マスターをセットアップできます。
- --no-dataオプションを使用してスキーマのみのダンプを生成し、データベースをmysqldumpします。
- スキーマのみのダンプを配布マスターに読み込みます。
- 配布マスターのすべてのテーブルをBLACKHOLEストレージエンジンに変換します。
- 実際のデータを持つマスターからディストリビューションマスターへのレプリケーションをセットアップします。
- replicate-do-dbオプションをディストリビューションマスターの/etc/my.cnfに追加します。
手順2および3では、スキーマのみのダンプを編集し、ENGINE = MyISAMおよびENGINE = InnoDBをENGINE = BLACKHOLEに置き換えてから、編集したスキーマのみのダンプを配布マスターにロードすることもできます。
手順3でのみ、配布マスターですべてのMyISAMおよびInnoDBテーブルのBLACKHOLEへの変換をスクリプト化する場合は、次のクエリを実行してテキストファイルに出力します。
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name', ENGINE=BLACKHOLE;') BlackholeConversion FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql') AND engine <> 'BLACKHOLE'" > BlackholeMaker.sql
テーブルのBLACKHOLEストレージエンジンへの変換をスクリプト化することに対する追加のボーナスは、MEMORYストレージエンジンテーブルも変換されることです。MEMORYストレージエンジンテーブルはデータストレージ用のディスク領域を占有しませんが、メモリを占有します。MEMORYテーブルをBLACKHOLEに変換すると、Distribution Masterのメモリが整理されます。
DDLをDistribution Masterに送信しない限り、クライアントに必要なDB情報のみをレプリケートさせる前に、必要なDML(INSERT、UPDATE、DELETE)を送信できます。
私はすでに別のStackExchangeサイトで、Distribution Masterの使用について説明する投稿を書いています。
提案#2:より小さなバイナリログとリレーログを使用する
max_binlog_sizeを途方もなく小さな値に設定すると、binlogを収集して小さなチャンクで出荷できます。リレーログのサイズを設定するための別のオプションmax_relay_log_sizeもあります。max_relay_log_size = 0の場合、デフォルトでmax_binlog_sizeに設定されている値が使用されます。
提案#3:準同期レプリケーションを使用する(MySQL 5.5のみ)
メインデータベースと複数のディストリビューションマスターをMySQL 5.5としてセットアップします。メインデータベースがバイナリログを配布マスターに迅速に出荷できるように、半同期レプリケーションを有効にします。すべてのスレーブがディストリビューションマスターである場合、半同期レプリケーションまたはMySQL 5.5は必要ない場合があります。ディストリビューションマスター以外のスレーブのいずれかにレポート、高可用性、パッシブスタンバイ、またはバックアップの目的で実際のデータがある場合は、半同期レプリケーションと組み合わせてMySQL 5.5を使用します。
提案#4:行ベースではなくステートメントベースのバイナリロギングを使用する
SQLステートメントがテーブル内の複数の行を更新する場合、Statement-Based Binary Logging(SBBL)はSQLステートメントのみを保存します。行ベースバイナリロギング(RBBL)を使用した同じSQLステートメントは、各行の行の変更を実際に記録します。これにより、SQLステートメントを送信すると、RBBLを介してSBBLを実行するバイナリログのスペースが節約されることが明らかになります。
別の問題は、テーブル名の前にデータベースが付加されているreplicate-do-dbとともにRBBLを使用することです。これは、スレーブ、特にディストリビューションマスターに適していません。したがって、すべてのDMLにデータベースとテーブル名の前にピリオドがないことを確認してください。