SlideShare una empresa de Scribd logo
1 de 63
Descargar para leer sin conexión
Art Of MySQL Replicaton
                      〜 10 年の歴史を誇るレプリケーションの妙技〜




 奥野 幹也
 @nippondanji
 mikiya (dot) okuno (at) gmail (dot) com
免責事項
●
    本プレゼンテーションにおいて示されている見解は、
    私自身の見解であって、オラクル・コーポレーション
    の見解を必ずしも反映したものではありません。ご了
    承ください。
自己紹介
●
    今日は個人として来ています。
    –   http://nippondanji.blogspot.com/
    –   Twitter: @nippondanji
●
    現職は MySQL サポートエンジニア。
    –   2000 年にサン・マイクロシステムズ入社
    –   2007 年に MySQL KK へ転職
    –   気付くとまたサン・マイクロシステムズに・・・
    –   現在は日本オラクルに在席。
●
    日々のしごと
    –   MySQL トラブルシューティング全般
    –   Q&A 回答
        など
レプリケーションの
  仕組み!!
レプリケーションの仕組み
レプリケーションの仕組み
●
    マスターとスレーブが同じデータを持っている。
    –   同じデータに対して同じ SQL 文を実行すれば、同じ
         結果になるんじゃね?
          ●
              不定なヤツはどうするの?( RAND() とか。)
●
    マスターの更新はバイナリログに記録する。
    –   バイナリログってなにもの?!
●
    スレーブの 2 つのスレッド
    –   I/O スレッド : マスターからバイナリログのデータを
          受け取ってリレーログへ記録
    –   SQL スレッド : リレーログの中身を実行
設定方法概要
●
    マスターでバイナリログを有効化
●
    マスター上にレプリケーション用のユーザーを作成す
    る。
●
    マスターのデータをスレーブにコピー
     –   mysqldump --master-data=2 ...
●
    マスターとスレーブで server_id を設定
●
    スレーブの設定
     –   CHANGE MASTER TO ...
     –   START SLAVE;
レプリケーション進化の軌跡
●
    バージョン 3.23
     –   シングルスレッド
     –   ステートメントベース
●
    バージョン 4.0
     –   バイナリログの受信と適用が別スレッドに
            ●
                遅延の解消!
●
    バージョン 5.1
     –   行ベースレプリケーション
     –   MySQL Cluster レプリケーション
●
    バージョン 5.5
     –   Semi-Synchronous!!
Semi-Synchronous
 レプリケーション
免責事項 - その 2
●
    現時点( 2010 年 7 月)の段階では、 MySQL 5.5 は
    マイルストーンリリース( β 版)です。機能や実装
    については、予告無く変更される場合がありますので
    ご注意ください。
トポロジのお話。
利用可能なトポロジ
   Master/Slave                           Dual Master

Master           Slave              Master           Master




                           Cascading

          Master            Slave          Slave



                                                Circular
           1:N
                                       Master
                   Slave
  Master
                                                           Master



             Slave


  Slave                                  Master
さらにその組み合わせ

  Slave

                                           Slave



Slave           Master

                                                   Slave
                               Master


  Slave

                                               Slave
                  Master
                                   Slave



                           Slave
        Slave
                 Slave
                                           Slave
バイナリログ!
バイナリログのレイアウト

                タイムスタンプ               4 バイト
                タイプコード                1 バイト
 ヘッダ            サーバ ID                4 バイト
                イベント長                 4 バイト
                次イベント開始位置             4 バイト
イベント            フラグ                   2 バイト
 データ            追加ヘッダ                 可変長( 0 〜 x )




http://forge.mysql.com/wiki/MySQL_Internals_Binary_Log
バイナリログフォーマットの種類

フォーマット   説明                サイズ   Non-      Trigger
                                 determi
                                 nistic
SBR      ステートメント( SQL 文)   小
         がそのままバイナリログ
         に記録される。                   ×         ○
         更新されたデータそのも       大
                                   ○         ×
RBR
         のが記録される。

                           小
                                   ○
MBR      SBR と RBR を状況に
         応じて切り換える。                           △
Non-deterministic って?
●
    非決定性な SQL 文=実行するたびに結果が変わる可能性
    がある。
    –   UUID() 、 UUID_SHORT()
    –   USER()
    –   FOUND_ROWS()
    –   LOAD_FILE()
    –   SYSDATE()
    –   GET_LOCK() 、 RELEASE_LOCK()
    –   IS_FREE_LOCK() 、 IS_USED_LOCK()
    –   MASTER_POS_WAIT()
    –   SLEEP()
    –   VERSION()
    –   ソートなしの LIMIT 句
    –   UDF 、非決定性のストアドプロシージャ / ファンクション
    –   INFORMATION_SCHEMA の参照
    –   READ-COMMITTED/READ-UNCOMMITTED
SBR でも OK!!
●
    NOW()
     –   バイナリログに記録されたタイムスタンプを利用する
          ことで、スレーブでも同じ時刻に!
     –   SYSDATE() は実時間なので非決定性
●
    RAND()
     –   シードをバイナリログに記録。スレーブ側ではシード
          を元に同じ乱数を生成
●
    LOAD DATA INFILE
     –   ファイルをスレーブへ転送
●
    REPEATABLE-READ
     –   本来、順番に実行すると同じ結果になるという保証が
          あるのは SERIALIZABLE だけでは?
     –   Next-key Locking!! ファントムよ、さようなら。
InnoDB の分離レベル

分離レベル          分離性   性能   ダーティ   反復不可能読   ファントム
                          リード    み取り

READ-           低     低   O      O        O
UNCOMMITTED

READ-                 高   X      O        O
COMMITTED

REPEATABLE-           高   X      X        X
READ


SERIALIZABLE    高     低   X      X        X
バイナリログの管理
●
    有効化 --log-bin=binlog
●
    一覧表示 SHOW BINARY LOGS;
●
    中見
     –   SHOW BINLOG EVENTS IN 'binlog.000001'
     –   mysqlbinlog binlog.000001
●
    削除 PURGE BINARY LOGS TO 'binlog.000002'
●
    自動削除 --expire-logs-days=30
負荷の分離!
マスターから負荷のかかる操作を分離
       アプリケーション




                        マスター
           マスター   HA
                       スタンバイ




                               バックアップ

           スレーブ         スレーブ


 レポーティング
ワンポイントアドバイス
●
    レポート作成中は SQL スレッドを停止しておく。
     –   STOP SLAVE SQL_THREAD
     –   レポート作成がスムーズに!
     –   バイナリログだけは受け取っておく!
●
    --dump-slave オプション
     –   MySQL 5.5 の mysqldump コマンドに実装。
     –   マスター上で --master-data オプションを使ったとき
          と同じ効果。
特定のデータを捨てる。

マスター           スレーブ




  TABLE 1   TABLE 1

 INNODB     INNODB




 TABLE 2    TABLE 2
             Black
 INNODB      hole
スレーブ de トリガ

マスター           スレーブ




         SBR   Black
INNODB         hole



トリガなし。



               トリガ実行
スケールアウト!
スケールアウト戦略
           更新処理




アプリケーション



                            マスター




            スレーブ   スレーブ   スレーブ   スレーブ   スレーブ   スレーブ

  参照処理
気合いの多段構成

                          マスター




         スレーブ   スレーブ   スレーブ スレーブ   スレーブ   スレーブ




スレーブ   スレーブ   スレーブ スレーブ   スレーブ   スレーブ
Sharding

                                更新処理




         マスター                    マスター                    マスター




スレーブ   スレーブ スレーブ スレーブ   スレーブ   スレーブ スレーブ スレーブ   スレーブ   スレーブ スレーブ スレーブ
High-
Availability
スレーブを待機系に使う。
●
    利点
    –   HA と違ってリカバリ不要!
          ●
              超高速フェイルオーバー
    –   レプリケーションはデフォルトで使える機能
●
    課題
    –   非同期だから最後に更新したデータを一部失う覚悟が
          必要。
    –   1:N 構成では昇格に工夫が必要。
    –   自動化。

                   マスター     更新    スレーブ

                            非同期
Semi-Synchronous
 レプリケーション
InnoDB のログを同期しないという選択
●
    innodb_fush_log_at_trx_commit=0
●
    スレーブに更新が転送されてるから
             失うものは何も無い!
●
    マスタークラッシュ時にはマスターのデータは破棄
     –   スレーブからデータを再度転送・同期
ベンチマーク結果
600                                         sysbench
                                        MySQL 5.5.5-m3
                                        Athlon 64 2 Core
500
                                         7200rpm SATA
                                          Gigabit Ether
400                                        単位 : TPS


300                                     ディスク同期あり
                                        ディスク同期なし
200



100



  0
      Normal    Semi-Sync   Read-Only
スレーブの昇格!
●
    何が問題か?
    –   1:N 構成
           ●
               スレーブ間に差異が生じてしまう。
           ●
               レプリケーションが成立するためには、開始時には
                 同じデータでなければならない。
           ●
               --log-slave-updates をしても、スレーブのバイナリ
                 ログの位置はマスターの位置とズレがある。
                  –   イベントのサイズが違う!!
           ●
               スレーブを自動的に同期する方法はない。
スレーブ間の差異:一般的な解決法
●
    スレーブ間の差異を無視する。(運がよければ大丈夫・・・)
●
    マスターの OS が再起動するのを待って、マスター上のバイナ
    リログから差異を抽出する。
     – クラッシュ時にバイナリログが欠損すると使えない。
     – --sync-binlog=1 は遅い。
●
    スレーブ上のバイナリログを活用する: --log-slave-updates
     –   頑張ってスクリプト書く書くしかじか?!
     –   Auto-inc カラムを使って目印に。
●
    Global Transaction ID
     –   自動化が出来る素晴らしい!けど・・・
     –   Google Patch の適用が必要。
     –   MySQL 5.0 しか対応してないよね・・・
スレーブ間の差異をなくす新手順
●
    Xid を使おう!
     –   XA トランザクションの ID という意味だが、 XA でな
          いトランザクションを利用していると、 COMMIT
          時にバイナリログに記録される。
     –   マスターの query_id (単調増加の 64 ビット整数)
           ●
               マスターが再起動しない限り ID が被らない!
     –   リレーログにもそっくり同じ Xid が記録される。
           ●
               リレーログの差異を特定できる!!
Xid イベント
BEGIN
/*!*/;
# at 174
#100723 0:21:27 server id 1 end_log_pos 269
Query thread_id=8 exec_time=0 error_code=0
use test/*!*/;
SET TIMESTAMP=1279812087/*!*/;
insert into t2 values(1),(2),(3)
/*!*/;
# at 269
#100723 0:21:27 server id 1 end_log_pos 296
Xid = 73
COMMIT/*!*/;
DELIMITER ;
手順その1
●
    前提
    –   1:N 構成
    –   XA トランザクションは使用しない。
    –   InnoDB を利用する。
●
    リレーログの設定
    –   リレーログを一定期間保存: relay_log_purge=0
    –   合計サイズの上限: relay_log_space_limit=1G
    –   各ファイルサイズ: max_relay_log_size=64M
    –   ファイル名を分かり易く: relay_log=relay-bin
    –   スレーブのバイナリログは空にしておく:
         log_slave_updates=0
手順その2
●
    マスターがクラッシュ!
    –   スレーブのデータは同期していない(差分がある)も
         のとします。
●
    各スレーブのリレーログに含まれる Xid を調べて、
    「最も進んでいるスレーブ」を特定する。
    –   DDL など、 Xid が含まれないイベントが最後尾にある
         場合には、イベントの数をカウントする。
    –   SHOW SLAVE STATUS を使っても OK
●
    「最も進んでいるスレーブ」を新たなマスターとし
    て、更新を開始する。
    –   新マスターのバイナリログは、昇格前は空。
手順その3
●
    全てのスレーブにおいて、リレーログの適用が終わるのを
    待つ。
●
    mysqlbinlog コマンドで、「最も進んでいるスレーブ」の
    リレーログから各スレーブごとの差分を抜き出す。
●
    差分を各スレーブに適用する。
     –   適用が完了した時点ではどのスレーブも同じデータ。
●
    CHANGE MASTER TO でレプリケーションを開始!
     –   新マスターは、昇格する前のバイナリログは空なので、バ
          イナリログに含まれるのは「昇格後になされた更新すべ
          て」
     –   スレーブはバイナリログを最初から全て適用すればよい
     –   CHANGE MASTER TO でファイル名とポジションの指定
          が不要!!
スレーブ昇格手順の課題
●
    mysqlbinlog コマンドは Xid を使って開始位置を指定
    することが出来ない。
●
    Xid は単調増加ではない。
     –   query_id は単調増加。
     –   query_id はクエリ開始時につけられる。
     –   クエリ終了時点では順序が入れ替わってるかも。
●
    現時点ではまだ PoC
     –   さっさとスクリプト書こうず。
●
    監視
ディザスタ
リカバリ!
拠点間でレプリケーション!
●
    データ圧縮!!
    –   slave_compressed_protocol=0
    –   貴重な帯域を節約しましょう。
●
    暗号化して送信
    –   CHANGE MASTER TO で SSL オプションを指定。
    –   クラウドでも安心!
    –   SSL の設定方法については鍵の本 P.441 を。
●
    非同期で。
    –   レイテンシーが大きいので Semi-Sync は使っちゃダ
         メ。
拠点間でレプリケーションの図




       インターネット

       更新 (圧縮+暗号化)         スレーブ
マスター

                     非同期
MySQL
Cluster!!
MySQL Cluster 概要
        アプリケーション




 SQL      SQL      SQL
 ノード      ノード      ノード


                           管理
         NDB API
                          ノード

データ                データ     管理
ノード                ノード    ノード




  データ               データ
  ノード               ノード
MySQL Cluster Replication
        SQL ノード
 更
 新


         Binlog write             更新
 NDB
                         binlog          スレーブ
ストレージ   Injector
エンジン




データ                     データ       ●
                                       通常のレプリケーショ
ノード                     ノード            ンと同じプロトコル
                                  ●
                                       RBR のみ
                                  ●
                                       競合検出機能 !!
  データ                    データ
  ノード                    ノード
苦手な JOIN を克服する!!
                アプリケーション         JOIN
       更新



       マスター
                            スレーブ
SQL    SQL    SQL          INNODB
ノード    ノード    ノード


データ           データ           スレーブ
ノード           ノード
                           INNODB



 データ           データ
 ノード           ノード          スレーブ
                           INNODB


                             :
                             :
PBXT!!
Engine Level Replication?
        更
        新


     マスター                         スレーブ            ●
                                                      MVCC Snapshot Transfer
                                                  ●
                                                      Asynchronous Replication
                                                  ●
                                                      Synchronous Replication
                                                        – Real-time feedback
                                                        – No log fush
        binlog                    relay-log             – Bi-directional




         PBXT                    PBXT




http://pbxt.blogspot.com/2010/03/pbxt-engine-level-replication-works.html
課題!
できないこと。
●
    並列化
●
    マルチソースレプリケーション
●
    行単位でフィルタリング
SPIDER ストレージエンジン

APP1     APP2     APP3     APP4

 n1       n2       n3       n4
SPIDER   SPIDER   SPIDER   SPIDER




 n5       n6       n7       n8

INNODB   INNODB   INNODB   INNODB
パラレルレプリケーション!
APP1     APP2              APP3     APP4
 n1       n2                n3       n4
SPIDER   SPIDER            SPIDER   SPIDER




 n5       n6                n7       n8
INNODB   INNODB            INNODB   INNODB



slave    slave             slave    slave
INNODB   INNODB            INNODB   INNODB



                  SPIDER
                  slave
マルチソースレプリケーション
        Multi Master


   Master           Master




        Multi Source


   Master           Master




            Slave
偽マルチソースレプリケーション
 更
 新

マスター    スレーブ 1   スレーブ 2



 DB 1    DB 1     DB 1




         DB2      DB2




          更
          新
SPIDER によるマルチソース


 Master            Master




 Slave             Slave
 SPIDER            SPIDER




           Slave

          INNODB
行単位のフィルタリング

マスター                   スレーブ




         SBR   Black
INNODB         hole



トリガなし。
                       更新
                              INNODB

               トリガ実行
まとめ!
様々な利用シーン

 Master           Slave       Master


     高可用性
                                               バックアップ

                                             Slave
                              Slave

                          レポーティング


                                               Slave
                                    Master



           Internet                          Slave
Master    圧縮+暗号化      Slave

                                    Slave
   ディザスタリカバリ                                 スケールアウト
まとめ


  MySQL 人気の秘訣
 レプリケーションは
 やっぱり凄かった!
デフォルトで使えるのに!
    簡単なのに!
Q!!
           &
ご静聴ありがとうございました。
                  A!!

Más contenido relacionado

La actualidad más candente

ROS2勉強会 4章前半
ROS2勉強会 4章前半ROS2勉強会 4章前半
ROS2勉強会 4章前半tomohiro kuwano
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツShuyo Nakatani
 
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)Kensuke Otsuki
 
画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量takaya imai
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型信之 岩永
 
(修正)機械学習デザインパターン(ML Design Patterns)の解説
(修正)機械学習デザインパターン(ML Design Patterns)の解説(修正)機械学習デザインパターン(ML Design Patterns)の解説
(修正)機械学習デザインパターン(ML Design Patterns)の解説Hironori Washizaki
 
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​SSII
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術yoku0825
 
階層ベイズによるワンToワンマーケティング入門
階層ベイズによるワンToワンマーケティング入門階層ベイズによるワンToワンマーケティング入門
階層ベイズによるワンToワンマーケティング入門shima o
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークke-m kamekoopa
 
Marp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライドMarp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライドIosif Takakura
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端Takuya Akiba
 
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe SYSTEMS DESIGN Co.,Ltd. Japan)
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe  SYSTEMS DESIGN Co.,Ltd. Japan) ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe  SYSTEMS DESIGN Co.,Ltd. Japan)
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe SYSTEMS DESIGN Co.,Ltd. Japan) 聡 鳥谷部
 
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)Yusuke Kaneko
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニングyoku0825
 

La actualidad más candente (20)

Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
ROS2勉強会 4章前半
ROS2勉強会 4章前半ROS2勉強会 4章前半
ROS2勉強会 4章前半
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
 
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
 
画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
(修正)機械学習デザインパターン(ML Design Patterns)の解説
(修正)機械学習デザインパターン(ML Design Patterns)の解説(修正)機械学習デザインパターン(ML Design Patterns)の解説
(修正)機械学習デザインパターン(ML Design Patterns)の解説
 
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
SSII2022 [SS1] ニューラル3D表現の最新動向〜 ニューラルネットでなんでも表せる?? 〜​
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
 
階層ベイズによるワンToワンマーケティング入門
階層ベイズによるワンToワンマーケティング入門階層ベイズによるワンToワンマーケティング入門
階層ベイズによるワンToワンマーケティング入門
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
 
Marp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライドMarp for VS Code で作る PowerPoint スライド
Marp for VS Code で作る PowerPoint スライド
 
show innodb status
show innodb statusshow innodb status
show innodb status
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端
 
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe SYSTEMS DESIGN Co.,Ltd. Japan)
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe  SYSTEMS DESIGN Co.,Ltd. Japan) ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe  SYSTEMS DESIGN Co.,Ltd. Japan)
ハンドノート T字形ERモデル セミナー資料 (Author; S.Toriyabe SYSTEMS DESIGN Co.,Ltd. Japan)
 
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
 

Similar a Art of MySQL Replication.

MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012Mikiya Okuno
 
MySQLトラブル解析入門
MySQLトラブル解析入門MySQLトラブル解析入門
MySQLトラブル解析入門Mikiya Okuno
 
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会Mikiya Okuno
 
JPUGしくみ+アプリケーション勉強会(第25回)
JPUGしくみ+アプリケーション勉強会(第25回)JPUGしくみ+アプリケーション勉強会(第25回)
JPUGしくみ+アプリケーション勉強会(第25回)Yoshinori Nakanishi
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMikiya Okuno
 
続マスタN対スレーブ1レプリケーションの作り方
続マスタN対スレーブ1レプリケーションの作り方続マスタN対スレーブ1レプリケーションの作り方
続マスタN対スレーブ1レプリケーションの作り方do_aki
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例Naoto MATSUMOTO
 
PostgreSQL 9.0 in OSC@Tokyo,Okinawa
PostgreSQL 9.0 in OSC@Tokyo,OkinawaPostgreSQL 9.0 in OSC@Tokyo,Okinawa
PostgreSQL 9.0 in OSC@Tokyo,OkinawaTakahiro Itagaki
 
Using Chef for Infrastructure Automation of Ameba Pigg
Using Chef for Infrastructure Automation of Ameba PiggUsing Chef for Infrastructure Automation of Ameba Pigg
Using Chef for Infrastructure Automation of Ameba PiggYuuki Namikawa
 
MongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualMongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualYasuhiro Matsuo
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話Yoshinori Matsunobu
 
What's New in MySQL 5.7 Replication
What's New in MySQL 5.7 ReplicationWhat's New in MySQL 5.7 Replication
What's New in MySQL 5.7 ReplicationMikiya Okuno
 
Chefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてYuuki Namikawa
 
オープンソース・データベースの最新事情
オープンソース・データベースの最新事情オープンソース・データベースの最新事情
オープンソース・データベースの最新事情Meiji Kimura
 
Pacemaker+PostgreSQLレプリケーションで共有ディスクレス高信頼クラスタの構築@OSC 2013 Tokyo/Spring
Pacemaker+PostgreSQLレプリケーションで共有ディスクレス高信頼クラスタの構築@OSC 2013 Tokyo/SpringPacemaker+PostgreSQLレプリケーションで共有ディスクレス高信頼クラスタの構築@OSC 2013 Tokyo/Spring
Pacemaker+PostgreSQLレプリケーションで共有ディスクレス高信頼クラスタの構築@OSC 2013 Tokyo/SpringTakatoshi Matsuo
 
Aurora MySQL HandMade Major VersionUp
Aurora MySQL HandMade Major VersionUpAurora MySQL HandMade Major VersionUp
Aurora MySQL HandMade Major VersionUpTakafumi Nakahara
 
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSSYahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSSYahoo!デベロッパーネットワーク
 
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話Takahiro Okumura
 

Similar a Art of MySQL Replication. (20)

MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012
 
MySQLトラブル解析入門
MySQLトラブル解析入門MySQLトラブル解析入門
MySQLトラブル解析入門
 
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
 
JPUGしくみ+アプリケーション勉強会(第25回)
JPUGしくみ+アプリケーション勉強会(第25回)JPUGしくみ+アプリケーション勉強会(第25回)
JPUGしくみ+アプリケーション勉強会(第25回)
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatech
 
続マスタN対スレーブ1レプリケーションの作り方
続マスタN対スレーブ1レプリケーションの作り方続マスタN対スレーブ1レプリケーションの作り方
続マスタN対スレーブ1レプリケーションの作り方
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例
 
MHA, Murakumo & Me
MHA, Murakumo & MeMHA, Murakumo & Me
MHA, Murakumo & Me
 
PostgreSQL 9.0 in OSC@Tokyo,Okinawa
PostgreSQL 9.0 in OSC@Tokyo,OkinawaPostgreSQL 9.0 in OSC@Tokyo,Okinawa
PostgreSQL 9.0 in OSC@Tokyo,Okinawa
 
Using Chef for Infrastructure Automation of Ameba Pigg
Using Chef for Infrastructure Automation of Ameba PiggUsing Chef for Infrastructure Automation of Ameba Pigg
Using Chef for Infrastructure Automation of Ameba Pigg
 
MongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasualMongoDB on EC2 #mongodbcasual
MongoDB on EC2 #mongodbcasual
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
What's New in MySQL 5.7 Replication
What's New in MySQL 5.7 ReplicationWhat's New in MySQL 5.7 Replication
What's New in MySQL 5.7 Replication
 
Chefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについてChefを利用した運用省力化とDevOpsの取り組みについて
Chefを利用した運用省力化とDevOpsの取り組みについて
 
MySQL at Yahoo! JAPAN #dbts2018
MySQL at Yahoo! JAPAN #dbts2018MySQL at Yahoo! JAPAN #dbts2018
MySQL at Yahoo! JAPAN #dbts2018
 
オープンソース・データベースの最新事情
オープンソース・データベースの最新事情オープンソース・データベースの最新事情
オープンソース・データベースの最新事情
 
Pacemaker+PostgreSQLレプリケーションで共有ディスクレス高信頼クラスタの構築@OSC 2013 Tokyo/Spring
Pacemaker+PostgreSQLレプリケーションで共有ディスクレス高信頼クラスタの構築@OSC 2013 Tokyo/SpringPacemaker+PostgreSQLレプリケーションで共有ディスクレス高信頼クラスタの構築@OSC 2013 Tokyo/Spring
Pacemaker+PostgreSQLレプリケーションで共有ディスクレス高信頼クラスタの構築@OSC 2013 Tokyo/Spring
 
Aurora MySQL HandMade Major VersionUp
Aurora MySQL HandMade Major VersionUpAurora MySQL HandMade Major VersionUp
Aurora MySQL HandMade Major VersionUp
 
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSSYahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
 
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
MySQL 4.0で9年動き続けたサーバを リプレイスしてバージョンアップした話
 

Más de Mikiya Okuno

MySQL Cluster 新機能解説 7.5 and beyond
MySQL Cluster 新機能解説 7.5 and beyondMySQL Cluster 新機能解説 7.5 and beyond
MySQL Cluster 新機能解説 7.5 and beyondMikiya Okuno
 
MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編Mikiya Okuno
 
私は如何にして詳解 MySQL 5.7を執筆するに至ったか
私は如何にして詳解 MySQL 5.7を執筆するに至ったか私は如何にして詳解 MySQL 5.7を執筆するに至ったか
私は如何にして詳解 MySQL 5.7を執筆するに至ったかMikiya Okuno
 
リレーショナルデータベースとの上手な付き合い方
リレーショナルデータベースとの上手な付き合い方リレーショナルデータベースとの上手な付き合い方
リレーショナルデータベースとの上手な付き合い方Mikiya Okuno
 
リレーショナルデータベースとの上手な付き合い方 long version
リレーショナルデータベースとの上手な付き合い方 long version リレーショナルデータベースとの上手な付き合い方 long version
リレーショナルデータベースとの上手な付き合い方 long version Mikiya Okuno
 
What's New in MySQL 5.7 Security
What's New in MySQL 5.7 SecurityWhat's New in MySQL 5.7 Security
What's New in MySQL 5.7 SecurityMikiya Okuno
 
とあるギークのキーボード遍歴
とあるギークのキーボード遍歴とあるギークのキーボード遍歴
とあるギークのキーボード遍歴Mikiya Okuno
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座Mikiya Okuno
 
What's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDBWhat's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDBMikiya Okuno
 
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015Mikiya Okuno
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
なぜ、いまリレーショナルモデルなのか
なぜ、いまリレーショナルモデルなのかなぜ、いまリレーショナルモデルなのか
なぜ、いまリレーショナルモデルなのかMikiya Okuno
 
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜Mikiya Okuno
 
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06Mikiya Okuno
 
人類は如何にして大切な データベースを守るべきか
人類は如何にして大切な データベースを守るべきか人類は如何にして大切な データベースを守るべきか
人類は如何にして大切な データベースを守るべきかMikiya Okuno
 
RDBにおけるバリデーションをリレーショナルモデルから考える
RDBにおけるバリデーションをリレーショナルモデルから考えるRDBにおけるバリデーションをリレーショナルモデルから考える
RDBにおけるバリデーションをリレーショナルモデルから考えるMikiya Okuno
 
リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計Mikiya Okuno
 
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルあなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルMikiya Okuno
 
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09Mikiya Okuno
 

Más de Mikiya Okuno (20)

MySQL Cluster 新機能解説 7.5 and beyond
MySQL Cluster 新機能解説 7.5 and beyondMySQL Cluster 新機能解説 7.5 and beyond
MySQL Cluster 新機能解説 7.5 and beyond
 
MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編
 
私は如何にして詳解 MySQL 5.7を執筆するに至ったか
私は如何にして詳解 MySQL 5.7を執筆するに至ったか私は如何にして詳解 MySQL 5.7を執筆するに至ったか
私は如何にして詳解 MySQL 5.7を執筆するに至ったか
 
リレーショナルデータベースとの上手な付き合い方
リレーショナルデータベースとの上手な付き合い方リレーショナルデータベースとの上手な付き合い方
リレーショナルデータベースとの上手な付き合い方
 
リレーショナルデータベースとの上手な付き合い方 long version
リレーショナルデータベースとの上手な付き合い方 long version リレーショナルデータベースとの上手な付き合い方 long version
リレーショナルデータベースとの上手な付き合い方 long version
 
What's New in MySQL 5.7 Security
What's New in MySQL 5.7 SecurityWhat's New in MySQL 5.7 Security
What's New in MySQL 5.7 Security
 
とあるギークのキーボード遍歴
とあるギークのキーボード遍歴とあるギークのキーボード遍歴
とあるギークのキーボード遍歴
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座
 
What's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDBWhat's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDB
 
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
なぜ、いまリレーショナルモデルなのか
なぜ、いまリレーショナルモデルなのかなぜ、いまリレーショナルモデルなのか
なぜ、いまリレーショナルモデルなのか
 
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
 
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
 
人類は如何にして大切な データベースを守るべきか
人類は如何にして大切な データベースを守るべきか人類は如何にして大切な データベースを守るべきか
人類は如何にして大切な データベースを守るべきか
 
RDBにおけるバリデーションをリレーショナルモデルから考える
RDBにおけるバリデーションをリレーショナルモデルから考えるRDBにおけるバリデーションをリレーショナルモデルから考える
RDBにおけるバリデーションをリレーショナルモデルから考える
 
リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計
 
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルあなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
 
Mysql toranomaki
Mysql toranomakiMysql toranomaki
Mysql toranomaki
 
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
 

Art of MySQL Replication.

  • 1. Art Of MySQL Replicaton 〜 10 年の歴史を誇るレプリケーションの妙技〜 奥野 幹也 @nippondanji mikiya (dot) okuno (at) gmail (dot) com
  • 2. 免責事項 ● 本プレゼンテーションにおいて示されている見解は、 私自身の見解であって、オラクル・コーポレーション の見解を必ずしも反映したものではありません。ご了 承ください。
  • 3. 自己紹介 ● 今日は個人として来ています。 – http://nippondanji.blogspot.com/ – Twitter: @nippondanji ● 現職は MySQL サポートエンジニア。 – 2000 年にサン・マイクロシステムズ入社 – 2007 年に MySQL KK へ転職 – 気付くとまたサン・マイクロシステムズに・・・ – 現在は日本オラクルに在席。 ● 日々のしごと – MySQL トラブルシューティング全般 – Q&A 回答 など
  • 6. レプリケーションの仕組み ● マスターとスレーブが同じデータを持っている。 – 同じデータに対して同じ SQL 文を実行すれば、同じ 結果になるんじゃね? ● 不定なヤツはどうするの?( RAND() とか。) ● マスターの更新はバイナリログに記録する。 – バイナリログってなにもの?! ● スレーブの 2 つのスレッド – I/O スレッド : マスターからバイナリログのデータを 受け取ってリレーログへ記録 – SQL スレッド : リレーログの中身を実行
  • 7. 設定方法概要 ● マスターでバイナリログを有効化 ● マスター上にレプリケーション用のユーザーを作成す る。 ● マスターのデータをスレーブにコピー – mysqldump --master-data=2 ... ● マスターとスレーブで server_id を設定 ● スレーブの設定 – CHANGE MASTER TO ... – START SLAVE;
  • 8. レプリケーション進化の軌跡 ● バージョン 3.23 – シングルスレッド – ステートメントベース ● バージョン 4.0 – バイナリログの受信と適用が別スレッドに ● 遅延の解消! ● バージョン 5.1 – 行ベースレプリケーション – MySQL Cluster レプリケーション ● バージョン 5.5 – Semi-Synchronous!!
  • 10. 免責事項 - その 2 ● 現時点( 2010 年 7 月)の段階では、 MySQL 5.5 は マイルストーンリリース( β 版)です。機能や実装 については、予告無く変更される場合がありますので ご注意ください。
  • 12. 利用可能なトポロジ Master/Slave Dual Master Master Slave Master Master Cascading Master Slave Slave Circular 1:N Master Slave Master Master Slave Slave Master
  • 13. さらにその組み合わせ Slave Slave Slave Master Slave Master Slave Slave Master Slave Slave Slave Slave Slave
  • 15. バイナリログのレイアウト タイムスタンプ 4 バイト タイプコード 1 バイト ヘッダ サーバ ID 4 バイト イベント長 4 バイト 次イベント開始位置 4 バイト イベント フラグ 2 バイト データ 追加ヘッダ 可変長( 0 〜 x ) http://forge.mysql.com/wiki/MySQL_Internals_Binary_Log
  • 16. バイナリログフォーマットの種類 フォーマット 説明 サイズ Non- Trigger determi nistic SBR ステートメント( SQL 文) 小 がそのままバイナリログ に記録される。 × ○ 更新されたデータそのも 大 ○ × RBR のが記録される。 小 ○ MBR SBR と RBR を状況に 応じて切り換える。 △
  • 17. Non-deterministic って? ● 非決定性な SQL 文=実行するたびに結果が変わる可能性 がある。 – UUID() 、 UUID_SHORT() – USER() – FOUND_ROWS() – LOAD_FILE() – SYSDATE() – GET_LOCK() 、 RELEASE_LOCK() – IS_FREE_LOCK() 、 IS_USED_LOCK() – MASTER_POS_WAIT() – SLEEP() – VERSION() – ソートなしの LIMIT 句 – UDF 、非決定性のストアドプロシージャ / ファンクション – INFORMATION_SCHEMA の参照 – READ-COMMITTED/READ-UNCOMMITTED
  • 18. SBR でも OK!! ● NOW() – バイナリログに記録されたタイムスタンプを利用する ことで、スレーブでも同じ時刻に! – SYSDATE() は実時間なので非決定性 ● RAND() – シードをバイナリログに記録。スレーブ側ではシード を元に同じ乱数を生成 ● LOAD DATA INFILE – ファイルをスレーブへ転送 ● REPEATABLE-READ – 本来、順番に実行すると同じ結果になるという保証が あるのは SERIALIZABLE だけでは? – Next-key Locking!! ファントムよ、さようなら。
  • 19. InnoDB の分離レベル 分離レベル 分離性 性能 ダーティ 反復不可能読 ファントム リード み取り READ- 低 低 O O O UNCOMMITTED READ- 高 X O O COMMITTED REPEATABLE- 高 X X X READ SERIALIZABLE 高 低 X X X
  • 20. バイナリログの管理 ● 有効化 --log-bin=binlog ● 一覧表示 SHOW BINARY LOGS; ● 中見 – SHOW BINLOG EVENTS IN 'binlog.000001' – mysqlbinlog binlog.000001 ● 削除 PURGE BINARY LOGS TO 'binlog.000002' ● 自動削除 --expire-logs-days=30
  • 22. マスターから負荷のかかる操作を分離 アプリケーション マスター マスター HA スタンバイ バックアップ スレーブ スレーブ レポーティング
  • 23. ワンポイントアドバイス ● レポート作成中は SQL スレッドを停止しておく。 – STOP SLAVE SQL_THREAD – レポート作成がスムーズに! – バイナリログだけは受け取っておく! ● --dump-slave オプション – MySQL 5.5 の mysqldump コマンドに実装。 – マスター上で --master-data オプションを使ったとき と同じ効果。
  • 24. 特定のデータを捨てる。 マスター スレーブ TABLE 1 TABLE 1 INNODB INNODB TABLE 2 TABLE 2 Black INNODB hole
  • 25. スレーブ de トリガ マスター スレーブ SBR Black INNODB hole トリガなし。 トリガ実行
  • 27. スケールアウト戦略 更新処理 アプリケーション マスター スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ 参照処理
  • 28. 気合いの多段構成 マスター スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ
  • 29. Sharding 更新処理 マスター マスター マスター スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ スレーブ
  • 31. スレーブを待機系に使う。 ● 利点 – HA と違ってリカバリ不要! ● 超高速フェイルオーバー – レプリケーションはデフォルトで使える機能 ● 課題 – 非同期だから最後に更新したデータを一部失う覚悟が 必要。 – 1:N 構成では昇格に工夫が必要。 – 自動化。 マスター 更新 スレーブ 非同期
  • 33. InnoDB のログを同期しないという選択 ● innodb_fush_log_at_trx_commit=0 ● スレーブに更新が転送されてるから 失うものは何も無い! ● マスタークラッシュ時にはマスターのデータは破棄 – スレーブからデータを再度転送・同期
  • 34. ベンチマーク結果 600 sysbench MySQL 5.5.5-m3 Athlon 64 2 Core 500 7200rpm SATA Gigabit Ether 400 単位 : TPS 300 ディスク同期あり ディスク同期なし 200 100 0 Normal Semi-Sync Read-Only
  • 35. スレーブの昇格! ● 何が問題か? – 1:N 構成 ● スレーブ間に差異が生じてしまう。 ● レプリケーションが成立するためには、開始時には 同じデータでなければならない。 ● --log-slave-updates をしても、スレーブのバイナリ ログの位置はマスターの位置とズレがある。 – イベントのサイズが違う!! ● スレーブを自動的に同期する方法はない。
  • 36. スレーブ間の差異:一般的な解決法 ● スレーブ間の差異を無視する。(運がよければ大丈夫・・・) ● マスターの OS が再起動するのを待って、マスター上のバイナ リログから差異を抽出する。 – クラッシュ時にバイナリログが欠損すると使えない。 – --sync-binlog=1 は遅い。 ● スレーブ上のバイナリログを活用する: --log-slave-updates – 頑張ってスクリプト書く書くしかじか?! – Auto-inc カラムを使って目印に。 ● Global Transaction ID – 自動化が出来る素晴らしい!けど・・・ – Google Patch の適用が必要。 – MySQL 5.0 しか対応してないよね・・・
  • 37. スレーブ間の差異をなくす新手順 ● Xid を使おう! – XA トランザクションの ID という意味だが、 XA でな いトランザクションを利用していると、 COMMIT 時にバイナリログに記録される。 – マスターの query_id (単調増加の 64 ビット整数) ● マスターが再起動しない限り ID が被らない! – リレーログにもそっくり同じ Xid が記録される。 ● リレーログの差異を特定できる!!
  • 38. Xid イベント BEGIN /*!*/; # at 174 #100723 0:21:27 server id 1 end_log_pos 269 Query thread_id=8 exec_time=0 error_code=0 use test/*!*/; SET TIMESTAMP=1279812087/*!*/; insert into t2 values(1),(2),(3) /*!*/; # at 269 #100723 0:21:27 server id 1 end_log_pos 296 Xid = 73 COMMIT/*!*/; DELIMITER ;
  • 39. 手順その1 ● 前提 – 1:N 構成 – XA トランザクションは使用しない。 – InnoDB を利用する。 ● リレーログの設定 – リレーログを一定期間保存: relay_log_purge=0 – 合計サイズの上限: relay_log_space_limit=1G – 各ファイルサイズ: max_relay_log_size=64M – ファイル名を分かり易く: relay_log=relay-bin – スレーブのバイナリログは空にしておく: log_slave_updates=0
  • 40. 手順その2 ● マスターがクラッシュ! – スレーブのデータは同期していない(差分がある)も のとします。 ● 各スレーブのリレーログに含まれる Xid を調べて、 「最も進んでいるスレーブ」を特定する。 – DDL など、 Xid が含まれないイベントが最後尾にある 場合には、イベントの数をカウントする。 – SHOW SLAVE STATUS を使っても OK ● 「最も進んでいるスレーブ」を新たなマスターとし て、更新を開始する。 – 新マスターのバイナリログは、昇格前は空。
  • 41. 手順その3 ● 全てのスレーブにおいて、リレーログの適用が終わるのを 待つ。 ● mysqlbinlog コマンドで、「最も進んでいるスレーブ」の リレーログから各スレーブごとの差分を抜き出す。 ● 差分を各スレーブに適用する。 – 適用が完了した時点ではどのスレーブも同じデータ。 ● CHANGE MASTER TO でレプリケーションを開始! – 新マスターは、昇格する前のバイナリログは空なので、バ イナリログに含まれるのは「昇格後になされた更新すべ て」 – スレーブはバイナリログを最初から全て適用すればよい – CHANGE MASTER TO でファイル名とポジションの指定 が不要!!
  • 42. スレーブ昇格手順の課題 ● mysqlbinlog コマンドは Xid を使って開始位置を指定 することが出来ない。 ● Xid は単調増加ではない。 – query_id は単調増加。 – query_id はクエリ開始時につけられる。 – クエリ終了時点では順序が入れ替わってるかも。 ● 現時点ではまだ PoC – さっさとスクリプト書こうず。 ● 監視
  • 44. 拠点間でレプリケーション! ● データ圧縮!! – slave_compressed_protocol=0 – 貴重な帯域を節約しましょう。 ● 暗号化して送信 – CHANGE MASTER TO で SSL オプションを指定。 – クラウドでも安心! – SSL の設定方法については鍵の本 P.441 を。 ● 非同期で。 – レイテンシーが大きいので Semi-Sync は使っちゃダ メ。
  • 45. 拠点間でレプリケーションの図 インターネット 更新 (圧縮+暗号化) スレーブ マスター 非同期
  • 47. MySQL Cluster 概要 アプリケーション SQL SQL SQL ノード ノード ノード 管理 NDB API ノード データ データ 管理 ノード ノード ノード データ データ ノード ノード
  • 48. MySQL Cluster Replication SQL ノード 更 新 Binlog write 更新 NDB binlog スレーブ ストレージ Injector エンジン データ データ ● 通常のレプリケーショ ノード ノード ンと同じプロトコル ● RBR のみ ● 競合検出機能 !! データ データ ノード ノード
  • 49. 苦手な JOIN を克服する!! アプリケーション JOIN 更新 マスター スレーブ SQL SQL SQL INNODB ノード ノード ノード データ データ スレーブ ノード ノード INNODB データ データ ノード ノード スレーブ INNODB : :
  • 51. Engine Level Replication? 更 新 マスター スレーブ ● MVCC Snapshot Transfer ● Asynchronous Replication ● Synchronous Replication – Real-time feedback – No log fush binlog relay-log – Bi-directional PBXT PBXT http://pbxt.blogspot.com/2010/03/pbxt-engine-level-replication-works.html
  • 53. できないこと。 ● 並列化 ● マルチソースレプリケーション ● 行単位でフィルタリング
  • 54. SPIDER ストレージエンジン APP1 APP2 APP3 APP4 n1 n2 n3 n4 SPIDER SPIDER SPIDER SPIDER n5 n6 n7 n8 INNODB INNODB INNODB INNODB
  • 55. パラレルレプリケーション! APP1 APP2 APP3 APP4 n1 n2 n3 n4 SPIDER SPIDER SPIDER SPIDER n5 n6 n7 n8 INNODB INNODB INNODB INNODB slave slave slave slave INNODB INNODB INNODB INNODB SPIDER slave
  • 56. マルチソースレプリケーション Multi Master Master Master Multi Source Master Master Slave
  • 57. 偽マルチソースレプリケーション 更 新 マスター スレーブ 1 スレーブ 2 DB 1 DB 1 DB 1 DB2 DB2 更 新
  • 58. SPIDER によるマルチソース Master Master Slave Slave SPIDER SPIDER Slave INNODB
  • 59. 行単位のフィルタリング マスター スレーブ SBR Black INNODB hole トリガなし。 更新 INNODB トリガ実行
  • 61. 様々な利用シーン Master Slave Master 高可用性 バックアップ Slave Slave レポーティング Slave Master Internet Slave Master 圧縮+暗号化 Slave Slave ディザスタリカバリ スケールアウト
  • 62. まとめ MySQL 人気の秘訣 レプリケーションは やっぱり凄かった! デフォルトで使えるのに! 簡単なのに!
  • 63. Q!! & ご静聴ありがとうございました。 A!!