LoginSignup
11
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-16

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

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のソースを読んで解説してる人のスライドをみると、以下のことがかかれていました。GTID有効にするにはってのも考えないとアカンようですね。

・MTS & Statement-Based Replication & 非決定性クエリの組み合わせはダメゼッタイ
  →MIXEDなら大丈夫そうかな
  日々の覚書: MySQLのNOW関数はどのようにして安全にスレーブでリプレイされるのか
・MTS & READ UNCOMMITTED の組み合わせもヤバイ
  →デフォルトのREPEATABLE READからこれに変えてることは考えにくいので気にしなくてもいいかも
  トランザクション分離レベルについて極力分かりやすく解説してみた[SQL] - 明日になったら本気出せる
  MySQL :: MySQL 5.7 Reference Manual :: 13.3.6 SET TRANSACTION Syntax
・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
MySQL 5.7 トラブルシューティング 性能解析入門編

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」
MySQL 5.7以後のレプリケーションのデフォルト値(MySQL High Availabilityより) | Yakst
What's New in MySQL 5.7 Replication - SSSSLIDE (P24)
MySQL5.7におけるレプリケーションの改良 – variable.jp [データベース,パフォーマンス,運用]
MySQL5.7 GA の Multi-threaded slave
MySQL Community Server 5.7.18がリリースされました | MySQLチューニング/保守サポート/コンサルティングのスマートスタイル
Q&A:MySQL 5.6とMySQL 5.7のマルチスレッドレプリケーション - DZone Java(英語)
Jean-François Gagné's MySQL Blog: Replication crash safety with MTS in MySQL 5.6 and 5.7: reality or illusion?
SLAVE_PARALLEL_WORKERSの調整と遅延確認 – variable.jp [データベース,パフォーマンス,運用]
MySQLのマルチスレッドスレーブにおけるSTOP SLAVEの改善(MySQL High Availabilityより) | Yakst
GitHub - yokogawa-k/mysql-5.6-multi-threaded-slave: MySQL 5.6 の Multi-Threaded Slave に関する調査記録

GTID関連
大規模環境でMySQLのGTIDを適用して得られた教訓 | Yakst
MySQL5.6でGTIDレプリケーションの導入手順と解除手順 - FAT47の底辺インフラ議事録
MySQL-5.6.5の新機能「GTID」を使う際に抑えておきたい落とし穴 - Y-Ken Studio
MySQL 5.7 GTID レプリケーション設定メモ | あぱーブログ
日々の覚書: MySQL 5.7.6でGTIDのローリング有効化ができるようになったので、システム全体を一度にシャットダウンしなくてもOK
MySQL5.7でMHAとmysqlfailover試した - よくある日記
20151207_02_MySQL_Replication_for_Beginners

11
5
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5