サーバいじくり雑記

2014年7月20日

MySQL既存DBにレプリケーション設定をしてできるだけ無停止でスレーブを追加したい

Filed under: Database — bompopo @ 6:00 PM

さて、先日これに先立ってレプリケーション通信経路のSSL化を行ったわけですが、今回はいよいよレプリケーションの設定です。

以下こういう設定で進めます。他にもいくつか設定でてきますがそこは適宜

既存稼働中のDBを持つサーバ       = MasterServer
スレーブDBとなるサーバ           = SlaveServer
レプリケーション対象DB名         = rep_db
スレーブでDBを操作するユーザ名   = db_user
スレーブでDBを操作するパスワード = db_password
レプリケーションに使うユーザ名   = rep_user
レプリケーションに使うパスワード = rep_password

マスター側(MasterServer)の設定

レプリケーションするには権限が結構必要です。RELOADとかSUPER等は最初のmysqldump時に必要なので後で外してもOKだと思います。SSL接続に関しては先日の雑記を参照のこと。

mysql > GRANT RELOAD,SUPER,REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO
            rep_user@SlaveServer IDENTIFIED BY "rep_password" REQUIRE SSL ;'
mysql > GRANT ALL ON rep_db.* TO rep_user@SlaveServer IDENTIFIED BY "rep_password" REQUIRE SSL ;

my.cnfに以下を記述します。

[mysqld]
# SSL接続用設定
ssl-ca=/usr/local/etc/ssl/ca-cert.pem
ssl-cert=/usr/local/etc/ssl/mysql/mysql-master-server-cert.pem
ssl-key=/usr/local/etc/ssl/mysql/mysql-master-server-key.pem
# レプリケーション用設定
server-id=1001
log-bin
expire_logs_days=10
binlog_do_db=rep_db

少々ダウンタイムが発生しますが、DBを再起動します。

$ sudo service mysql-server restart

レプリケーションマスターとしての動作をステータスで確認します。

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
            File: mysqld-bin.000004
        Position: 2183397
    Binlog_Do_DB: rep_db
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

こんな感じでBINファイルやポジション、DB名が設定されていればOK。

スレーブ側(SlaveServer)の設定

レプリケーションDBとユーザを作成します。

mysql > CREATE DATABASE `rep_db` default character set utf8;
mysql > GRANT ALL ON rep_db.* TO db_user@localhost IDENTIFIED BY "db_password";

my.cnfに以下を設定します。

[mysqld]
server-id=1002
replicate-do-db=rep_db

DBを再起動します。

$ sudo service mysql-server restart

さぁレプリケーションスレーブの設定です。
まずは接続情報のみを設定します。

mysql > CHANGE MASTER TO
        MASTER_HOST='MasterServer',
        MASTER_USER='rep_user', 
        MASTER_PASSWORD='rep_password',
        MASTER_SSL      = 1,
        MASTER_SSL_CA   = '/usr/local/etc/ssl/ca-cert.pem';

一応設定されているか確認。他にももっと表示されますが省略しています。

mysql > SHOW SLAVE STATUS\G
*************************** 1. row ***************************
                  Master_Host: MasterServer
                  Master_User: rep_user
                  Master_Port: 3306
              Replicate_Do_DB: rep_db
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /usr/local/etc/ssl/ca-cert.pem

さぁ、マスターからデータをまるっとダンプして取ってきましょう。
ここでは無停止を意識しているのでこの方法ですが、DBの利用の仕方、設定によっては以下のようなダンプの方法ではDBをちゃんとコピーできない場合があります。それってどんな時?っていうのはMySQLマニュアルmysqldumpの項目を読みましょう〜。

$ mysqldump -u rep_user --password='rep_password' --ssl-ca=/usr/local/etc/ssl/ca-cert.pem \
  -h MasterServer --single-transaction --quick -e --compress --master-data rep_db | \
  mysql -u rep_user --password='db_password' --compress rep_db

さて、実はログ名やポジションは先のダンプの–master-dataで付与され、それを読み込んだので勝手に設定されています。手動で設定するより簡単確実なのでできればこういう自動で設定する方法を取りたいですね。

一応ちゃんと設定されているか確認します。ログファイルとポジションが先のmysqldump取り込みにより勝手に入っているはずです。以下の出力も省略しています。

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
                  Master_Host: MasterServer
                  Master_User: rep_user
                  Master_Port: 3306
              Master_Log_File: mysqld-bin.000004
          Read_Master_Log_Pos: 2183397
              Replicate_Do_DB: rep_db

いよいよレプリケーションを開始します。

mysql> START SLAVE;

そしてステータス確認して、IOやSQLのRunningがYESでStateにエラーがなければ成功しているはずです。そしてマスターDBに更新が発生している場合ポジションがどんどん進んでいるはず!

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

以上、レプリケーション設定完了。突き詰めればチューニングの余地は十分ありますが最低限の設定は上記な感じですね。

次はスレーブをマスターに昇格、というか、入れ替えてご覧に入れます。

広告

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。