MySQLレプリケーション環境によるバックアップ体制の構築

我が家で稼働中の自宅サーバーは3年程前に購入したネットブックです。
最近は落雷による停電やら何やらでハードディスクの寿命が怪しいと感じている日々です。
そこで、「もしも」のためにMySQLのレプリケーションを利用してバックアップを取るようにしてみました。
ついでに、ドメインとかVPSとか取得したのでこのブログも引越ししています。

※内容に間違いがあり「適当な事言ってるなこいつ」などと感じられた場合、コメントにてお知らせいただけますと幸いです。。。

レプリケーションについて

レプリケーション:replication・・・複製(Google翻訳より)
MySQLのレプリケーションは、データベースの更新をMaster側となるサーバーからSlave側のサーバーへ逐次送信して同期するものです。
Master -> Slave
となるのが基本ですが、
Master -> Slave*n
Master < -> Slave
という構成もできるとかできないとか聞いた事がある気がします。興味がある方は調べてみてください。

今回は、一番単純なMaster -> Slaveの構成で構築しました。

Master側の準備

Master側my.cnf設定

Master側となるサーバーでは、my.cnfに次のような記述が必要です。

[mysqld]
log-bin
server-id=1

まず、「log-bin」は、バイナリログを取得するための設定です。
レプリケーションはこいつを使ってほにゃららするため、必須となります。
「server-id」は、識別用のIDとして任意の値を設定します。他のサーバー(Slave側)と重複しないように設定します。
設定したらmysqldを再起動しておきましょう。

Master側レプリケーションユーザー設定

レプリケーションに用いるユーザーを設定します。
次の例では、「replication」というユーザーを作成し、Slave側IPアドレスが「192.168.123.123」であると仮定します。

mysql> GRANT REPLICATION SLAVE ON *.* TO replication@192.168.123.123 IDENTIFIED BY 'password';

Master側データベースバックアップ

とりあえず現時点の場データベースのバックアップを取ります。
datadir以下を丸ごと持っていく方法と、mysqldumpで吐き出す方法がありますが、
datadirの方法で持っていく場合、Slave側のmysql.sockを殺す可能性があります(実際にやった)
ここでは、mysqldumpでバックアップする方法を記載します。

バックアップの前に、データベースをロックしてしまいます。
ついでに、バイナリログの状態を確認し、メモを取っておきましょう。

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | POSITION | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000001 |       48 |              |                  |
+-------------------+----------+--------------+------------------+

FileとPositionはSlave側設定で用いるので、必ずメモを取ります。
mysqlコマンドとは別のシェルを起動して、バックアップを取ります。

$ mysqldump -u root -p --all-databases > dump.sql

ここまでできたら、データベースのロックを解除してもOKです。

mysql> UNLOCK TABLES;

Slave側の準備

データベースの展開

Master側で作成したデータベースダンプをSFTPなどの方法でSlave側に転送します。
転送したdump.sqlをデータベースに読み込みます。

$ mysql -u root -p < dump.sql

Slave側mysqldの設定

Master側でも設定したserver-idを設定します。重複しないように。

[mysqld]
server-id=2

レプリケーション開始

大体用意ができてきたので、レプリケーションを開始する準備をします。
mysqlにrootで接続して、次のように入力します。
この例では、Master側IPアドレスを「192.168.123.100」とします。

mysql> CHANGE MASTER TO
       MASTER_HOST='192.168.123.100',
       MASTER_USER='replication',
       MASTER_PASSWORD='password',
       MASTER_LOG_FILE='mysqld-bin.000001',
       MASTER_LOG_POS=48;

MASTER_USER, MASTER_PASSWORDにはMaster側設定のユーザー設定で設定したものを指定します。
MASTER_LOG_FILE、MASTER_LOG_POSは、メモを取ってあるはずのFileとPosition値を指定します。

これで準備が整いました。レプリケーションを開始しましょう。

mysql> START SLAVE;

この時点で、Master側でロックを解除した以降のデータベースの変更がSlave側に反映されるようになります。
あくまでMaster -> SlaveなのでSlave側を直接変更するといいことはありません。
アプリケーションからはMasterを参照するようにするか、SELECTクエリだけSlaveに回して負荷分散というものもありですね。

疲れたので今日はこの辺で。

コメントを残す