MySQLの負荷分散の基本、レプリケーションの設定

MySQLのレプリケーションは、MySQLの負荷分散を行う基本的なアプローチで、定番の設定となっています。
自分もMySQLをサーバ群に投入する場面では、可能な限りサーバを2台以上用意して、マスタースレーブ構成で投入するようにしています。

ということで、2台のサーバを使ったMySQLのマスタースレーブ構成のレプリケーション構築をまとめます。

レプリケーションの仕組み

MySQLのレプリケーションの仕組みは、端的にいうと、マスターで生成したバイナリログをスレーブに渡し、スレーブが、バイナリログの中のSQL文を実行することで、同じ内容を保持するという仕組みです。

マスターとなるMySQLの設定

まず、マスターになるMySQLの設定を行います。

ネットワーク内で一意となるidの設定とバイナリログを有効にする設定を行います。

※必要に応じて、バイナリログのメンテナンスの設定も行ったほうがいいかもしれません。

# vi /etc/my.cnf
[mysqld]
server-id=1
log-bin

–log-bin[=base_name]
オプションで起動すると、mysqldで、データ更新に関わる SQL ステートメントのすべてをログ ファイルに書き込みます。
MySQL 5.1 リファレンスマニュアル :: 4.11.4 バイナリ ログ

MySQLを再起動して、設定を反映します。

# /etc/init.d/mysql restart
Shutting down MySQL.                                       [  OK  ]
Starting MySQL.                                            [  OK  ]

MySQLにログインして、レプリケーション用のユーザーを作成します。

# mysql -u root -p
Enter password:
mysql> GRANT REPLICATION SLAVE ON * . * TO 'replication_user'@'192.168.0.%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.02 sec)

MySQLが更新されないようにロックします。

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

バイナリログの位置情報を確認します。

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |       98 |              |                  |
+------------------+----------+--------------+------------------+

MySQLにログインしたターミナルはそのままで、新しいターミナルでサーバに接続し、tarを使ってMySQLデータのバックアップを取ります。

# cd /var/lib/mysql
# tar cpf /var/tmp/mysql-snapshot.tar .
tar: ./mysql.sock: ソケットは無視します

scpを使って、MySQLのバックアップデータをスレーブに転送します。

# scp /var/tmp/mysql-snapshot.tar 192.168.0.2:/var/tmp

MySQLのターミナルに戻って、ロックを解除します。

mysql> UNLOCK TABLES;
mysql> exit
Bye

これで、マスターでの作業は完了です。

スレーブとなるMySQLの設定

次にスレーブになるMySQLの設定を行います。

MySQLを停止します。

# /etc/init.d/mysqld stop
MySQL を停止中:                                            [  OK  ]

スレーブの設定を行います。

[mysqld]
server-id=2
read_only

–read-only
スレーブ スレッドまたは SUPER 権限を持つユーザ以外からはアップデートを受けないようにスレーブに設定。

MySQL 5.1 リファレンスマニュアル :: 5.1.3 レプリケーションのオプションと変数

MySQLのデータディレクトリを空にします。

# cd /var/lib/mysql
# rm -fr *

マスターのバックアップを展開します。

# tar xpf /var/tmp/mysql-snapshot.tar

マスタでのバイナリログやエラーログは、必要ないので削除します。

# rm -f mysqld-bin.*

MySQLを起動します。

# /etc/init.d/mysql start
Starting MySQL.                                            [  OK  ]

マスターに接続する為のユーザー情報とマスター設定時に確認したバイナリログの位置情報を設定します。

# mysql -u root -p
Enter password:
mysql> CHANGE MASTER TO
    -> MASTER_HOST = '192.168.0.1',
    -> MASTER_USER = 'replication_user',
    -> MASTER_PASSWORD = 'password',
    -> MASTER_LOG_FILE = 'mysqld-bin.000001',
    -> MASTER_LOG_POS = 98;

CHANGE MASTER TO は、スレーブ サーバがマスタ サーバに接続、また更新する時に利用するパラメータを変更します。それは master.info と relay-log.info ファイルのコンテンツの更新もします。

MySQL 5.1 リファレンスマニュアル :: 12.6.2.1 CHANGE MASTER TO 構文

この時点で、ディレクトリに以下の4つのファイルが追加作成されています。

  • master.info – マスターに接続するために必要な情報
  • relay-log.info – リレーログの管理

スレーブ レプリケーション サーバは、データ ディレクトリに ファイルを2 つ作成します。これらのファイルは status files (ステータス ファイル) と呼ばれ、デフォルトで master.info および relay-log.info というファイル名です。

MySQL 5.1 リファレンスマニュアル :: 5.5.5.2 スレーブ ステータス ファイル

  • slave-relay-bin.000001 – リレーログファイル
  • slave-relay-bin.index – リレーログのインデックスファイル

リレー ログのファイル名はデフォルトで host_name-relay-bin.nnnnnnという形式です。host_name はスレーブ サーバ ホスト名、nnnnnn の部分はシーケンス番号です。連続するリレー ログ ファイルは、連続するシーケンス番号になり、この番号は 000001 で始まります。スレーブはインデックス ファイルを使用して、使用中のリレー ログ ファイルを追跡します。リレー ログのインデックス ファイル名はデフォルトで、host_name-relay-bin.index です。

MySQL 5.1 リファレンスマニュアル :: 5.5.5.1 スレーブ リレー ログ

実際にレプリケーションを開始します。

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec):

スレーブの稼働を確認します。

mysql> SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.0.1
                Master_User: repl
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysqld-bin.000001
        Read_Master_Log_Pos: 98
             Relay_Log_File: mysqld-relay-bin.000002
              Relay_Log_Pos: 236
      Relay_Master_Log_File: mysqld-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 98
            Relay_Log_Space: 236
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0

Slave_IO_RunningとSlave_SQL_Runningに注目して、この2つがYesとなっていれば、正常稼働と判断できます。逆にどちらかが、Yesでない場合には、レプリケーションは、停止しています。また、これ以降は、スレーブを再起動しても、master.infoの情報をもとにマスターに接続し、レプリケーションは自動再開されます。

参考

カテゴリー: サーバ・インフラのこと   タグ: ,   この投稿のパーマリンク

トラックバック

MySQLの負荷分散の基本、レプリケーションの設定 への1件のコメント

  1. ピンバック: tvotterで活用できた、今まで積み重ねたサーバ構築のいろいろ « FlatLabs Blog

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>