MySQL 5.6での機能強化点(その3)- 人気のレプリケーションが更に機能強化

2014年1月23日(木)
山﨑 由章

MySQL 5.6での機能強化点

前回の連載、前々回の連載では、MySQL 5.6での主要な機能強化点として、InnoDBとオプティマイザ、NoSQL APIとパフォーマンス・スキーマについて紹介しました。今回はレプリケーションの改善点について紹介します。

レプリケーション:人気の機能を更に機能強化

MySQL 5.6では、レプリケーション機能に対して非常に多くの改善が行われています。パフォーマンスの改善につながる機能から耐障害性を高める機能、開発生産性や運用性の向上につながる機能まで、幅広く改善されています。ここでは、主要な改善点を紹介します。

レプリケーション:パフォーマンスを向上

バイナリログのサイズ削減

レプリケーション構成時は、バイナリログというファイルを利用してデータベースに対する更新内容を伝搬していきます。バイナリログのフォーマットには以下の3種類があります。

  1. SQL文自体を記録するSBR(Statement Based Replication)
  2. 変更された行のイメージを記録するRBR(Row Based Replication)
  3. 上記1.、2.を組み合わせたMBR(Mixed Based Replication)

RBRを使用すると、データを変更した際にバイナリログ内に変更前の行イメージと変更後の行イメージを全て保持していました。MySQL 5.6では、行イメージを全て保持するのではなく、最低限のカラムの情報だけ保持するように、バイナリログのフォーマットを変更可能です。フォーマットを変更する場合は、以下のパラメータを設定します。

-	binlog_row_image=minimal

※設定可能な値はfull、minimal、noblob (デフォルト値はfull)
※マスター/スレーブでテーブル定義を同一にし、テーブルに主キーを設定する必要があります。詳細はこちらを参照下さい。

minimalを指定することで、変更前の行イメージには主キー列のみを、変更後の行イメージには変更された列のイメージのみを保持することができ、バイナリログのサイズを削減できます。バイナリログのサイズが削減されるということは、レプリケーション環境でのメモリ使用量、ネットワーク転送量、ディスク使用量の削減につながり、パフォーマンス改善にもつながります。

グループコミット

グループコミットにより、sync_binlog=1設定時のオーバーヘッドを大幅に削減しました。

バイナリログ出力時、コミットと同時にバイナリログへの書き込みをディスクにフラッシュするためには、以下のパラメータを設定します。

-	sync_binlog=1

※設定可能な値は0から18446744073709547520(64bitOSの場合)(デフォルト値は0)
詳細はこちらを参照下さい。

従来は複数トランザクションからコミットが実行されると、それぞれのトランザクションの内容を1つ1つ順番にディスクにフラッシュする必要がありました。MySQL 5.6では、グループコミットにより複数トランザクションの情報をまとめて1回のI/Oでディスクにフラッシュできるようになっているため、sync_binlog=1設定時のオーバーヘッドを大幅に削減できています。

マルチスレッドスレーブ

レプリケーション環境では、マスター側の処理はマルチスレッドで実行されるのに対して、スレーブ側の処理はシングルスレッドで実行されます。そのため、マスター上で多くのユーザーが同時に更新処理を実行している場合、スレーブでの更新処理が遅延することがあります。

こういった遅延を改善するために、MySQL 5.6ではマルチスレッドスレーブが実装されました。マルチスレッドスレーブを使うと、スレーブ側での処理をマルチスレッド化できるため、スレーブの遅延を改善できる可能性があります。但し、以下の点に注意する必要があります。

  • 並列化の単位はスキーマ(データベース)
  • マスターとスレーブでのトランザクションの実行順序が異なる可能性がある
    (データベース内での整合性は保証されているが、複数データベース間での整合性は、結果整合性(eventual consistency)になる)

正直なところ、MySQL 5.6のマルチスレッドスレーブは有効に活用できるケースが限定的なため、まだまだ上手く活用できない場面もあるかもしれません(有効に活用できるケース:サブシステムごとにスキーマを分けているケース、SaaSのインフラとして使っていてテナントごとにスキーマが分かれているケース、など)。しかし、現在開発中であるMySQL 5.7では、同一スキーマ内の処理もマルチスレッド化し、使い勝手を向上することを目指しています。

有効に活用できるケースでは、以下のベンチマークのようにパフォーマンスの改善が期待できます。

図1:マルチスレッドスレーブのパフォーマンス(クリックで拡大)

マルチスレッドスレーブを有効にする場合は、以下のパラメータを設定します。

-	slave_parallel_workers=n

※設定可能な値は0~1024 (デフォルト値は0)
詳細はこちらを参照下さい。

日本オラクル株式会社

MySQLのセールスコンサルタント。元々はOracleデータベースのコンサルティング、サポート等に従事していたが、オープンソースとフリーソフトウェア(自由なソフトウェア)の世界に興味を持ち、MySQLの仕事を始める。趣味は旅行と美味しいものを食べること。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています