Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

smallpalace
プログラミングはしょしんしゃです。サーバインフラはだいたい10年ちょっと。 閲覧ありがとうございます:-)
http://smallpalace.hatenablog.com/
Colorkrew
東京・秋葉原にあるIT企業、株式会社Colorkrew。 ”世界のシゴトをたのしくするビジョナリーカンパニー”をビジョンに掲げています。 管理職0(ゼロ)、階層0(ナシ)、 チーム力∞(無限大)の組織運営、バリフラットモデルを策定・導入。OpenWork(旧Vorkers)が選ぶ自由主義で個性を活かす企業、性格のいい会社に上位ランクイン!
https://www.colorkrew.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away