読者です 読者をやめる 読者になる 読者になる

かまたま日記3

プログラミングメイン、たまに日常

MySQLでレプリケーションを構築する

MySQL

社内勉強会でやったので、メモ。
こういうミドルウェアの設定ってやったこと無かったので、勉強になりました。

前提

  • 同じサーバーで2つのMySQLデーモンを立ち上げる
    • ポートはMaster:13301, Slave:13302 とする
  • データは/data/mysql${port} にあるものとする
  • MySQLのバージョンは5.5
  • 今回はColdバックアップを行う

0.準備

データベース作成
mysql_install_db --datadir=/data/mysql13301

datadirはデータとかテーブル定義とかを保存するディレクトリ

バイナリログが出るようにMasterのmy.cnf(今回はmy-13301.cnfとした)を編集

以下の記述を有効にする。

##### Binary Log Configuration
log_bin = mysql-bin
binlog_format = STATEMENT

1.テーブルロックをかける(Master)

これをやるとデータベースにロックがかかり、データベースの更新が出来なくなる

FLUSH TABLES WITH READ LOCK;

2.バイナリログのファイル名とpositionをメモる(Master)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      587 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

3.MySQLを停止する(Master, Slave)

〜略〜

4.ibdataとib_logfileをコピーする。(Master->Slave)

cp -r /data/mysql13301/ib* /data/mysql13302/

上記のファイルに加えて、普通はデータファイルもコピーする
(今回の例でいえば /data/mysql13301/${database_name} 配下に出来ているはず)

5.MySQLを起動する(Master, Slave)

〜略〜

6.レプリケーション用のユーザー設定を入れる(Master)

  • 最初のset文はレプリケーションで2行めのGRANT文が発行されないために入れている。
  • "${database}.${table}"の部分で、全部のデータベースの全部のテーブルの場合は"*.*"を指定する
  • ${repl_addr}は"123.456.789.*"的な複数指定も出来る
SET sql_log_bin = 0;
GRANT REPLICATION SLAVE ON ${database}.${table} TO '${repl_user}'@'${repl_addr}'' IDENTIFIED BY '${repl_pass}';

7.マスターサーバーの設定をする(Slave)

以下のSQLの結果は/data/mysql13302/master.infoに保存されている。
そのため、レプリケーションからログとデータとmaster.infoをコピればすぐにレプリケーションを作れる

CHANGE MASTER TO
MASTER_HOST = '${repl_addr}',
MASTER_PORT = 13303,
MASTER_USER = '${repl_user}'',
MASTER_PASSWORD = '${repl_pass}',
MASTER_LOG_FILE = 'mysql-bin.000004',
MASTER_LOG_POS = 587

8.レプリケーション開始

start slave;

slaveのステータスを確認して、Slave_IO_Running,Slave_SQL_Runningを見て問題なさそうならOK。

mysql> show slave status\G
*************************** 1. row ***************************               

 〜〜〜〜 略 〜〜〜〜〜

Slave_IO_Running: Yes
Slave_SQL_Running: Yes 

 〜〜〜〜 略 〜〜〜〜〜