Top Banner
What's New in What's New in MySQL 5.7 Replication MySQL 5.7 Replication 奥野 幹也 Twitter: @nippondanji mikiya (dot) okuno (at) gmail (dot) com @MySQL 5.7 新機能徹底攻略講座
59

What's New in MySQL 5.7 Replication

Jan 08, 2017

Download

Software

Mikiya Okuno
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: What's New in MySQL 5.7 Replication

What's New inWhat's New inMySQL 5.7 ReplicationMySQL 5.7 Replication

奥野 幹也Twitter: @nippondanjimikiya (dot) okuno (at) gmail (dot) com

@MySQL 5.7 新機能徹底攻略講座

Page 2: What's New in MySQL 5.7 Replication

免責事項本プレゼンテーションにおいて示されている見解は、私自身の見解であって、オラクル・コーポレーションの見解を必ずしも反映したものではありません。ご了承ください。

Page 3: What's New in MySQL 5.7 Replication

自己紹介

● MySQL サポートエンジニア– 日々のしごと

● トラブルシューティング全般● Q&A 回答● パフォーマンスチューニング

など● ライフワーク

– 自由なソフトウェアの普及● オープンソースではない● GPL 万歳!!

– 最近はまってる趣味はリカンベント(自転車)● ブログ

– 漢のコンピュータ道– http://nippondanji.blogspot.com/

Page 4: What's New in MySQL 5.7 Replication

おかげさまで新書籍発売と相成りました。

ありがとうございます!

Page 5: What's New in MySQL 5.7 Replication

詳解 MySQL 5.7止まらぬ進化に乗り遅れないためのテクニカルガイド

● MySQL 5.7 の新機能を網羅的に解説– 175 の新機能– WorkLog/Bug Id つき– コンセプト、仕組み、使い方

● 新機能の理解に必要な前提知識– 古いバージョンでも適用可能– アーキテクチャを理解することで

本物の理解を

Page 6: What's New in MySQL 5.7 Replication

MySQL 5.7 の新機能概要

Page 7: What's New in MySQL 5.7 Replication

MySQL 5.7 の数多くの新機能

● 実に 150 以上もの新機能が追加された!!– MySQL 5.7 の新機能完全リスト

https://yakst.com/ja/posts/3037– yoku0825++

● レプリケーション関連● InnoDB 関連● オプティマイザー関連● セキュリティ関連● パフォーマンススキーマ関連● GIS 関連● JSON 関連

etc etc...

Page 8: What's New in MySQL 5.7 Replication

レプリケーションの新機能

● マルチスレッドスレーブの改良● マルチソースレプリケーション● 準同期レプリケーションの改良

– ロスレスレプリケーション– パフォーマンスの改善– ACK を返すスレーブ数の指定

● GTID の改良– スレーブでの管理が効率化– 再起動時の GTID 計算方法が効率化

● オンライン操作の拡充– GTID 有効化– CHAMGE MASTER の一部– レプリケーションフィルター

Page 9: What's New in MySQL 5.7 Replication

オプティマイザの新機能

● EXPLAIN for CONNECTION● JSON EXPLAIN● コストモデル

– JOIN の順序選択– 統計情報の正確性– コストの係数のユーザーによる設定

● GROUP BY● FROM 句のサブクエリ● IN サブクエリ● UNION ALL● ソート● テンポラリテーブル

Page 10: What's New in MySQL 5.7 Replication

InnoDB の新機能

● 一般テーブルスペース● テンポラリテーブルの InnoDB 化● バッファプールのオンラインリサイズ● UNDO ログの自動トランケート● 32/64KB ページのサポート● REDO ログフォーマットの改善● バッファプールをダンプする割合の指定● ページ統合におけるページ充填率の指定● コピーしない ALTER TABLE 操作の増加

Page 11: What's New in MySQL 5.7 Replication

InnoDB の新機能 つづき

● 全文検索用プラガブルパーサーのサポート– ngram あるいは MeCab による日本語の全文検索

● 全文検索の最適化● 空間インデックスのサポート● 透過的テーブル圧縮● 透過的テーブルスペース暗号化● ダブルライトが不要なとき自動的に無効化● NUMA サポートの追加● InnoDB モニターの有効化方法変更● 情報スキーマの改良● デフォルト行フォーマットの指定

Page 12: What's New in MySQL 5.7 Replication

InnoDB の新機能性能改善系

● テンポラリテーブルのための最適化● RO トランザクションの性能改善● RW トランザクションの性能改善

– index->lock の競合改善( SX ロック)● リードビュー作成の性能改善● trx_t のキャッシュ効率改善● AHI のミューテックス競合改善● ページクリーナーのマルチスレッド化● フラッシュアルゴリズムの改善● クラッシュリカバリの性能改善● ログファイル書き込みの性能改善● インデックス作成の高速化

etc

Page 13: What's New in MySQL 5.7 Replication

セキュリティ関係の新機能

● パスワード期限の設定● ユーザーのロック、アンロック● SET PASSWORD コマンドの仕様変更● CREATE USER … IF NOT EXISTS● ログイン不可能なユーザーアカウント● SSL のセットアップが容易に

– キーファイルの自動生成– mysql_ssl_rsa_setup

● 透過的テーブルスペース暗号化● デフォルトの状態がセキュアに

– test データベースの廃止– 匿名ユーザーの廃止– localhost以外の root の廃止

Page 14: What's New in MySQL 5.7 Replication

レプリケーションの概要

マスター スレーブ

バイナリログ リレーログストレージエンジン

ストレージエンジン

マスタースレッド

スレーブ I/Oスレッド

スレーブSQL スレッド

5. バイナリログ送信

接続スレッド

クライアント

1. COMMIT

2. PRE

PAR

E

3. バイナ

リロ

グ更

新 6. 記録7. 更新を適用

4. CO

MM

IT

Page 15: What's New in MySQL 5.7 Replication

マスタースレッドの改良

Page 16: What's New in MySQL 5.7 Replication

バイナリログに対するグループコミットの調整

● binlog_group_commit_sync_delay– バイナリログへの同期をする前に待つ時間(マイクロ秒)– 溜めがあるほうが1回の同期に多くのトランザクションが含

まれる– レスポンスをわずかに犠牲にすることで、スループットを向上

● binlog_group_commit_sync_no_delay_count– 1回の COMMIT に含まれる最大のトランザクション数

Page 17: What's New in MySQL 5.7 Replication

グループコミットなし

Tx1

PREPARE

binlogwrite

COMMIT

binlogfsync

時間

Tx2

PREPARE

binlogwrite

COMMIT

binlogfsync

Tx3

PREPARE

binlogwrite

COMMIT

binlogfsync

Page 18: What's New in MySQL 5.7 Replication

グループコミットあり

Tx1

PREPARE

binlogwrite

COMMIT

時間

Tx2

PREPARE

binlogwrite

COMMIT

binlogfsync

Tx3

PREPARE

binlogwrite

COMMIT

Page 19: What's New in MySQL 5.7 Replication

メモリ使用効率の改善

● MySQL 5.6 では、マスタースレッドがバイナリログからイベントを読み取る度にメモリを malloc していた。

– イベントの送信が完了すると free– 効率が悪い

● MySQL 5.7 ではバッファが十分な場合は使い回す– バッファが足りない場合は realloc– 定期的にサイズの見直しをすることでバッファの肥大化を防止

Page 20: What's New in MySQL 5.7 Replication

Mutex 競合の改善

● MySQL 5.6 でバイナリログへのグループコミットが導入された当初、マスターのクラッシュによってスレーブとの不整合が起きるバグがあった

– MySQL 5.6.17 で改善– バイナリログへの R/W が LOCK_log によって守られていた– write だけでなく fsync についても LOCK_log で保護

● バイナリログへの書き込みとマスタースレッドが LOCK_logを奪い合う

● 更新処理性能ダウン● マスタースレッドのスループットダウン

Page 21: What's New in MySQL 5.7 Replication

GC 導入当初に生じたデータ整合性の問題

Tx1

マスター

Tx2

Tx3

Tx4

バイナリログ

Tx5

スレーブ

Tx1

Tx2

Tx3

リレーログ

Page 22: What's New in MySQL 5.7 Replication

バイナリログとクラッシュリカバリ

● 2相コミットが行われる条件– sync_binlog=1– innodb_support_xa = 1– ionndb_flush_log_at_trx_commit =1

● 2相コミットの場合のリカバリ処理– バイナリログの fsync が成功したかどうかでリカバリするか

どうかが決まる● バイナリログにトランザクションがあれば永続化● バイナリログに無ければロールバック

Page 23: What's New in MySQL 5.7 Replication

MySQL 5.7 における

LOCK_log 競合の解消● MySQL 5.6 ではデータ不整合を避けるため LOCK_log で守ら

れた処理が多くなっていた– R/W, fsync

● MySQL 5.7 では Mutexを分割した– マスタースレッドが参照するカウンタを追加

● fsync によって更新● マスタースレッドが参照● LOCK_binlog_end_pos で保護● マスタースレッドが LOCK_log を取らなくなった

– LOCK_log はバイナリログへの write/fsync を保護

Page 24: What's New in MySQL 5.7 Replication

マルチスレッドスレーブの改良

Page 25: What's New in MySQL 5.7 Replication

マルチスレッドスレーブ( MTS )とは

● 読んで字のごとく、スレーブ側で複数のスレッドを使ってスレーブのスループットを高める機能

– マスターが複数のスレッドで更新されるのに対し、スレーブは単一のスレッドによる更新では、更新性能に差が生じてしまう。

– 特に CPU コア数が多く、 IOPS の高いディスクを使っている、 CPU バウンドな環境で顕著。

● MySQL 5.6から実装

Page 26: What's New in MySQL 5.7 Replication

MySQL 5.6 における

MTS の制限● 並列化の単位はデータベース

– 同じデータベース上の更新は並列化されない– SQL スレッドが実行中のトランザクションと異なるデータベースを更新するトランザクションは並列化可能

– 複数のデータベースにまたがったトランザクションは不整合の原因に

– 効果は限定的

Page 27: What's New in MySQL 5.7 Replication

MySQL 5.7 の改良

LOGICAL_CLOCK 方式● マスターで同じグループでコミットされたトランザクションを

スレーブで並列化する方式● 同一データベースに対する更新を並列化● スレーブで sync_binlog=1 のとき必須

Page 28: What's New in MySQL 5.7 Replication

オーバーラップしたトランザクション

● バイナリログと InnoDB は2相コミット● PREPARE → COMMIT の間に若干のタイムラグ● 同時に PREPARE まで到達したトランザクションはロックの競

合がない– 並列実行可能

● バイナリログに追加情報– last_committed と sequence_number

Tx1

Tx2

PREPARE:l1

PREPARE:l2

COMMIT:s1

オーバーラップ

COMMIT:s2

Page 29: What's New in MySQL 5.7 Replication

MTS の設定

[mysqld] slave_parallel_workers = 64 slave_parallel_type = LOGICAL_CLOCK slave_preserve_commit_order = 1 log_bin = mysql-bin log_slave_updates = 1

Page 30: What's New in MySQL 5.7 Replication

マルチソースレプリケーション

Page 31: What's New in MySQL 5.7 Replication

MySQL 5.6 ではスレーブがもてるマスターはひとつだけ

マスター

スレーブ

スレーブ

マスター

マスター

スレーブ

OK

NG

Page 32: What's New in MySQL 5.7 Replication

MySQL 5.7 ではスレーブが複数のマスターを参照可能

マスター

スレーブ

スレーブ

マスター

マスター

スレーブ

OK

OK!!

Page 33: What's New in MySQL 5.7 Replication

FOR CHANNEL 句の導入

● CHANNEL = スレーブが参照するマスター– デフォルトの CHANNEL は空文字列

● CHANGE MASTER TO … FOR CHANNEL 'name'● START SLAVE FOR CHANNEL 'name'● STOP SLAVE FOR CHANNEL 'name'● SHOW SLAVE STATTUS … FOR CHANNEL 'name'● RESET SLAVE FOR CHANNEL 'name'

Page 34: What's New in MySQL 5.7 Replication

マルチソースレプリケーションの注意事項

● マスター同士で競合する更新をしないようにすること– 同じテーブルを更新しなければ問題なし– 同じテーブルを更新する場合

● シャーディングのおまとめ● 少なくとも SBR は使わない● 同じ行を異なるマスターで挿入、更新、削除しない

● あくまでもレプリケーションは非同期– スレーブのデータはそれぞれのマスターと時差がある– 同期したデータが参照できることは期待できない

Page 35: What's New in MySQL 5.7 Replication

準同期レプリケーションの

改良

Page 36: What's New in MySQL 5.7 Replication

準同期レプリケーションの概要

マスター スレーブ

バイナリログ リレーログストレージエンジン

ストレージエンジン

マスタースレッド

スレーブ I/Oスレッド

スレーブSQL スレッド

5. バイナリログ送信

6. 記録7-1. 更新を適用

接続スレッド

クライアント

1. COMMIT

3. バイナ

リログ更

7-2a. ACK7-2b. ACK

8. OK パケット

2. PR

EPA

RE

4. CO

MM

IT

Page 37: What's New in MySQL 5.7 Replication

準同期がロスレスになった!!

● マスタークラッシュ時にスレーブを昇格すると、マスターから参照可能だったデータが全てスレーブ上に存在する

● MySQL 5.6 では、マスターから参照できたデータが、昇格後のスレーブに存在しないケースがある

– rpl_semi_sync_master_wait_point = AFTER_SYNC

Page 38: What's New in MySQL 5.7 Replication

ロスのある更新処理のシナリオ

1. tx1 がデータ xを書き込む2. データ xがバイナリログに書き込まれる3. バイナリログがディスクへ同期される4. データ xがストレージエンジンに COMMIT される5. この時点でデータ xに対するロックが解除され、他のトラン

ザクションはデータ xを参照できるようになる• tx2 がデータ x を参照した。

6. クライアントへの応答が停止され、 ACK待ちの状態になる7. データ xがスレーブへ転送される前にマスターがクラッシュ

する8. スレーブのひとつを昇格

• 新たなマスターへ接続してもデータ x は見つからない

Page 39: What's New in MySQL 5.7 Replication

ACK を待つタイミングを変更

● ストレージエンジンへ COMMIT する前に ACK を待つ● rpl_semi_sync_master_wait_point = AFTER_SYNC

– MySQL 5.6 と同じ動作は AFTER_COMMIT

Page 40: What's New in MySQL 5.7 Replication

MySQL 5.6 の準同期マスター

Tx1

PREPARE

binlogwrite

COMMIT

時間

Tx2

PREPARE

binlogwrite

COMMIT

binlogfsync

Tx3

PREPARE

binlogwrite

COMMITACK を待つ

Page 41: What's New in MySQL 5.7 Replication

MySQL 5.7 の準同期マスター

Tx1

PREPARE

binlogwrite

COMMIT

時間

Tx2

PREPARE

binlogwrite

COMMIT

binlogfsync

Tx3

PREPARE

binlogwrite

COMMIT

ACK を待つ

Page 42: What's New in MySQL 5.7 Replication

準同期レプリケーションのパフォーマンスの改良

● MySQL 5.6 では、マスタースレッドがスレーブへのバイナリログの送信と、 ACK の受信の両方を担っていた。

– ACK を受信するまで、次のイベントを送信することが出来ない。

● MySQL 5.7 では、 ACK の送受信を行う専用のスレッドが作成されるようになった。

– ACK スレッド– performance_schema.threads テーブルで確認– 並列化により、マスターの更新処理性能が改善

Page 43: What's New in MySQL 5.7 Replication

ACK を返すスレーブ数の指定

● rpl_semi_sync_master_wait_for_slave_count– マスターが ACK を待つスレーブ数– デフォルトは 1

● rpl_semi_sync_master_wait_no_slave– スレーブ数がrpl_semi_sync_master_wait_for_slave_count より少なくなった場合の挙動

– ON → スレーブが復活するのを待つ(デフォルト)– OFF → 即座に非同期モードに移行する

● 複数のスレーブがデータを持つことで冗長性を向上

Page 44: What's New in MySQL 5.7 Replication

GTID の改良

Page 45: What's New in MySQL 5.7 Replication

GTID とは

● Global Transaction Identifier の略● トランザクションに世界で固有の ID をつける仕組み

– UUID+ 連番● UUID はサーバー初回起動時に自動生成● auto.cnf に格納

– バイナリログに記録される● サンプル

– 00018785-1111-1111-1111-111111111111:1-100

Page 46: What's New in MySQL 5.7 Replication

オンラインで GTID を有効化

• MySQL 5.6 ではオンラインで有効化できなかった 1. マスターへの更新を停止し、スレーブが追いつくのを待つ2. マスターとスレーブを停止する3. GTID 関係のオプションをマスターとスレーブ双方で有効

化する4. マスターとスレーブを起動する。ただし、スレーブは --

skip-slave-start オプションをつける5. スレーブ側で MASTER_AUTO_POSITION = 1 を指定し

て、 CHANGE MASTER コマンドを実行する6. レプリケーションを開始する

Page 47: What's New in MySQL 5.7 Replication

オンラインで GTID を有効化つづき

• MySQL 5.7 ではオンラインで有効化できるようになった 1. すべての SQL 文を GTID互換にする

● SET GLOBAL enforce_gtid_consistency = WARN;2. マスターとスレーブで GTID が生成されるようにする

• gtid_mode を変更• OFF→OFF_PERMISSIVE→ON_PERMISSIVE→ON

● SHOW GLOBAL STATUS LIKE 'Ongoing_anonymous_transaction_count';

3. フルバックアップを取得する4. GTID レプリケーションに切り替える

• STOP SLAVE;● CHANGE MASTER TO MASTER_AUTO_POSITION = 1;● START SLAVE;

無効化もオンラインで可能

Page 48: What's New in MySQL 5.7 Replication

昇格しないスレーブ上でGTID の管理が効率化

● GTID はバイナリログに格納される– スレーブ上では log_slave_updates = 1– 昇格後には他のスレーブへバイナリログが転送される– データサイズ大

● MySQL 5.7 では GTID だけを格納するテーブルが追加– mysql.gtid_executed

Page 49: What's New in MySQL 5.7 Replication

OK パケットに GTID● OK パケット(処理が成功したときの応答パケット)に GTID を含めることができるようになった。

– @@global.gtid_executed を参照する必要がなくなった– 自分が COMMIT したトランザクションの GTID を確実に知るこ

とができる● マスターで更新をして、続く参照処理をスレーブで実行した

い– レプリケーションは非同期なので、マスターの更新が伝搬

している保証はない– スレーブ上で、マスター更新時の GTID を待てば良い

Page 50: What's New in MySQL 5.7 Replication

WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS

● SQL_THREAD_WAIT_AFTER_GTIDS– SQL スレッドが停止している場合は NULL– MySQL 5.6から実装

● WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS– SQL スレッドの状態によらず特定の GTID が実行されるのを待つ

– MySQL 5.7 で追加

Page 51: What's New in MySQL 5.7 Replication

再起動時の GTID 計算方法の変更

● MySQL サーバーは再起動時にバイナリログの GTID を調べて、 gtid_executed と gtid_purged を再計算する

● MySQL 5.6 の計算方法– gtid_executed

● 新しいほうからバイナリログをスキャン● Previous_gtids_log_event+そのバイナリログに含まれる

GTID– gtid_purged

● 古い方からバイナリログをスキャン● Previous_gtids_log_event あるいは最も古い GTIDから削除

されたバイナリログに含まれる GTID を推定– GTID が ON のときと OFF のときのバイナリログが混在してい

ると、スキャンするべきバイナリログの数が多くなるケースがある

Page 52: What's New in MySQL 5.7 Replication

MySQL 5.7 では最新と最古のバイナリログだけをスキャン

● gtid_executed– 最新のバイナリログに Previous_gtids_log_eventや GTID が無

ければ、 GTID は記録されていないと判断● gtid_purged

– 最古のバイナリログに Previous_gtids_log_eventや GTID が無ければ、 GTID は削除されていないと判断

Page 53: What's New in MySQL 5.7 Replication

オンラインレプリケーション

フィルター

Page 54: What's New in MySQL 5.7 Replication

レプリケーションフィルターの変更をオンラインで実行可能に

● オプション– --replicate-ignore-db

● オンラインで変更– CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (test, admin);

● 注意点– フィルターは追加ではなく上書き– 永続化はされないので、必要なら my.cnf も変更する必要

がある

Page 55: What's New in MySQL 5.7 Replication

レプリケーション用パフォーマンス

スキーマ

Page 56: What's New in MySQL 5.7 Replication

パフォーマンススキーマからステータスの取得が可能に

テーブル名 説明

replication_applier_configuration SQLスレッドの設定を表示する

replication_applier_status SQLスレッドのステータスを表示する

replication_applier_status_by_coordinator コーディネータースレッドのステータスを表示する

replication_applier_status_by_worker ワーカースレッドのステータスを表示する

replication_connection_configuration IOスレッドの設定を表示する

replication_connection_status IOスレッドのステータスを表示する

Page 57: What's New in MySQL 5.7 Replication

まとめ

Page 58: What's New in MySQL 5.7 Replication

MySQL 5.7 のレプリケーションは超絶進化!!

● 機能性向上– 既存のトポロジーの殻を打ち破ったマルチソース– ロスレスになった準同期レプリケーション

● 性能向上– LOGICAL_CLOCK モードのマルチスレッドスレーブ– マスタースレッドの Mutex競合解消– 準同期レプリケーションの ACK スレッド

● 利便性向上– フィルターの動的変更– GTID の動的有効化– パフォーマンススキーマ

による情報取得もうこれは

使うしかない!!

Page 59: What's New in MySQL 5.7 Replication

Q&Aご静聴ありがとうございました。