N対1 レプリケーション
+ Optimizer Hint
2015/11/20
MySQL Casual Talks vol.8
do_aki
@do_aki
@do_aki
http://do-aki.net/
Master
A
Master
C
Slave
A+B+C
N:1 Replication
Master
B
Master
A
Master
C
Slave
A+B+C
N:1 Replication
Master
B
Master
A
Master
C
Slave
A+B+C
N:1 Replication
Master
B
Master
A
Master
C
Slave
A+B+C
N:1 Replication
Master
B
Master
A
Master
C
Slave
A+B+C
N:1 Replication
Master
B
Master
A
Master
C
Slave
A+B+C
N:1 Replication
Master
B
N1Repl
近況報告
動いてます
無停止稼働1年 通算4年
Multi-source Replication
on MySQL 5.7 GA
https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html
Master
A
Master
C
Slave
A+B+C
Multi-source Replication
Master
B
Master
A
Master
C
Slave
A+B+C
Multi-source Replication
Master
B
channel1 channel2
channel3
Master
A
Master
C
Slave
A+B+C
Multi-source Replication
Master
B
channel1 channel2
channel3
GTID 不要!
Use The Multi-source
Replication, Luke.
/******************
*
* “いつもの”
* ここまで
*
*******************/
突然ですが
query
cache
• SET query_cache_type = 0; // OFF
• SET query_cache_type = 1; // ON
• SET query_cache_type = 2; // DEMAND
• SELECT SQL_CACHE * FROM xxx ……
• SELECT SQL_NO_CACHE * FROM xxx ……
ステートメント単位で制御でき
るといえば
Optimizer Hints (>=5.7)
• optimizer_switch => Global/Session
• Optimizer Hints => Statement
• SELECT /*+ HINT(target)*/ * FROM …
• INSERT … SELECT /*+ HINT */ …
• UPDATE /*+ HINT */ …
Optimizer Hints Available BKA/NO_BKA
 BNL/NO_BNL
 MRR/NO_MRR
 NO_ICP
 NO_RANGE_OPTIMIZATION
 蝉SEMIJOIN / NO_SEMIJOIN
 SUBQUERY
 QB_NAME
 MAX_EXECUTION_TIME
SELECT SQL_NO_CACHE /*+ HINT */ * FROM …
SELECT /*+ HINT */ SQL_NO_CACHE * FROM …
SELECT /*+ HINT */ /*!40001 SQL_CACHE */
FROM …
SELECT /*+ HINT *//*!40001 SQL_CACHE */
FROM …
SELECT SQL_NO_CACHE /*+ HINT */ * FROM …
SELECT /*+ HINT */ SQL_NO_CACHE * FROM …
SELECT /*+ HINT */ /*!40001 SQL_CACHE */
FROM …
SELECT /*+ HINT *//*!40001 SQL_CACHE */
FROM …
NG: Hint が SELECT の直後でないので効かない
OK
OK
NG: スラッシュが連続するためパースエラー
query cache からすると別クエリ
SELECT
/*+ MAX_EXECUTION_TIME(1000) */
SQL_CACHE * FROM table;
SELECT
/*+ MAX_EXECUTION_TIME(2000) */
SQL_CACHE * FROM table;
MAX_EXECUTION_TIME
• クエリ実行にタイムアウトを設定
• 5.7.8 より前は MAX_STATEMENT_TIME
mysql> SELECT /*+ MAX_EXECUTION_TIME(1000) */ *
FROM big_table;
ERROR 3024 (HY000): Query execution was
interrupted, maximum statement execution time
exceeded
MySQL5.7 じゃないけど
MAX_EXECUTION_TIME
を使いたい人に
• N:1 Replication 今も動いてるよ
• Optimizer Hint 便利だね
• MySQL5.7 なくても、クエリ単位でタイ
ムアウト設定できるよ
おしまい

N対1 レプリケーション + Optimizer Hint

Editor's Notes

  • #17 近況といえば MySQL5.7GA 先月リリースされましたが めでたく、Multi-Source Replication も正式に搭載されました
  • #19 Replication Channnel https://dev.mysql.com/doc/refman/5.7/en/replication-channels.html
  • #20  Lab 版の時は GTID 必須だったような気がしたのだけど、 GA では GTID 無くても、バイナリログベースでのレプリケーションが可能 (= マスターが古いバージョンでも動く!)
  • #21 今のところの結論はこんな感じ。 もし今の N:1 Repl を止めるようなことがあれば 5.7 を検討するつもり。
  • #24 ちょっとでもテーブルに変更が入るとキャッシュがクリアされるおおざっぱさとか コメントがわずかに異なるだけでキャッシュされなくなる繊細さとか 小規模で書き込みが少ないうちは、これ設定するだけで安全にパフォーマンスを上げられる
  • #25 セッション/グローバルでの設定 + クエリ単位でキャッシュの制御ができる ただし、細かいことを考え出したらクエリキャッシュから離脱するシグナル