jumper

コラム

MySQLのレプリケーション

2018年05月29日

MySQLにはレプリケーションという複製機能があります。つまり稼働している本サーバと同じ複製を、別な場所に作成し、リアルタイムで同期させる技術です。複製という点ではバックアップと同じように考えられますが、バックアップではファイルの形で保存され、復元する手順が必要になります。 その点、レプリケーションではもう一つ同じサーバを作成している点が大きく違います。

MySQLのレプリケーションの概要

MySQLのレプリケーションの概要

レプリケーションでは本サーバをマスターといい、子(複製)サーバをスレーブといいます。

マスターでは新規登録、更新、削除などの動作が常に行われていますが、レプリケーション機能によりスレーブ側にも同様の動作が伝わり、ほぼリアルタイムでその変更が反映されます。

レプリケーションが起動すると、スレーブ側は一定のサイクルでマスター側のログを確認しに行きます。そして差分を見つけるとマスター側と同じクエリーをスレーブ側でも実行します。このようにしてマスターとスレーブが同期します。

MySQLでレプリケーションを構成する

マスターの設定

MySQLでレプリケーションを起動するためには、まずマスター側のconfファイルにサーバIDとバイナリログの取得設定を設定します。

[mysqld]
・・・・・・・・
log-bin
server-id=番号

confファイルの設定が完了したら再起動を行います。

スレーブアカウントを作成

レプリケーション先のスレーブ側DBを用意し、スレーブ用のアカウントを作成します。

マスターのコピー

マスター側のDBをダンプしますが、この時マスター側のDBにはロックをかけます。

mysql> flush tables with read lock;

次にバイナリログを確認します。

mysql> show master status;
・・・・・・・・・・
File: bin.000001
Position: 1001
・・・・・・・・・・

DBをダンプした後ロックを解除します。

スレーブ側の設定

confファイルにサーバIDとログの取得設定を設定しますが、マスターとスレーブが重ならないようにマスターとは別な番号を振ります。設定した後は再起動を行います。

データをコピー

マスターのダンプデータをスレーブにコピーします。

スレーブ側のパラメータを変更

mysql> change master to
    -> master_host= Master DBサーバのホスト名/IPアドレス
    -> master_user=  Master DBサーバへ接続するユーザ名
    -> master_password= 接続するユーザ名のパスワード
    -> master_log_file= バイナリログのファイル名
    -> master_log_pos= バイナリログの現在位置

レプリケーションのスタート

mysql> start slave;

これでマスター側の変更がスレーブに伝わります。上手く行かない場合はエラーが表示されます。

スレーブを使って日時バックアップを取る

スレーブを使って日時バックアップを取る

これでレプリケーションによってマスターのDBとスレーブのDBが常時同期されることになります。定期的なバックアップはスレーブを利用しましょう。

mysqldumpコマンドでダンプをとる場合、サーバに負荷がかかります。その間DBの登録や更新を行えば動作が不安定、もしくは遅延を起こしかねません。それはサービスにとって機会損失に繋がります。

そこで、定期的なバックアップはスレーブ側で行うのです。バックアップを実行するスクリプトを用意し、cronで定期的に実行するようにしましょう。

まとめ

ここではレプリケーションの概略とバックアップについての説明を行いましたが、実際のレプリケーションはもう少し複雑な構成になっている場合が多いです。例えばマスター1に対してスレーブが複数とか、マスターが複数であるとか、さまざまなケースが考えられます。


ソフトエイジェンシー関連製品URL

https://www.softagency.co.jp/products/mysql

CONTACT

製品・サービスに関するご質問、お見積もり、お問い合わせなど、お気軽にご連絡ください。

 050-5505-5509

受付時間 9:30 - 12:00, 13:00 - 17:00
(土日祝および年末年始を除く)