MySQLでレプリケーションしてみる

MySQLレプリケーションしてみる。

【参考】
mysql レプリケーション設定 | 手順書.com
http://tejunsho.com/mysql/20110603000166.html

MySQL 5.5 のレプリケーション設定方法 | Check!Site
http://www.checksite.jp/mysql-replication/

VagrantにCentOS6.5が入ってなければ追加しておく。

$ vagrant box add centos65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box

DBサーバを2台用意

VagrantでDBサーバを2台用意する。

まず、マスター側のサーバを用意する。

$ mkdir master_db
$ cd master_db
$ vagrant init centos65
$ vi Vagrantfile
  config.vm.network "private_network", ip: "192.168.33.11"
$ vagrant up
$ vagrant ssh

MySQLをインストールする。

master_db$ sudo yum -y install mysql-server
master_db$ sudo service mysqld start
master_db$ sudo chkconfig mysqld on

スレーブ側も同様に用意する。

$ mkdir slave_db
・・・
$ vi Vagrantfile
  config.vm.network "private_network", ip: "192.168.33.12"
・・・

マスター側の設定

他のサーバと重複しないようserver-idを指定し、
バイナリログを取るよう設定する。

master_db$ sudo vi /etc/my.cnf
[mysqld]
・・・
server-id=1	←追加
log-bin		←追加
master_db$ sudo service mysqld restart

MySQLに接続する。

master_db$ mysql -u root

レプリケーション用のユーザーを作成する。
今回は「repl」というユーザー名で作成する。

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'password';

データベースが更新されないようロックする。

mysql> FLUSH TABLES WITH READ LOCK;

FileとPositionを覚えておく。

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

ダンプを取得し、スレーブ側のサーバに転送する。

master_db$ mysqldump -u root --all-databases --lock-all-tables > dump.db
master_db$ scp dump.db vagrant@192.168.33.12:
mysqldumpしたとき下記の警告が出た。問題ないのかよく分からない。
「Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.」

ロックを解除する。

master_db$ mysql -u root
mysql> UNLOCK TABLES;

スレーブ側の設定

server-idを設定する。

slave_db$ sudo vi /etc/my.cnf
[mysqld]
・・・
server-id=2	←追加

※「read_only」も指定したほうがいいかも

slave_db$ sudo service mysqld restart

ダンプデータを取り込む。

slave_db$ mysql -u root < dump.db

MySQLに接続する。

slave_db$ mysql -u root

マスターの情報を登録する。

mysql> CHANGE MASTER TO
       MASTER_HOST='192.168.33.11',
       MASTER_USER='repl',
       MASTER_PASSWORD='password',
       MASTER_LOG_FILE='mysqld-bin.000001',	←覚えておいたFile
       MASTER_LOG_POS=248;	←覚えておいたPosition

レプリケーションを開始する。

mysql> START SLAVE;

下記のコマンドでスレーブの状態を確認できる。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ならOK。

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.33.11
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysqld-bin.000001
          Read_Master_Log_Pos: 106
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 252
        Relay_Master_Log_File: mysqld-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
・・・

確認

マスター側でデータベースを作成してみる

mysql> create database sample;

スレーブ側で確認すると、反映されているのが確認できる。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| sample             |
| test               |
+--------------------+