Upgrade to Pro — share decks privately, control downloads, hide ads and more …

(続)MySQL Group Replication

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

(続)MySQL Group Replication

Avatar for Satoshi MITANI

Satoshi MITANI

February 01, 2017
Tweet

More Decks by Satoshi MITANI

Other Decks in Technology

Transcript

  1. 5.7 GAとは何だったのか履歴 • 5.7.11 InnoDB Tablespace encryption • 5.7.12 X

    Protocol, MySQL Document Store • 5.7.17 new! Group Replication 9
  2. 5.7 GAとは何だったのか履歴 • 5.7.11 InnoDB Tablespace encryption • 5.7.12 X

    Protocol, MySQL Document Store • 5.7.17 new! Group Replication 10
  3. 自己紹介 • 三谷 智史(@mita2) • MySQL DBA • 最近の興味 •

    OpenStack Trove • Percona XtraDB Cluster • Group Replication 11
  4. 高可用性ソリューション • マルチライター構成が組める • 高可用性ソリューション • 性能向上を主目的としたものではない 14 Master Master

    Master Master Master Master Master Master Master Master 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
  5. 自動リカバリー 15 Master Master Master Master Master Master Master Master

    Master Master • 障害を自動検知し、データ同期対象から切り離す • 復旧時には差分を自動的にリカバリ
  6. 構成パターン 16 Master Master Read only Master Read only Master

    Read only Master Read only Master Single Primary • 従来のマスター/スレーブに相当 • 任意の1台のみWriteが可能になる Master Master Master Master Master Master Multi Writer 構成 • 全部に読み書き • 最大限の可用性 group_replication_single_primary_mode=FALSE group_replication_single_primary_mode=TRUE
  7. レプリケーション 19 • いつものレプリケーションは普段は動かない mysql> SHOW SLAVE STATUS FOR CHANNEL

    'group_replication_recovery' ¥G *************************** 1. row *************************** Slave_IO_State: Master_Host: <NULL> Master_User: rpl_user Master_Port: 0 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: gr01.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: Slave_IO_Running: No Slave_SQL_Running: No
  8. Master Master Master Master Master Master Master Master Master Master

    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 Full GTID Support 20 • どこに書いても同じUUIDのGTIDが発行される • group_replication_group_name で指定したものがUUIDになる aaa-bbb-111:10 ⇒ pk=1 col=A aaa-bbb-111:20 ⇒ pk=2 col=B aaa-bbb-111:10 ⇒ pk=1 col=A aaa-bbb-111:20 ⇒ pk=2 col=B binlog
  9. 非 Group Replication 構成の場合 時間 行の値 トランザクション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)
  10. 非 Group Replication 構成の場合 時間 行の値 トランザクション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ノード(マスター)に対してのみ実行可 • ロックが競合した場合、後続は「待つ」
  11. Group Replication 構成の場合 30 時間 行の値 トランザクション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
  12. Group Replication 構成の場合 31 時間 行の値 トランザクション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構成と同じ挙動 • ロックの挙動を変えたくなければ、Single-Primary で運用 • 異なるノードでロックが競合した場合、「先勝ち」 • 同じノードであれば、非GR構成と同じ挙動 • ロックの挙動を変えたくなければ、Single-Primary で運用
  13. ノードダウン後の挙動 • 自動的に同期対象から外れる • キャッチアップするまでは「RECOVERING」ステータス 33 mysql> SELECT * FROM

    performance_schema.replication_group_members¥G *************************** 1. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: b8be95fe-18d0-11e6-ac6f-70e2840d82f2 MEMBER_HOST: gr01 MEMBER_PORT: 3306 MEMBER_STATE: ONLINE *************************** 2. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: f95aeb40-18d2-11e6-8b47-70e2840d82cc MEMBER_HOST: gr0 MEMBER_PORT: 3306 MEMBER_STATE: RECOVERING 2 rows in set (0.00 sec)
  14. • いつものレプリケーションはリカバリー時にうごく 34 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery'

    executed'. Previous state master_host='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host=‘gr02', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''. [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery' executed'. Previous state master_host='samitani-gr02.db.ssk.ynwm.yahoo.co.jp', master_port= 3306, master_log_file='', master_log_pos=4, master_bind=''. New state master_host='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''. • リカバリ開始 • リカバリ完了
  15. すでにbinlogがなくなってるパターン • MGR では binlog が既にpurgeされているとあきらめる • ノード追加時は既存ノードからのデータコピーが必要 36 [ERROR]

    Slave I/O for channel 'group_replication_recovery': Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.', Error_code: 1236 [ERROR] Plugin group_replication reported: 'Maximum number of retries when trying to connect to a donor reached. Aborting group replication recovery.' [Note] Plugin group_replication reported: 'Terminating existing group replication donor connection and purging the corresponding logs.' [ERROR] Plugin group_replication reported: 'Fatal error during the Recovery process of Group Replication. The server will leave the group.'
  16. mysqldump に注意 • MGR は Savepoint をサポートしてない • --single-transacation が使えない

    ※ 38 -bash-4.1$ mysqldump --all-databases --single-transaction -uroot --triggers --routines --events -p mysqldump: Couldn't execute 'SAVEPOINT sp': The MySQL server is running with the --transaction-write-set-extraction!=OFF option so it cannot execute this statement (1290) • (一貫性のあるバックアップを取るために) --lock-all-tables を使う @yyamasaki1 がFRしてくれている https://bugs.mysql.com/bug.php?id=81494
  17. mysqldump に注意 • --lock-all-tables は 書き込みがブロックされる • mysqldump するノードは外す必要がある •

    スレーブがあればスレーブからでも可 39 Master Master Master Master Master Master LB LB mysqldump
  18. Split Brain とは • クラスターが複数のセットに分断されてしまうこと • どっちを生かすか? • 「過半数を生かす」戦略が一般的 •

    MGRでは3台以上での構成必須 41 1 1 2 2 3 3 Client Client 他の2台が 見えなくなった! 自分はリクエストを 受け続けるべき だろうか? 他の2台が 見えなくなった! 自分はリクエストを 受け続けるべき だろうか?
  19. 少数派では更新がブロックされる mysql> SELECT * FROM tbl; +------+ | c1 |

    +------+ | 0 | +------+ 4 rows in set (0.00 sec) mysql> INSERT INTO tbl VALUES(1); (タイムアウト) Group Replication Group Replication gr03 gr03 gr02 gr02 gr01 gr01 mysql> SELECT MEMBER_HOST,MEMBER_STATE FROM performance_schema.replication_group_members; +-------------+--------------+ | MEMBER_HOST | MEMBER_STATE | +-------------+--------------+ | gr02 | UNREACHABLE | | gr01 | ONLINE | ★ | gr03 | UNREACHABLE | +-------------+--------------+ 3 rows in set (0.00 sec) 遅れたデータ 遅れたデータ
  20. 多数派のほうは継続稼動 mysql> SELECT * FROM tbl; +------+ | c1 |

    +------+ | 2 | +------+ 4 rows in set (0.00 sec) mysql> INSERT INTO tbl VALUES(1); Query OK, 1 row affected (0.00 sec) Group Replication Group Replication gr03 gr03 gr02 gr02 gr01 gr01 mysql> SELECT MEMBER_HOST,MEMBER_STATE FROM performance_schema.replication_group_members; +-------------+--------------+ | MEMBER_HOST | MEMBER_STATE | +-------------+--------------+ | gr02 | ONLINE | | gr03 | ONLINE | +-------------+--------------+ 2 rows in set (0.00 sec)
  21. Split Brain を意識した判定 45 mysql> SELECT MEMBER_HOST,MEMBER_STATE FROM performance_schema.replication_group_members; +-------------+--------------+

    | MEMBER_HOST | MEMBER_STATE | +-------------+--------------+ | gr02 | UNREACHABLE | | gr01 | ONLINE | | gr03 | UNREACHABLE | +-------------+--------------+ 3 rows in set (0.00 sec) SELECT COUNT(*) / 2 FROM replication_group_members SELECT COUNT(*) FROM replication_group_members WHERE MEMBER_STATE == ‘ONLINE’ < そのノードから見えている、生きているノードが過半数か判定
  22. flow control • ノード間の遅延を最小限にする仕組み • 遅れたノードがほかのノードに「待った」をかける • 閾値の設定 48 mysql>

    SHOW GLOBAL VARIABLES LIKE '%flow%threshold%'; +----------------------------------------------------+-------+ | Variable_name | Value | +----------------------------------------------------+-------+ | group_replication_flow_control_applier_threshold | 1000 | | group_replication_flow_control_certifier_threshold | 2000 | +----------------------------------------------------+-------+
  23. Certification と Apply 49 1 1 2 2 3 3

    UPDATE Certification Certification http://mysqlhighavailability.com/mysql-group-replication-transaction-life-cycle-explained/ Certification Certification Apply Apply OK OK 更新する内容 を伝える 更新する内容 を伝える Apply Apply Apply Apply Certification Certification
  24. テスト結果 51 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制限
  25. テスト結果 52 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 → 時間 キュー が閾値 に達す るまで の時間 キュー が閾値 に達す るまで の時間
  26. flow control の発動確認 • flow control が発動したことを確かめる方法が見あたらず • member_stats を定期的にモニターしておく?

    53 mysql> select * from performance_schema.replication_group_member_stats¥G *************************** 1. row *************************** CHANNEL_NAME: group_replication_applier VIEW_ID: 14848273670723157:18 MEMBER_ID: a1c37edb-cd89-11e6-a463-fa163e49d992 COUNT_TRANSACTIONS_IN_QUEUE: 0 COUNT_TRANSACTIONS_CHECKED: 33847 COUNT_CONFLICTS_DETECTED: 0 COUNT_TRANSACTIONS_ROWS_VALIDATING: 16220 TRANSACTIONS_COMMITTED_ALL_MEMBERS: 87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7:1- 47917:1012952-1017941:2017563-2080097 LAST_CONFLICT_FREE_TRANSACTION: 87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7:67719
  27. STEP2-1:レプリケーション設定 • GTID • log-slave-updates • {master,relay}-log-info-repository=TABLE • binlog-format=row 56

    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
  28. STEP2-2:Group Replication 設定 57 # 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
  29. STEP3:Group Replication 開始 58 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 を設定
  30. STEP3:Group Replication 開始 59 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 を設定 内部で使うユーザが作成される CREATE USER '_gr_user'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*7CF5CA9067EC647187EB99FCC27548FBE4839AE3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT LOCK
  31. STEP4:Group Replication 開始 60 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台だけ
  32. STEP5:ステータス確認 61 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)
  33. MGR 制限事項 • InnoDB のみサポート • PK or UNIQUE キーが必須

    • GTID + ROW ベースレプリケーション • トランザクション分離レベルはREAD-COMMITED • 複数の同じテーブルに対するDDLとDMLの同時複数ノード実行はサ ポート外 62 ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin
  34. Galera Cluster、従来構成 との比較表 Group Replication Galera Cluster 通常のマスター昇格 1 マルチライター

    対応 対応 非対応 2 データ同期の仕組み GTID Replication base wsrepl GTID or 非GTID 3 バイナリログ 必須 必須ではない 必須 4 ストレージエンジン InnoDB のみ InnoDB のみ 制限なし 5 ノード間の ロック仕組み 楽観的ロック (First Commit Wins) 楽観的ロック (First Commit Wins) 競合しない ※ マルチライターではない 6 AutoIncr 衝突回避 ◦ 自動 ◦ 自動 - 7 自動リトライ ◦ × × 7 クラスタリングや フェイルオーバ機構 ビルドイン(XCom) ビルドイン (Galera) ビルドインされない ※ 自分で用意 8 自動リカバリ(差分) ◦ ◦ (IST) ◦ レプリケーション 9 自動リカバリ(全体) × ◦ (SST) × 10 SplitBrain 対応 ◦ 対応 ◦ 対応 × 自分で考える 11 ステータス確認 performance_schema GLOBAL STATUS performance_schema or SHOW 12 提供形態 ◦ プラグイン △ 別製品。互換性はあり。 - 13 最新バージョン 5.7 GA Galera 5.7 GA Percona Cluster 5.7 GA MariaDB Cluster 10.1 GA MySQL 5.7 GA Percona 5.7 GA MariaDB 10.1 GA 64