MySQL 落ちないDBサーバの作り方
~マスター・スレーブ構成だけじゃない~
2017/01/28 OSC 2017 Osaka
日本MySQL ユーザ会 @mita2
自己紹介
2
• 三谷 智史(Twitter: @mita2)
• 日本MySQLユーザ会(MyNA)
• OSCで講演は初めてです
• Web系企業で、たくさんのMySQLを管理
• MySQLとの関わり
2002年~ 主に利用して開発する立...
対象者
3
• 本日は冗長構成のパターンや考え方をご紹介します
• 具体的な設定方法はあまり書いてないです
• クラウドの話は出てきません・・・
• 初心者向け
本日の内容
• DBサーバの構成パターンとメリット・デメリット
1. 共有ストレージ
2. ディスク同期(DRBD)
3. スレーブのマスター昇格
4. Group Replication
• クライアント側で意識してほしいこと
• 日本 My...
本日の内容
• DBサーバの構成パターンとメリット・デメリット
1. 共有ストレージ
2. ディスク同期(DRBD)
3. スレーブのマスター昇格
4. Group Replication
• クライアント側で意識してほしいこと
• 日本 My...
クラスタソフトクラスタソフト
共有ストレージ
• DBの世界では伝統的な方法
• データファイルを共有ストレージ
に置く
• クラスタソフトでActive/Passive
の切り替え
6
共有ストレージ
(SAN/NAS)
共有ストレージ
(S...
クラスターソフトウェア
• 障害を検知し、リソースをスタンバイ機で立ち上げる
• リソース=プロセスやIP
• 代表的なソフトウェア
• OSS: Pacemaker+Corosync (Heatbeat)
• 商用:Veritas Clust...
共有ストレージ
ところで、ストレージ落ちたらどうするん?
8
クラスタソフトクラスタソフト
共有ストレージ
(SAN/NAS)
共有ストレージ
(SAN/NAS)
DBサーバDBサーバ
DBサーバ
(待機)
DBサーバ
(待機)
ファイルファイ...
共有ストレージ SAN/NAS
• 冗長性が担保されているエンタープ
ライズ製品が前提
• NetApp, Dell EMC, HP, IBM etc…
• エンタープライズと言っても、
比較的、安価なものもある
• ブロックIOに強い製品を選...
クラッシュリカバリ
• MySQLが異常終了後、起動時に行う処理
• データファイルの整合性を取り戻す
• 時間は iblog(更新ログ)のサイズと更新量に依存する
10
フェイルオーバー時に起動に時間がかかる
11
共有ストレージ メリ・デメ
共有ストレージ メリット
• 障害時のデータロストのリスクがない
• レプリケーション遅延の考慮が不要
• (商用ストレージ便利)
12
MySQL 5.7でロスレス準
同期レプリの登場により
他の手段でもデータロス
トなく運用可能に
MySQ...
共有ストレージ デメリット
• 切り替わりに(ほかと比べて)時間がかかる
• 分単位は見込んだほうが良い
• ファイルシステムの破損に対応できない
• バックアップで対応することになる
• Web上に具体的な情報があまりない
• 個人では難しい...
本日の内容
• DBサーバの構成パターンとメリット・デメリット
1. 共有ストレージ
2. ディスク同期(DRBD)
3. スレーブのマスター昇格
4. Group Replication
• クライアント側で意識してほしいこと
• 日本 My...
DRBD+クラスターソフトウェア
• DBサーバのディスクを他筐体にミラー
15
• Distributed Replicated Block Device
• ブロックデバイス(ディスク)をネット
ワークを通じて複製するOSS
DBサーバDB...
DRBD+クラスターソフトウェア
• クラスタソフトでActive/Passive
の切り替え
• DRBD + Pacemaker/Corosync
• Oracle も公式にサポート対象
16
https://dev.mysql.com/d...
17
ディスク同期 メリ・デメ
ディスク同期 メリット
• 障害時のデータロストのリスクがない
• レプリケーション遅延の考慮が不要
• 商用ストレージと比較して安価に始められる
18
ディスク同期 デメリット
• 切り替わりに(ほかと比べて)時間がかかる
• ファイルシステムの破損に対応できない
19
参考資料
• CentOS アプライアンスでの DRBD MySQL クラスタ
• http://wiki.pandorafms.com/index.php?title=Pandora:Documentation_ja:DRBD_Applian...
本日の内容
• DBサーバの構成パターンとメリット・デメリット
1. 共有ストレージ
2. ディスク同期(DRBD)
3. スレーブのマスター昇格
4. Group Replication
• クライアント側で意識してほしいこと
• 日本 My...
22
MySQL レプリケーションおさらい
マスター・スレーブ
• レプリケーション=複製を作る
• マスター
• 更新を受け付けるサーバ
• スレーブ
• コピー、読み取り専用
• 用途
• 読み取り性能のスケールアウト
• バックアップ取得用など使い分け
• マスター障害の際の切り替...
Global Transaction ID
• トランザクションに一意のIDを付与
• サーバUUID + 連番
• 08c8c338-f529-11e3-8182-fa163e64b6a2:1
• マスターは「更新内容+GTID」をログファイ...
実際の更新ログの内容
# at 248449
#161202 14:46:59 server id 2759935033 end_log_pos 248497 CRC32 0xc9775906 GTID [commit=yes]
SET @@S...
レプリケーションの流れ
26
• バイナリログ
• 更新ログ
• IOスレッド
• 更新ログをマスターか
ら受け取る
• リレーログ
• 受け取ったログ
• SQLスレッド
• リレーログからSQLを
読み出し、適用する
ストレージ
エンジン
...
スレーブを使ったフェイルオーバー
マスター
(a)
マスター
(a)
スレーブ
(b)
スレーブ
(b)
スレーブ
(c)
スレーブ
(c)
aaa-aaa:1
aaa-aaa:2
aaa-aaa:3
aaa-aaa:1
aaa-aaa:2
a...
一連の動作を自動で行うツールたち
• ツール用のmanager サーバを別で用意
• MHA for MySQL
• Master High Availability Manager and tools for MySQL
• mysqlfai...
MHA
• 松信さん がつくったツール
• 豊富な実績、Web上に資料が豊富
• 最近はメンテナンスモード
• クラッシュセーフスレーブと組み合わせて利用できない
• DBサーバへSSHを行う。DBサーバ側にもagentが必要。
29
mysqlfailover
• Oracle 社の公式ツール
• DBサーバへのSSHやagentのインストール不要
• SQLで完結
30
MySQL レプリケーションの種類
1. 非同期レプリケーション
2. 準同期レプリケーション
– Ver 5.5~
3. ロスレス準同期レプリケーション
– Ver 5.7~
31
非同期レプリケーション
32
1. クライアントがCOMMIT
2. バイナリログに更新内容を記録
3. ストレージエンジンに更新内容
を記録
4. クライアントにACKを返す
5. リレーログに記録
ストレージ
エンジン
ストレージ
エンジン...
準同期レプリケーション
33
1. クライアントがCOMMIT
2. バイナリログに更新内容を記録
3. ストレージエンジンに更新内容
を記録
4. リレーログに記録
5. クライアントにACKを返す
ストレージ
エンジン
ストレージ
エンジン...
ロスレス準同期レプリケーション
34
1. クライアントがCOMMIT
2. バイナリログに更新内容を記録
3. リレーログに記録
4. ストレージエンジンに更新内容
を記録
5. クライアントにACKを返す
ストレージ
エンジン
ストレージ
...
フェイルオーバー時のデータロスト
• 非同期レプリケーション
– データロストのリスクがあるが、レイテンシがない
• 準同期レプリケーション
– データロストのリスクはあるが小さい、レイテンシはある
• ロスレス準同期レプリケーション
– デー...
36
マスター昇格 メリデメ
マスター昇格 メリット
• 切り替わりが早い
• ファイルシステムの破損に対応できる
• 安価に始められる
• 待機系のサーバを利用できる
• 公開されている情報が多め
37
マスター昇格 デメリット
• レプリケーション遅延のリスクを考える必要がある
38
本日の内容
• DBサーバの構成パターンとメリット・デメリット
1. 共有ストレージ
2. ディスク同期(DRBD)
3. スレーブのマスター昇格
4. Group Replication
• クライアント側で意識すべきこと
• 日本 MySQ...
Group Replication
• 次のメジャーバージョン(8.0) で入ると思いきや、12月の
5.7.17で入ってきたヤツ!
40
高可用性ソリューション
• マルチライター構成が組める
• 高可用性ソリューション
• 性能向上を主目的としたものではない
41
MasterMaster MasterMaster MasterMaster MasterMaster Maste...
高可用性ソリューション
• マルチライター構成が組める
• 高可用性ソリューション
• 性能向上を主目的としたものではない
42
MasterMaster MasterMaster MasterMaster MasterMaster Maste...
マルチライター
43
マスター
(a)
マスター
(a)
スレーブスレーブ スレーブスレーブ
マスター
(a)
マスター
(a)
マスターマスター マスターマスター
Read
Write
Read
Write
Read
Write
Read
W...
障害検知の仕組みがビルドイン
44
MasterMaster MasterMaster MasterMaster MasterMaster MasterMaster
• 障害を自動検知し、データ同期対象から切り離す
• 復旧時には差分を自動的に...
45
Group Replication とロックの挙動
非 Group Replication 構成の場合
46
時間 行の値 トランザクション1 トランザクション2
T1 - mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPD...
非 Group Replication 構成の場合
47
時間 行の値 トランザクション1 トランザクション2
T1 - mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPD...
Group Replication 構成の場合
48
時間 行の値 トランザクション1 on ノード1 トランザクション2 on ノード2
T1 - mysql> BEGIN;
Query OK, 0 rows affected (0.00 s...
Group Replication 構成の場合
49
時間 行の値 トランザクション1 on ノード1 トランザクション2 on ノード2
T1 - mysql> BEGIN;
Query OK, 0 rows affected (0.00 s...
回避方法
50
MasterMaster
Read only
Master
Read only
Master
Read only
Master
Read only
Master
Single Primary モード
• 従来のマスター/スレーブ...
分散方法
• MySQL Router
• Oracle 純正
• Version 2.1 でサポートされる予定
• まだ正式リリースされてない
• HA Proxy
• OSSのソフトウェアロードバランサ
• Group Replicatio...
52
flow control
flow control
• ノード間の遅延を最小限にする仕組み
• 遅れたノードがほかのノードに「待った」をかける
• 閾値の設定
53
mysql> SHOW GLOBAL VARIABLES LIKE '%flow%threshold%'...
Certification と Apply
54
11 22 33
UPDATE
CertificationCertification
http://mysqlhighavailability.com/mysql-group-replicati...
テスト
• 3台中1台に向けてベンチマークを流す
• ベンチを流しているノードと違うノードでDISK IOを絞る
55
11 22 33
sysbench
テスト結果
56
0
50
100
150
200
250
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 6...
テスト結果
57
0
50
100
150
200
250
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 6...
58
MGR 設定手順
STEP1: インストールとユーザ作成
59
• レプリケーションユーザを作成しておく
• この時点でbinlogはまだ有効化してはいけない
mysql> CREATE USER 'rpl_user'@'%' IDENTIFIED BY 'rp...
STEP2-1:レプリケーション設定
• GTID
• log-slave-updates
• {master,relay}-log-info-repository=TABLE
• binlog-format=row
60
server_id=...
STEP2-2:Group Replication 設定
61
# Group Replication の設定
transaction_write_set_extraction=XXHASH64
# SELECT UUID() で生成した任意の...
STEP3:Group Replication 開始
62
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass'
FOR CHANNEL 'grou...
STEP4:Group Replication 開始
63
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)...
STEP5:ステータス確認
64
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+---------...
MGR 制限事項
• InnoDB のみサポート
• PK or UNIQUE キーが必須
• GTID + ROW ベースレプリケーション
• トランザクション分離レベルはREAD-COMMITED
• 複数の同じテーブルに対するDDLとDM...
66
Group Replicationメリデメ
Group Replication メリット
• 構成が最もシンプル
• 物理サーバの役割が平等
• 障害検知の仕組みがビルドインされている
• 切り替わりが高速
• 切り離しだけ
• 待機系のサーバを利用できる
• レプリケーション遅延を最小...
Group Replication デメリット
• (マルチライターで使う場合)ロックの競合の考慮が必要
• InnoDBしか使えない
68
本日の内容
• DBサーバの構成パターンとメリット・デメリット
1. 共有ストレージ
2. ディスク同期(DRBD)
3. スレーブのマスター昇格
4. Group Replication
• クライアント側で意識してほしいこと
• 日本 My...
クライアント側で意識してほしいこと
• どんなにサーバ側で対策してもダウンゼロは無理
• 関係者でSLAを合意しておく
• 実装
– 正しくエラーハンドリングをする
– リトライ処理を入れる
70
71
まとめ
結局オススメどれ?
• 今からやるならGroup Replication を試してほしい
72
73
日本MySQL ユーザ会について
ご案内
• MySQL Casual Slack
• https://t.co/QobukOxvUw
74
• 日本MySQL ユーザ会 ML
• http://mysql.gr.jp/ml.html
75
ありがとうございました
Próxima SlideShare
Cargando en…5
×

OSC 2017 Osaka MySQL 落ちないDBサーバの作り方

3.501 visualizaciones

Publicado el

OSC 2017 Osaka MySQL 落ちないDBサーバの作り方

Publicado en: Tecnología
  • Sé el primero en comentar

OSC 2017 Osaka MySQL 落ちないDBサーバの作り方

  1. 1. MySQL 落ちないDBサーバの作り方 ~マスター・スレーブ構成だけじゃない~ 2017/01/28 OSC 2017 Osaka 日本MySQL ユーザ会 @mita2
  2. 2. 自己紹介 2 • 三谷 智史(Twitter: @mita2) • 日本MySQLユーザ会(MyNA) • OSCで講演は初めてです • Web系企業で、たくさんのMySQLを管理 • MySQLとの関わり 2002年~ 主に利用して開発する立場 2010年~ 主に管理する立場
  3. 3. 対象者 3 • 本日は冗長構成のパターンや考え方をご紹介します • 具体的な設定方法はあまり書いてないです • クラウドの話は出てきません・・・ • 初心者向け
  4. 4. 本日の内容 • DBサーバの構成パターンとメリット・デメリット 1. 共有ストレージ 2. ディスク同期(DRBD) 3. スレーブのマスター昇格 4. Group Replication • クライアント側で意識してほしいこと • 日本 MySQLユーザ会のご紹介 4
  5. 5. 本日の内容 • DBサーバの構成パターンとメリット・デメリット 1. 共有ストレージ 2. ディスク同期(DRBD) 3. スレーブのマスター昇格 4. Group Replication • クライアント側で意識してほしいこと • 日本 MySQLユーザ会のご紹介 5
  6. 6. クラスタソフトクラスタソフト 共有ストレージ • DBの世界では伝統的な方法 • データファイルを共有ストレージ に置く • クラスタソフトでActive/Passive の切り替え 6 共有ストレージ (SAN/NAS) 共有ストレージ (SAN/NAS) DBサーバDBサーバ DBサーバ (待機) DBサーバ (待機) ファイルファイルファイルファイルファイルファイル mysqldmysqldVIPVIP iSCSI, NFS
  7. 7. クラスターソフトウェア • 障害を検知し、リソースをスタンバイ機で立ち上げる • リソース=プロセスやIP • 代表的なソフトウェア • OSS: Pacemaker+Corosync (Heatbeat) • 商用:Veritas Cluster, SIOS Life Keeper, Oracle Clusterware, NEC CLUSERPRO etc… • 自作しようと思うと案外大変 • リソースの依存関係 • 排他制御 • 半死、スプリットブレインなど綺麗に落ちなかったときの考慮 etc… 7
  8. 8. 共有ストレージ ところで、ストレージ落ちたらどうするん? 8 クラスタソフトクラスタソフト 共有ストレージ (SAN/NAS) 共有ストレージ (SAN/NAS) DBサーバDBサーバ DBサーバ (待機) DBサーバ (待機) ファイルファイルファイルファイルファイルファイル mysqldmysqldVIPVIP iSCSI, NFS
  9. 9. 共有ストレージ SAN/NAS • 冗長性が担保されているエンタープ ライズ製品が前提 • NetApp, Dell EMC, HP, IBM etc… • エンタープライズと言っても、 比較的、安価なものもある • ブロックIOに強い製品を選ぶ – ファイルサーバ用途は不向き 9 たくさんの DISK たくさんの DISK コントローラコントローラ コントローラコントローラ たくさんの DISK たくさんの DISK スイッチスイッチ スイッチスイッチ DBサーバDBサーバ DBサーバDBサーバ ストレージの構成イメージ
  10. 10. クラッシュリカバリ • MySQLが異常終了後、起動時に行う処理 • データファイルの整合性を取り戻す • 時間は iblog(更新ログ)のサイズと更新量に依存する 10 フェイルオーバー時に起動に時間がかかる
  11. 11. 11 共有ストレージ メリ・デメ
  12. 12. 共有ストレージ メリット • 障害時のデータロストのリスクがない • レプリケーション遅延の考慮が不要 • (商用ストレージ便利) 12 MySQL 5.7でロスレス準 同期レプリの登場により 他の手段でもデータロス トなく運用可能に MySQL 5.7でロスレス準 同期レプリの登場により 他の手段でもデータロス トなく運用可能に
  13. 13. 共有ストレージ デメリット • 切り替わりに(ほかと比べて)時間がかかる • 分単位は見込んだほうが良い • ファイルシステムの破損に対応できない • バックアップで対応することになる • Web上に具体的な情報があまりない • 個人では難しい・・・ 13
  14. 14. 本日の内容 • DBサーバの構成パターンとメリット・デメリット 1. 共有ストレージ 2. ディスク同期(DRBD) 3. スレーブのマスター昇格 4. Group Replication • クライアント側で意識してほしいこと • 日本 MySQLユーザ会のご紹介 14
  15. 15. DRBD+クラスターソフトウェア • DBサーバのディスクを他筐体にミラー 15 • Distributed Replicated Block Device • ブロックデバイス(ディスク)をネット ワークを通じて複製するOSS DBサーバDBサーバ DBサーバ (待機) DBサーバ (待機) mysqldmysqldVIPVIP
  16. 16. DRBD+クラスターソフトウェア • クラスタソフトでActive/Passive の切り替え • DRBD + Pacemaker/Corosync • Oracle も公式にサポート対象 16 https://dev.mysql.com/doc/refman/5.6/ja/ha-drbd.html より引用
  17. 17. 17 ディスク同期 メリ・デメ
  18. 18. ディスク同期 メリット • 障害時のデータロストのリスクがない • レプリケーション遅延の考慮が不要 • 商用ストレージと比較して安価に始められる 18
  19. 19. ディスク同期 デメリット • 切り替わりに(ほかと比べて)時間がかかる • ファイルシステムの破損に対応できない 19
  20. 20. 参考資料 • CentOS アプライアンスでの DRBD MySQL クラスタ • http://wiki.pandorafms.com/index.php?title=Pandora:Documentation_ja:DRBD_Appliance 20
  21. 21. 本日の内容 • DBサーバの構成パターンとメリット・デメリット 1. 共有ストレージ 2. ディスク同期(DRBD) 3. スレーブのマスター昇格 4. Group Replication • クライアント側で意識してほしいこと • 日本 MySQLユーザ会のご紹介 21
  22. 22. 22 MySQL レプリケーションおさらい
  23. 23. マスター・スレーブ • レプリケーション=複製を作る • マスター • 更新を受け付けるサーバ • スレーブ • コピー、読み取り専用 • 用途 • 読み取り性能のスケールアウト • バックアップ取得用など使い分け • マスター障害の際の切り替え先 • etc… 23 マスターマスター スレーブスレーブ スレーブスレーブ クライアントクライアント
  24. 24. Global Transaction ID • トランザクションに一意のIDを付与 • サーバUUID + 連番 • 08c8c338-f529-11e3-8182-fa163e64b6a2:1 • マスターは「更新内容+GTID」をログファイルに記録 • スレーブは「どのマスター」の「どのトランザクション」 までコピーしたかを識別できる 24
  25. 25. 実際の更新ログの内容 # at 248449 #161202 14:46:59 server id 2759935033 end_log_pos 248497 CRC32 0xc9775906 GTID [commit=yes] SET @@SESSION.GTID_NEXT= '8b4227e8-b841-11e6-845c-448a5bf50581:269'/*!*/; # at 248497 #161202 14:46:59 server id 2759935033 end_log_pos 248590 CRC32 0x0892442a Query thread_id=179 exec_time=0 error_code=0 SET TIMESTAMP=1480657619/*!*/; BEGIN /*!*/; # at 248590 #161202 14:46:59 server id 2759935033 end_log_pos 248740 CRC32 0x83437cc8 Query thread_id=179 exec_time=0 error_code=0 SET TIMESTAMP=1480657619/*!*/; insert into tbl(col1) values ('Fri Dec 2 14:46:59 2016') /*!*/; # at 248740 #161202 14:46:59 server id 2759935033 end_log_pos 248771 CRC32 0x132b63f8 Xid = 1051 COMMIT/*!*/; 25
  26. 26. レプリケーションの流れ 26 • バイナリログ • 更新ログ • IOスレッド • 更新ログをマスターか ら受け取る • リレーログ • 受け取ったログ • SQLスレッド • リレーログからSQLを 読み出し、適用する ストレージ エンジン ストレージ エンジン バイナリ ログ バイナリ ログ コネクションスレッドコネクションスレッド I/O スレッド I/O スレッド リレー ログ リレー ログ ストレージ エンジン ストレージ エンジン SQL スレッド SQL スレッド マスター スレーブ ClientClient
  27. 27. スレーブを使ったフェイルオーバー マスター (a) マスター (a) スレーブ (b) スレーブ (b) スレーブ (c) スレーブ (c) aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:1 aaa-aaa:2 クライアントクライアント 1. 一番進んでいるスレーブを探す – SHOW GLOBAL VARIABLES LIKE ‘GTID_EXECUTED’ – 新マスターとする 2. スレーブでCHANGE MASTER TO MASTER_HOST=‘<NEW_MASER>’を実行し、新マスターを向ける 3. read_only を解除し、クライアントからのアクセスを新マスターに向ける マスター (a) マスター (a) 新 マスター (b) 新 マスター (b) スレーブ (c) スレーブ (c) aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:1 aaa-aaa:2 クライアントクライアント マスター (a) マスター (a) 新 マスター (b) 新 マスター (b) スレーブ (c) スレーブ (c) aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 bbb-bbb:1 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 bbb-bbb:1 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 bbb-bbb:1 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 bbb-bbb:1 クライアントクライアント
  28. 28. 一連の動作を自動で行うツールたち • ツール用のmanager サーバを別で用意 • MHA for MySQL • Master High Availability Manager and tools for MySQL • mysqlfailover • MySQL Utilities 28 マスター (a) マスター (a) スレーブ (b) スレーブ (b) スレーブ (c) スレーブ (c) aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:3 aaa-aaa:1 aaa-aaa:2 aaa-aaa:1 aaa-aaa:2 ManagerManager
  29. 29. MHA • 松信さん がつくったツール • 豊富な実績、Web上に資料が豊富 • 最近はメンテナンスモード • クラッシュセーフスレーブと組み合わせて利用できない • DBサーバへSSHを行う。DBサーバ側にもagentが必要。 29
  30. 30. mysqlfailover • Oracle 社の公式ツール • DBサーバへのSSHやagentのインストール不要 • SQLで完結 30
  31. 31. MySQL レプリケーションの種類 1. 非同期レプリケーション 2. 準同期レプリケーション – Ver 5.5~ 3. ロスレス準同期レプリケーション – Ver 5.7~ 31
  32. 32. 非同期レプリケーション 32 1. クライアントがCOMMIT 2. バイナリログに更新内容を記録 3. ストレージエンジンに更新内容 を記録 4. クライアントにACKを返す 5. リレーログに記録 ストレージ エンジン ストレージ エンジン バイナリ ログ バイナリ ログ コネクションスレッドコネクションスレッド I/O スレッド I/O スレッド リレー ログ リレー ログ ストレージ エンジン ストレージ エンジン SQL スレッド SQL スレッド マスター スレーブ ClientClient
  33. 33. 準同期レプリケーション 33 1. クライアントがCOMMIT 2. バイナリログに更新内容を記録 3. ストレージエンジンに更新内容 を記録 4. リレーログに記録 5. クライアントにACKを返す ストレージ エンジン ストレージ エンジン バイナリ ログ バイナリ ログ コネクションスレッドコネクションスレッド I/O スレッド I/O スレッド リレー ログ リレー ログ ストレージ エンジン ストレージ エンジン SQL スレッド SQL スレッド マスター スレーブ ClientClient rpl_semi_sync_master_wait_point=AFTER_COMMIT 準同期する台数を 指定できる 準同期する台数を 指定できる
  34. 34. ロスレス準同期レプリケーション 34 1. クライアントがCOMMIT 2. バイナリログに更新内容を記録 3. リレーログに記録 4. ストレージエンジンに更新内容 を記録 5. クライアントにACKを返す ストレージ エンジン ストレージ エンジン バイナリ ログ バイナリ ログ コネクションスレッドコネクションスレッド I/O スレッド I/O スレッド リレー ログ リレー ログ ストレージ エンジン ストレージ エンジン SQL スレッド SQL スレッド マスター スレーブ ClientClient rpl_semi_sync_master_wait_point=AFTER_SYNC 準同期する台数を 指定できる 準同期する台数を 指定できる
  35. 35. フェイルオーバー時のデータロスト • 非同期レプリケーション – データロストのリスクがあるが、レイテンシがない • 準同期レプリケーション – データロストのリスクはあるが小さい、レイテンシはある • ロスレス準同期レプリケーション – データロストのリスクない、レイテンシはある 35
  36. 36. 36 マスター昇格 メリデメ
  37. 37. マスター昇格 メリット • 切り替わりが早い • ファイルシステムの破損に対応できる • 安価に始められる • 待機系のサーバを利用できる • 公開されている情報が多め 37
  38. 38. マスター昇格 デメリット • レプリケーション遅延のリスクを考える必要がある 38
  39. 39. 本日の内容 • DBサーバの構成パターンとメリット・デメリット 1. 共有ストレージ 2. ディスク同期(DRBD) 3. スレーブのマスター昇格 4. Group Replication • クライアント側で意識すべきこと • 日本 MySQLユーザ会のご紹介 39
  40. 40. Group Replication • 次のメジャーバージョン(8.0) で入ると思いきや、12月の 5.7.17で入ってきたヤツ! 40
  41. 41. 高可用性ソリューション • マルチライター構成が組める • 高可用性ソリューション • 性能向上を主目的としたものではない 41 MasterMaster MasterMaster MasterMaster MasterMaster MasterMaster UPDATE t SET col = ‘B’ WHERE pk = 2 UPDATE t SET col = ‘B’ WHERE pk = 2 UPDATE t SET col = ‘A’ WHERE pk = 1 UPDATE t SET col = ‘A’ WHERE pk = 1
  42. 42. 高可用性ソリューション • マルチライター構成が組める • 高可用性ソリューション • 性能向上を主目的としたものではない 42 MasterMaster MasterMaster MasterMaster MasterMaster MasterMaster UPDATE t SET col = ‘B’ WHERE pk = 2 UPDATE t SET col = ‘B’ WHERE pk = 2 UPDATE t SET col = ‘A’ WHERE pk = 1 UPDATE t SET col = ‘A’ WHERE pk = 1
  43. 43. マルチライター 43 マスター (a) マスター (a) スレーブスレーブ スレーブスレーブ マスター (a) マスター (a) マスターマスター マスターマスター Read Write Read Write Read Write Read Write Read Write Read Write これまでのレプリケーション Group Replication WriteWrite ReadRead ReadRead
  44. 44. 障害検知の仕組みがビルドイン 44 MasterMaster MasterMaster MasterMaster MasterMaster MasterMaster • 障害を自動検知し、データ同期対象から切り離す • 復旧時には差分を自動的にリカバリ
  45. 45. 45 Group Replication とロックの挙動
  46. 46. 非 Group Replication 構成の場合 46 時間 行の値 トランザクション1 トランザクション2 T1 - mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE grplt.tbl SET col1 = 10, who_update = ‘A' WHERE pk = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 T2 - mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE grplt.tbl SET col1 = 10, who_update = ‘B' WHERE pk = 1; T3 - トランザクション1のロック開放待ち T4 A mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) トランザクション1のロック開放待ち T5 A Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 T6 B mysql> COMMIT; Query OK, 0 rows affected (0.00 sec)
  47. 47. 非 Group Replication 構成の場合 47 時間 行の値 トランザクション1 トランザクション2 T1 - mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE grplt.tbl SET col1 = 10, who_update = ‘A' WHERE pk = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 T2 - mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE grplt.tbl SET col1 = 10, who_update = ‘B' WHERE pk = 1; T3 - トンラザクション1のロック開放待ち T4 A mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) トランザクション1のロック開放待ち T5 A Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 T6 B mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) • 更新は1ノード(マスター)に対してのみ実行可 • ロックが競合した場合、後続は「待つ」 • 更新は1ノード(マスター)に対してのみ実行可 • ロックが競合した場合、後続は「待つ」
  48. 48. Group Replication 構成の場合 48 時間 行の値 トランザクション1 on ノード1 トランザクション2 on ノード2 T1 - mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE grplt.tbl SET col1 = 10, who_update = ‘A' WHERE pk = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 T2 - mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE grplt.tbl SET col1 = 10, who_update = ‘B' WHERE pk = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 T3 A mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) (ノード1の更新内容が伝わってくる) T4 A mysql> COMMIT; ERROR 1180 (HY000): Got error 149 during COMMIT
  49. 49. Group Replication 構成の場合 49 時間 行の値 トランザクション1 on ノード1 トランザクション2 on ノード2 T1 - mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE grplt.tbl SET col1 = 10, who_update = ‘A' WHERE pk = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 T2 - mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE grplt.tbl SET col1 = 10, who_update = ‘B' WHERE pk = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 T3 A mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) T4 A mysql> COMMIT; ERROR 1180 (HY000): Got error 149 during COMMIT • 異なるノードでロックが競合した場合、「先取り」 • 更新量が少なければ多くはリトライで解決する • 同じノードであれば、非GR構成と同じ挙動 • 異なるノードでロックが競合した場合、「先取り」 • 更新量が少なければ多くはリトライで解決する • 同じノードであれば、非GR構成と同じ挙動
  50. 50. 回避方法 50 MasterMaster Read only Master Read only Master Read only Master Read only Master Single Primary モード • 従来のマスター/スレーブに相当 • 任意の1台のみWriteが可能になる MasterMaster MasterMaster MasterMaster Multi Writer モード • 全部に読み書き • 最大限の可用性 group_replication_single_primary_mode=FALSEgroup_replication_single_primary_mode=TRUE
  51. 51. 分散方法 • MySQL Router • Oracle 純正 • Version 2.1 でサポートされる予定 • まだ正式リリースされてない • HA Proxy • OSSのソフトウェアロードバランサ • Group Replication 用の ヘルスチェックスクリプトがある • http://lefred.be/content/mysql-group-replication-as-ha- solution/ 51 マスター (a) マスター (a) マスターマスター マスターマスター Load BalancerLoad Balancer ClientClient
  52. 52. 52 flow control
  53. 53. flow control • ノード間の遅延を最小限にする仕組み • 遅れたノードがほかのノードに「待った」をかける • 閾値の設定 53 mysql> SHOW GLOBAL VARIABLES LIKE '%flow%threshold%'; +----------------------------------------------------+-------+ | Variable_name | Value | +----------------------------------------------------+-------+ | group_replication_flow_control_applier_threshold | 1000 | | group_replication_flow_control_certifier_threshold | 2000 | +----------------------------------------------------+-------+
  54. 54. Certification と Apply 54 11 22 33 UPDATE CertificationCertification http://mysqlhighavailability.com/mysql-group-replication-transaction-life-cycle-explained/ CertificationCertification ApplyApply OK OK 更新する内容 を伝える 更新する内容 を伝える ApplyApply ApplyApply
  55. 55. テスト • 3台中1台に向けてベンチマークを流す • ベンチを流しているノードと違うノードでDISK IOを絞る 55 11 22 33 sysbench
  56. 56. テスト結果 56 0 50 100 150 200 250 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 sysbench oltp TPS → 時間 IO制限
  57. 57. テスト結果 57 0 50 100 150 200 250 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 sysbench oltp TPS → 時間 キュー が閾値 に達す るまで の時間 キュー が閾値 に達す るまで の時間
  58. 58. 58 MGR 設定手順
  59. 59. STEP1: インストールとユーザ作成 59 • レプリケーションユーザを作成しておく • この時点でbinlogはまだ有効化してはいけない mysql> CREATE USER 'rpl_user'@'%' IDENTIFIED BY 'rpl_pass'; mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  60. 60. STEP2-1:レプリケーション設定 • GTID • log-slave-updates • {master,relay}-log-info-repository=TABLE • binlog-format=row 60 server_id=1 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW
  61. 61. STEP2-2:Group Replication 設定 61 # Group Replication の設定 transaction_write_set_extraction=XXHASH64 # SELECT UUID() で生成した任意のUUIDを指定 loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7" loose-group_replication_start_on_boot=off # 自分のIPアドレス loose-group_replication_local_address= "172.21.134.26:24901" # すべてのサーバを並べる loose-group_replication_group_seeds= "172.21.134.26:24901,172.21.134.27:24901,172.21.134.28:24901" loose-group_replication_bootstrap_group= off loose-group_replication_single_primary_mode=FALSE loose-group_replication_enforce_update_everywhere_checks= TRUE # サーバ間の通信に利用するネットワークを許可する loose-group_replication_ip_whitelist = 172.21.134.0/23
  62. 62. STEP3:Group Replication 開始 62 mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass' FOR CHANNEL 'group_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; Query OK, 0 rows affected (0,01 sec) mysql> SHOW PLUGINS; | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | | validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so | +--------------------+--------+-------------------+----------------------+ 46 rows in set (0.01 sec) • group_replication_recovery を設定
  63. 63. STEP4:Group Replication 開始 63 mysql> SET GLOBAL group_replication_bootstrap_group=ON; Query OK, 0 rows affected (0.00 sec) mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (1.76 sec) mysql> SET GLOBAL group_replication_bootstrap_group=OFF; Query OK, 0 rows affected (0.00 sec) • group_replication_bootstrap_group=ON は最初の1台だけ
  64. 64. STEP5:ステータス確認 64 mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+----------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_STATE | +---------------------------+----------------------+-------------+--------------+ | group_replication_applier | 0cdd0b6a-cd84-<snip> | gr02 | ONLINE | | group_replication_applier | 1edf2e1d-cd83-<snip> | gr01 | ONLINE | | group_replication_applier | a1c37edb-cd89-<snip> | gr03 | ONLINE | +---------------------------+----------------------+-------------+--------------+ 3 rows in set (0.00 sec)
  65. 65. MGR 制限事項 • InnoDB のみサポート • PK or UNIQUE キーが必須 • GTID + ROW ベースレプリケーション • トランザクション分離レベルはREAD-COMMITED • 複数の同じテーブルに対するDDLとDMLはサポート外 65 ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin
  66. 66. 66 Group Replicationメリデメ
  67. 67. Group Replication メリット • 構成が最もシンプル • 物理サーバの役割が平等 • 障害検知の仕組みがビルドインされている • 切り替わりが高速 • 切り離しだけ • 待機系のサーバを利用できる • レプリケーション遅延を最小限に抑えることが可能 67
  68. 68. Group Replication デメリット • (マルチライターで使う場合)ロックの競合の考慮が必要 • InnoDBしか使えない 68
  69. 69. 本日の内容 • DBサーバの構成パターンとメリット・デメリット 1. 共有ストレージ 2. ディスク同期(DRBD) 3. スレーブのマスター昇格 4. Group Replication • クライアント側で意識してほしいこと • 日本 MySQLユーザ会のご紹介 69
  70. 70. クライアント側で意識してほしいこと • どんなにサーバ側で対策してもダウンゼロは無理 • 関係者でSLAを合意しておく • 実装 – 正しくエラーハンドリングをする – リトライ処理を入れる 70
  71. 71. 71 まとめ
  72. 72. 結局オススメどれ? • 今からやるならGroup Replication を試してほしい 72
  73. 73. 73 日本MySQL ユーザ会について
  74. 74. ご案内 • MySQL Casual Slack • https://t.co/QobukOxvUw 74 • 日本MySQL ユーザ会 ML • http://mysql.gr.jp/ml.html
  75. 75. 75 ありがとうございました

×