MySQLのレプリケーションについて簡単ですが、まとめたいと思います。
レプリケーション?
ふと思うんですけど「レプリケーション」ってなんでしょうか?
「バックアップ」と何が違うのでしょうか?
おそらくですけど、こんな違いがあります。
- バックアップ -> ある次点における複製を作成する
- レプリケーション -> 複製を作成する
あまり違いはないように思えますが、大きな違いがありますね。作成されたものが 点 と 線 で大きく異なっていますね。つまり、レプリケーションとは複製元のデータを複製先にリアルタイムに反映させるための仕組みと言えるかと思います。
MySQLのレプリケーション
MySQLではレプリケーションの仕組みを構築することが可能です。MySQLではバイナリログを別のサーバに転送することでレプリケーションを行っています。
MySQLでは複製元を「マスター」、コピー先を「スレーブ」と呼んでいます。どのようにこれらはデータの同期を行っているのでしょうか?
レプリケーションの流れ
ざっくりですが、レプリケーションの流れを追っていきたいと思います。
-
マスターへ更新処理が発生
2. 変更を「イベント」として「バイナリログ」に書き込む -
スレーブがマスターに接続する
3. スレーブはマスター接続のためのスレッド(スレーブ I/O スレッド)を作成
4. 作成されたスレッドはマスターに、バイナリログに記録された更新内容を要求 -
マスターがスレーブにバイナリログを送信する
4. マスターはバイナリログを送信するための**スレッド(Binlog Dump スレッド)**を作成
5. 作成されたスレッドはデータ送信のために、マスターのバイナリログをロック
6. バイナリログに記載されたイベントをスレーブに送信 -
スレーブがバイナリログを受け取る
5. 受け取った更新内容をリレーログとしてローカルに保存される -
スレーブで更新処理を行う
6. スレーブは更新されたリレーログを読み取り、イベントを実行するための**スレッド(スレーブSQLスレッド)**を作成し更新を行う
レプリケーションの流れ(おまけ)
さて、上記でざっくりとした流れは記載しましたが、いくつか気になった点があるのではないでしょうか?
自分が気になった点についてまとめたいと思います。
送受信した内容をどうやって記録しているの?
気になりますね。マスターだと「バイナリログのどこまで送ったか」、スレーブ側だと「リレーログのどこまで実行したか」等の大変そうな制御をどうやって行っているのでしょうか?
答えは簡単です。その情報を持っているんです。スレーブ側にスレーブステータスログを保持しています。このログの実体は
- マスター情報ログ(master.info) -> スレーブ I/O スレッドによって更新
- マスターへの接続情報
- 読み取りを開始するバイナリログの位置情報やファイル名
- etc
- リレーログ情報(relay-log.info) -> スレーブSQLスレッドによって更新
- 現在のリレーログファイルの情報や現在位置
- 最後に実行されたバイナリログの位置
- etc
というログです。(ログファイルではなく、テーブルに書き込むこともできます)
リレーログのローテーションは?
「スレッドは役目が終わったら削除するのはわかるけど、リレーログの削除とかの制御って大変そう。。。」ってなりました。
ただこのリレーログのローテートは特に何も考慮する必要がありません(おそらく)
SQLスレッドがリレーログファイルの内容を全て実行した後はこのファイルは不要になりますよね?これをSQLスレッドは自動的に削除してくれますのでリレーログのローテーションはあまり考慮しなくても大丈夫という事です。
まとめ
MySQLのレプリケーションについてまとめましたが、すごい技術ですね。用語自体は理解していましたが、実際の流れとかを理解すると面白さみたいなものを感じました。(と同時に複雑さも感じましたけどね。。。。)
どなたかのお役に立てればと思います。ではまた