はじめに
MySQLのレプリケーションに挑戦してみたのでその記録です。
レプリケーションって何?
「レプリカ」を作ること、データベースサーバの複製を作ることです。
WEBサイトへのアクセスが増えて1台のデータベースサーバでさばききれなくなった場合などに使います。1台でさばけないなら2台にすればいいんですが、2台のデータベースサーバが同じデータをもつようにしてやらねばなりません。
その一つの方法がレプリケーションです。
1台目をマスター、2台目をスレーブとして、主従関係をもたせます。データベースへの更新処理はマスターに対してのみ行なって、マスターには常に最新のデータがあることを保証します。マスターに対する更新処理のログを残しておき、それを定期的にスレーブにも実行します。
そうするとマスターに対して少し遅れをとるものの、スレーブもマスターと同じ内容にすることができます。
そもそも「1台のデータベースサーバで十分です。」という状況ではレプリケーションは必要ありません。データベースサーバを増やしたくなるのは、性能を上げたいとか、システムがダウンしないように予備を用意しておきたいとか、そういう場合です。(アクセスの少ないサイトを、落ちたら諦めようというスタンスで運営していた場合必要ないと思います。)
レプリケーションで何をしたの?
MySQLのバックアップを定期的に取りたいと思いました。mysqldumpというコマンドを使えば、データベースの内容をテキストに落としこんでくれます。
mysqldump –all-databases –opt -u user -ppassword > mysqldump.sql
–optのオプションについて。mysqldumpの実行中にデータベースの中身が書き変わってしまうと、データに不整合が生じる危険性があるので、mysqldumpの実行中はデータベースの書き込みをロックしています。
しかし、書き込みがロックされている間にWEBサイトにアクセスしてくれた人は、ロックが解除されるまでアクセスができないという状態になります。(更新系クエリがなければアクセスできます)
そこで、レプリケーションを組んで、スレーブ側でmysqldumpを実行すれば良いんじゃないかと思いました。
マスター側だけでWEBサイトが動いている状況では、スレーブをロックしてもサイトには影響を及ぼしません。スレーブにはレプリケーションによってマスター側と同じものがコピーされているはずなので、これをmysqldumpすれば良いという寸法です。(そもそもレプリケーションが正しく行われないかもしれない・・・という心配がありますが、とりあえず無視しておきます。)
設定の仕方
以下のページを見ながらやっただけなので、こちらを見たほうが分かりやすいと思います。
MySQL レプリケーションのセットアップ手順
設定は、マスターサーバと、スレーブサーバを行ったりきたりします。
どちらもさくらVPSを使っていて、マスターはサービス用にそこそこ良いやつ、スレーブは前に契約して余っていた一番安いやつです。
作業ログ
緑色はmysql内やvim内で入力する内容。赤色は適宜書き換えるところです。マスターのIPが49.212.yyy.yyyで、スレーブのIPが49.212.xxx.xxxとしています。
# master
yum update -y mysql# slave
yum update -y mysql#master
mysql -u username -pgrant replication slave on *.* to ‘repl‘@’49.212.xxx.xxx‘ identified by ‘password‘;
quitsudo vim /etc/my.cnf
log-bin=mysql-bin
server-id=1001sudo /etc/init.d/mysqld restart
# slave
sudo vim /etc/my.cnfserver-id=1002
sudo /etc/init.d/mysqld restart
# master
mysql -u username -pflush tables with read lock;
show master status
# FileとPositionを控えておく# master(別のターミナルから)
mysqldump -u username -p database –lock-all-tables > dbdump.db# mster(元のターミナルから)
unlock tables;
scp ./dbdump.db 49.212.xxx.xxx:~/dbdump.db# slave
mysql -u username -p database < dbdump.db
mysql -u username -p# 先ほど控えたFileとPositionをここで使う
change master to master_host = ‘49.212.yyy.yyy‘, master_user=’repl‘, master_password=’password‘, master_log_file=’mysql-bin.000001‘, master_log_pos=9201;
start slave;
バックアップの取り方
レプリケーションと関係ないですが、目的が自動バックアップをとるところだったので、そのあたりも書いておきます。mysqldumpを実行するシェルスクリプトをcronで定期的に実行させてやるだけです。
cd /home/user
mkdir bak
vim bak_mysql.shfile=”/home/user/bak/mysqldump-“`date ‘+%Y%m%d%H%M’`”.sql”
mysqldump –all-databases –opt -u user -ppassword > $file
chmod 755 bak_mysql.sh
crontab -e0 1 */1 * * cd /home/user;/bin/bash /home/user/bak_mysql.sh
おわりに
サーバ2台使うならスレーブ側にも読み込み系処理をさせたら良いではないかとか、バックアップとるだけなら他に方法がとか、セキュリティ的にとか、気づいたことがあればどうか突っ込んでください。
コメント