我が家で稼働中の自宅サーバーは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に回して負荷分散というものもありですね。
疲れたので今日はこの辺で。