MySQL5.7でMTSしたいときのパラメータを調べたメモ

運用した結果ではない調べただけの備忘録になります。

MTSはマルチスレッドスレーブ。スレーブへの同期のスレッドを複数にしたいというときの話。
5.7からは改良されている模様。詳しくは下の方の参考リンク先をどうぞご覧ください。

```
[mysqld]
slave_parallel_workers = 32 
# CPUコア数かスキーマ数の低い方といってる人がいてそのベンチ結果はこの指定が少ないとCPUが忙しそうというものも
# 最適な値は環境次第のようなので自分でベンチしたほうがよさそう。
slave_parallel_type = LOGICAL_CLOCK
# デフォがDATABASEだけどそれにするメリットはないとあり、
# LOGICAL_CLOCKはマスタでグループコミットがされない限り並列処理できないとも書いてた。
# で、LOGICAL_CLOCKモード使うにはマスタも5.7でないとダメ、で、マスタの2つのパラメータ
# binlog_group_commit_sync_delay,binlog_group_commit_sync_no_delay_countを環境ごとに調整するとよいそう。
slave_preserve_commit_order=1
# マスタでのコミット順序をslaveでも維持するというやつです。デフォは0で無効、これは1にするべきらしい。
log_bin=mysql-bin
log_slave_updates=1
#バイナリログ出すよってのとスレーブもマスタになれるようにバイナリログ出しとく（解説するまでもなさげですが）
```
ほかにSBRじゃないほうがいいとか見た気がするけどマルチソースマスタの話だったかもしれない、と思いきや[MTSのソースを読んで解説してる人のスライド](https://www.slideshare.net/takanorisejima/mysql57-ga-multithreaded-slave)をみると、以下のことがかかれていました。GTID有効にするにはってのも考えないとアカンようですね。

・MTS & Statement-Based Replication & 非決定性クエリの組み合わせはダメゼッタイ
　　→MIXEDなら大丈夫そうかな
　　[日々の覚書: MySQLのNOW関数はどのようにして安全にスレーブでリプレイされるのか](https://yoku0825.blogspot.jp/2016/12/mysqlnow.html)
・MTS & READ UNCOMMITTED の組み合わせもヤバイ
　　→デフォルトのREPEATABLE READからこれに変えてることは考えにくいので気にしなくてもいいかも
　　[トランザクション分離レベルについて極力分かりやすく解説してみた[SQL] - 明日になったら本気出せる](http://gyouza-daisuki.hatenablog.com/entry/2013/11/19/150838)
　　[MySQL :: MySQL 5.7 Reference Manual :: 13.3.6 SET TRANSACTION Syntax](https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html)
・MTS使うときは 5.7でも GTID推奨（SET GLOBAL sql_slave_skip_counter =N; を運用上使いたいなら、GTID有効にするのが無難）
・max_allowed_packet いじってるなら、slave_pending_jobs_size_max も見なおそう

relay_log_info_repository='TABLE'にしたほうがいいとかもみた。（クラッシュセーフにするやつ）
seconds_behind_masterがリレーログのローテートの時に空になるのは5.7.18からなおってる模様。

![IMG_6870.JPG](https://qiita-image-store.s3.amazonaws.com/0/25031/8f43a231-0e71-220a-f0d3-47977b3b770f.jpeg)
[MySQL 5.7 トラブルシューティング 性能解析入門編](https://www.slideshare.net/nippondanji/mysql-57-77003983)

GTID有効にするなら以下のような設定が要るというのと、InnoDBのみ、CREATE..SELECTできない、トランザクション内ではCREATE TEMPORARY TABLE と DROP TEMPORARY TABLEはサポートされない、スキップがめんどう（sql_slave_skip_counter不可でgtid_next 変数をつかう）、マスタもスレーブもgtidをつかう（ローリングアップデート可）、運用が慣れない、CHANGE MASTER文を打つ際にポジション番号を指定しなくていい、mhaのほかにmysqlfailoverもつかえる、というような特徴が。

```
##### GTIDに必要な設定 #####
log-bin= mysql-bin
log-slave-update
gtid-mode = ON
enforce-gtid-consistency
master_info_repository = TABLE
relay_log_info_repository = TABLE
report_host=ホスト名
```

####参考
※5.6の旧い情報は下の方になっております。
[「詳解MySQL5.7」](https://www.amazon.co.jp/dp/B01LCJRCYE/) 
[MySQL 5.7以後のレプリケーションのデフォルト値(MySQL High Availabilityより) | Yakst](https://yakst.com/ja/posts/3726)
[What's New in MySQL 5.7 Replication - SSSSLIDE](http://sssslide.com/www.slideshare.net/nippondanji/whats-new-in-mysql-57-replication)   （P24）
[MySQL5.7におけるレプリケーションの改良 – variable.jp [データベース,パフォーマンス,運用]](https://goo.gl/gQyehE)
[MySQL5.7 GA の Multi-threaded slave](https://www.slideshare.net/takanorisejima/mysql57-ga-multithreaded-slave)
[MySQL Community Server 5.7.18がリリースされました | MySQLチューニング/保守サポート/コンサルティングのスマートスタイル](http://www.s-style.co.jp/mysql_news/mysql/mysql-community-server-5-7-18%E3%81%8C%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F.html)
[Q＆A：MySQL 5.6とMySQL 5.7のマルチスレッドレプリケーション - DZone Java(英語)](https://dzone.com/articles/qa-multi-threaded-replication)
[Jean-François Gagné's MySQL Blog: Replication crash safety with MTS in MySQL 5.6 and 5.7: reality or illusion?](http://jfg-mysql.blogspot.jp/2016/01/replication-crash-safety-with-mts.html)
[SLAVE_PARALLEL_WORKERSの調整と遅延確認 – variable.jp [データベース,パフォーマンス,運用]](http://variable.jp/2016/12/14/slave_parallel_workers/)
[MySQLのマルチスレッドスレーブにおけるSTOP SLAVEの改善(MySQL High Availabilityより) | Yakst](https://yakst.com/ja/posts/3835)
[GitHub - yokogawa-k/mysql-5.6-multi-threaded-slave: MySQL 5.6 の Multi-Threaded Slave に関する調査記録](https://github.com/yokogawa-k/mysql-5.6-multi-threaded-slave)

GTID関連
[大規模環境でMySQLのGTIDを適用して得られた教訓 | Yakst](https://yakst.com/ja/posts/896)
[MySQL5.6でGTIDレプリケーションの導入手順と解除手順 - FAT47の底辺インフラ議事録](http://d.hatena.ne.jp/fat47/20130607/1370590036)
[MySQL-5.6.5の新機能「GTID」を使う際に抑えておきたい落とし穴 - Y-Ken Studio](http://y-ken.hatenablog.com/entry/mysql-using-gtid-checklist)
[MySQL 5.7 GTID レプリケーション設定メモ | あぱーブログ](https://blog.apar.jp/linux/6725/)
[日々の覚書: MySQL 5.7.6でGTIDのローリング有効化ができるようになったので、システム全体を一度にシャットダウンしなくてもOK](https://yoku0825.blogspot.jp/2015/03/mysql-576gtidok.html)
[MySQL5.7でMHAとmysqlfailover試した - よくある日記](http://kenoha.hatenablog.com/entry/2016/12/16/062855)
[20151207_02_MySQL_Replication_for_Beginners](https://downloads.mysql.com/presentations/20151207_02_MySQL_Replication_for_Beginners.pdf)