2013年1月17日木曜日

master、slaveの切り替え

前回、HAProxyによるフェイルオーバーを行ったので、
続けて今回は自動でmaster,slaveの切り替えを行いたいところですが、
その前に手動での切り替えを行いたいと思います(`・ω・´)シャキーン

今回の構成ははmaster1台(server-idは10)、
slave2台構成(slave1はserver-idが20,slave2はserver-idが30)のレプリケーションを行っている環境で、
slaveをmasterに変更し、masterをslaveに変更してみたいと思います( ´∀`)bグッ!

その前に注意点として、次の点があるそうです。
MySQLドキュメントから一部抜粋 http://dev.mysql.com/doc/refman/5.1/ja/replication-solutions-switch.html
スレーブを --log-bin はあるけれども --log-slave-updates はないという組み合わせで実行します。

MySQL Slave のそれぞれ (Slave 1、Slave 2、Slave 3) は、 --log-slave-updates を伴わずに、
--log-bin だけで実行しているスレーブです。--log-slave-updates の指定がなければ
マスタからスレーブが受信したアップデートがバイナリ ログに記録されないため、
それぞれのスレーブのバイナリ ログは最初から空です。 何らかの原因により MySQL Master が利用不可になる場合、
複数あるスレーブの中から新しいマスタを選ぶことができます。
たとえば、Slave 1 を選択する場合、すべての Web Clients を Slave 1 にリダイレクトして、
そこのバイナリ ログ にアップデートを記録します。つまり、Slave 2 と Slave 3 は Slave 1 から複製することになります。

--log-slave-updates なしで実行するという理由には、
複数のスレーブの中から一つが新たなマスタに切り替わるときに、
アップデートを 2 度受信しないようにするためです。
たとえば、Slave 1 は --log-slave-updates するようになると、
Master から受信するアップデートを自分のバイナリ ログに書き込みます。
Slave 2 が Master から Slave 1 に切り替わった場合は、
Master からアップデートをすでに受信しているにも関わらず、
Slave 1 から再度、アップデートを受信するという結果になります。

簡単にまとめると、masterのトラブル時にslaveを昇格するために、
事前に「log-slave-updates」をつけ、バイナリーログを出力して利用しようかと思っていましたが、
それは良くないという意味らしいです。

「log-slave-updates」を設定している状態で、
maseterに切り替えた際に、不整合が発生する可能性が出てしまうらしいです。

「log-slave-updates」を設定し、masterとして扱いたい場合には、
サーバー構成がチェーン状構成(master→master-slaveみたいな)の時だけ利用するとのことです。

MySQLレプリケーションにおけるフェイルオーバーから一部抜粋
http://open-groove.net/mysql/mysql-replication-failover/
ちなみにオフィシャルサイトには「log-slave-updatesはレプリケーションサーバを
チェーン状に構成する場合に使用する」とある。
あくまで自分の解釈だが、log-slave-updatesオプションはピラミッド構成なら
無効に、チェーン状構成なら有効にするという認識でよいと思われる。

上記の点から、slaveには「--log-slave-updates」をつけていない状態で作業を行う点を気をつけたいと思います。

■手順1)masterの書き込みロック。
#書き込みロックを実行
mysql> FLUSH TABLES WITH READ LOCK;

#Key_blocks_not_flushedが0であることを確認する(ログへフラッシュされた)
mysql> SHOW STATUS LIKE 'Key_blocks_not_flushed';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Key_blocks_not_flushed | 0     |
+------------------------+-------+
1 row in set (0.00 sec)

#InnoDBで、ログからテーブルスペースへ書き込み中の可能性の考慮して、
#"Log sequence number"と"Log flushed up to"の値に差異がないこと確認する
#(ログが全てテーブルスペースへ書き込まれたことになる。)
mysql> SHOW ENGINE INNODB STATUS\G
---
LOG
---
Log sequence number 4796165024
Log flushed up to   4796165024
Last checkpoint at  4796165024
0 pending log writes, 0 pending chkp writes
20105 log i/o's done, 0.00 log i/o's/second

または次のコマンドで確認する
# mysql -u root -e "SHOW ENGINE INNODB STATUS\G;" | grep -e "Log sequence number" -e "Log flushed up to"
Log sequence number 4796165024
Log flushed up to   4796165024
念のため、停止させておく。
#停止
/etc/init.d/mysqld stop;
■手順2)各slave側で同期を停止させる(もしくはI/Oスレッドを停止させる)。

すべてのスレーブがリレー ログ内のクエリを処理したかどうかを確認する。

Has read all relay log; waiting for the slave I/O thread to update it
スレッドは、リレーログファイルのイベントをすべて処理し、I/O スレッドがリレーログに新しいイベントを書き込むのを待っている。
#slave1
mysql> show processlist;
+-------+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id    | User        | Host      | db   | Command | Time | State                                                                       | Info             |
+-------+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| 50481 | root        | localhost | NULL | Query   |    0 | NULL                                                                        | show processlist |
| 50487 | system user |           | NULL | Connect |  792 | Waiting for master to send event                                            | NULL             |
| 50488 | system user |           | NULL | Connect |  791 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
+-------+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+

#同期停止
STOP SLAVE;

#slave2
mysql> show processlist;
+--------+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id     | User        | Host      | db   | Command | Time | State                                                                       | Info             |
+--------+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| 254983 | root        | localhost | NULL | Query   |    0 | NULL                                                                        | show processlist |
| 268704 | system user |           | NULL | Connect |   13 | Waiting for master to send event                                            | NULL             |
| 268705 | system user |           | NULL | Connect |   12 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
+--------+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+

#同期停止
STOP SLAVE;
■手順3)masterに昇格するslave1の設定をmaster用に変更する
#read_onlyの状態の確認(1が有効、0が無効)
mysql> SELECT @@read_only;
+-------------+
| @@read_only |
+-------------+
|           1 |
+-------------+

#read_onlyを無効化(MySQLの再起動を行いたくない場合)
mysql> SET GLOBAL read_only = 0;

#read_onlyを無効の確認(1が有効、0が無効)
mysql> SELECT @@read_only;
+-------------+
| @@read_only |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)

#バイナリーログの状態確認(1が有効、0が無効)
#log_binはmy.cnfからのみ変更可能なので、
#もし値が0の場合には、my.cnfで修正してあげてmysqlの再起動が必要になる。
mysql> SELECT @@log_bin;
+-----------+
| @@log_bin |
+-----------+
|         1 |
+-----------+
1 row in set (0.02 sec)

#リレーログの状態確認
#relay_logはmy.cnfからのみ変更可能なので、
#もし値が0の場合には、my.cnfで修正してあげてmysqlの再起動が必要になる。
mysql> SELECT @@relay_log;
+-----------------+
| @@relay_log     |
+-----------------+
| mysql-relay-bin |
+-----------------+
1 row in set (0.01 sec)

#relay_logが設定されていない場合にはNULLと表示される
mysql> SELECT @@relay_log;
+-------------+
| @@relay_log |
+-------------+
| NULL        |
+-------------+
1 row in set (0.00 sec)
再起動された用にmy.cnfも編集しておく
vi /etc/my.cnf
#read_onlyを無効化(#でコメントアウト化)
read_only=0

#バイナリーログを有効化
log_bin=mysql-bin

#リレーログを無効化(#でコメントアウト化)
#relay_log=mysql-relay-bin

#各master情報をmy.cnfに書いてある場合にはこの部分もコメントアウト化
#master-host     =   
#master-user     =   
#master-password =   
#master-port     =  
■手順4)masterに変更するslaveでRESET MASTERを実行する。

実行するとバイナリーログ、バイナリーログのインデックスファイルがリセットされます。
(バイナリーログの連番が1から開始されるなど)
#現在のバイナリーログの連番を確認(mysql-bin.000023)
# ls -alt /var/lib/mysql/
合計 361584
-rw-rw----  1 mysql mysql  24514456  1月 16 20:31 2013 mysql-general.log
drwxr-xr-x  8 mysql mysql      4096  1月 16 20:29 2013 .
-rw-rw----  1 mysql mysql 190038738  1月 16 20:29 2013 mysql-error.log
-rw-rw----  1 mysql mysql       107  1月 16 20:26 2013 mysql-bin.000023
-rw-rw----  1 mysql mysql        38  1月 16 20:26 2013 mysql-bin.index
-rw-rw----  1 mysql mysql      9952  1月 16 20:26 2013 mysql-slow.log
srwxrwxrwx  1 mysql mysql         0  1月 16 20:26 2013 mysql.sock
-rw-rw----  1 mysql mysql       126  1月 16 20:26 2013 mysqld-relay-bin.000001
-rw-rw----  1 mysql mysql   5242880  1月 16 20:26 2013 ib_logfile0
-rw-rw----  1 mysql mysql 144703488  1月 16 20:26 2013 ibdata1
-rw-rw----  1 mysql mysql        83  1月 16 20:26 2013 master.info
-rw-rw----  1 mysql mysql       126  1月 16 20:26 2013 mysql-bin.000022
-rw-rw----  1 mysql mysql       272  1月 16 20:26 2013 mysql-relay-bin.867570
-rw-rw----  1 mysql mysql        52  1月 16 20:26 2013 relay-log.info
-rw-rw----  1 mysql mysql       156  1月 11 18:37 2013 mysql-relay-bin.867569
-rw-rw----  1 mysql mysql        50  1月 11 18:37 2013 mysql-relay-bin.index
drwxr-xr-x 18 root  root       4096  1月 11 12:45 2013 ..
drwx------  2 mysql mysql      4096 12月 26 14:08 2012 test
-rw-rw----  1 mysql mysql   5242880 12月 25 22:01 2012 ib_logfile1
drwx------  2 mysql mysql      4096 12月 25 21:32 2012 mysql
drwx------  2 mysql mysql      4096 12月 25 21:25 2012 performance_schema

#masterをリセット
mysql> RESET MASTER;
Query OK, 0 rows affected (0.01 sec)

#slaveではなくなったか確認
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

#バイナリーログの連番が初期化されていることを確認(mysql-bin.000001)
# ls -alt /var/lib/mysql/
合計 361588
-rw-rw----  1 mysql mysql  24520948  1月 16 20:34 2013 mysql-general.log
drwxr-xr-x  8 mysql mysql      4096  1月 16 20:34 2013 .
-rw-rw----  1 mysql mysql       107  1月 16 20:34 2013 mysql-bin.000001
-rw-rw----  1 mysql mysql        19  1月 16 20:34 2013 mysql-bin.index
-rw-rw----  1 mysql mysql 190038738  1月 16 20:29 2013 mysql-error.log
-rw-rw----  1 mysql mysql       126  1月 16 20:29 2013 mysqld-relay-bin.000002
-rw-rw----  1 mysql mysql        52  1月 16 20:29 2013 mysqld-relay-bin.index
-rw-rw----  1 mysql mysql      9952  1月 16 20:26 2013 mysql-slow.log
srwxrwxrwx  1 mysql mysql         0  1月 16 20:26 2013 mysql.sock
-rw-rw----  1 mysql mysql       126  1月 16 20:26 2013 mysqld-relay-bin.000001
-rw-rw----  1 mysql mysql   5242880  1月 16 20:26 2013 ib_logfile0
-rw-rw----  1 mysql mysql 144703488  1月 16 20:26 2013 ibdata1
-rw-rw----  1 mysql mysql        83  1月 16 20:26 2013 master.info
-rw-rw----  1 mysql mysql       272  1月 16 20:26 2013 mysql-relay-bin.867570
-rw-rw----  1 mysql mysql        52  1月 16 20:26 2013 relay-log.info
-rw-rw----  1 mysql mysql       156  1月 11 18:37 2013 mysql-relay-bin.867569
-rw-rw----  1 mysql mysql        50  1月 11 18:37 2013 mysql-relay-bin.index
drwxr-xr-x 18 root  root       4096  1月 11 12:45 2013 ..
drwx------  2 mysql mysql      4096 12月 26 14:08 2012 test
-rw-rw----  1 mysql mysql   5242880 12月 25 22:01 2012 ib_logfile1
drwx------  2 mysql mysql      4096 12月 25 21:32 2012 mysql
drwx------  2 mysql mysql      4096 12月 25 21:25 2012 performance_schema
■手順5)残りのslave2に新しいmasterを認識させる(masterに昇格したslave1以外)
#同期を停止させる
STOP SLAVE;

#リレーログを確認する
# ls -alt /var/lib/mysql/
合計 337604
-rw-rw----  1 mysql mysql        83  1月 16 20:41 2013 master.info
drwxr-xr-x  8 mysql mysql      4096  1月 16 20:11 2013 .
-rw-rw----  1 mysql mysql 190039298  1月 16 20:11 2013 mysql-error.log
-rw-rw----  1 mysql mysql       156  1月 16 20:11 2013 mysql-relay-bin.867571
-rw-rw----  1 mysql mysql       253  1月 16 20:11 2013 mysql-relay-bin.867572
-rw-rw----  1 mysql mysql        50  1月 16 20:11 2013 mysql-relay-bin.index
-rw-rw----  1 mysql mysql        52  1月 16 20:11 2013 relay-log.info
drwxr-xr-x 18 root  root       4096  1月 11 12:45 2013 ..
-rw-rw----  1 mysql mysql       107  1月 10 14:36 2013 mysql-bin.000024
-rw-rw----  1 mysql mysql        95  1月 10 14:36 2013 mysql-bin.index
srwxrwxrwx  1 mysql mysql         0  1月 10 14:36 2013 mysql.sock
-rw-rw----  1 mysql mysql   5242880  1月 10 14:36 2013 ib_logfile0
-rw-rw----  1 mysql mysql 144703488  1月 10 14:16 2013 ibdata1
-rw-rw----  1 mysql mysql       126  1月 10 14:16 2013 mysql-bin.000023
-rw-rw----  1 mysql mysql       126  1月 10 13:25 2013 mysql-bin.000022
-rw-rw----  1 mysql mysql      1153  1月 10 13:20 2013 mysql-bin.000021
-rw-rw----  1 mysql mysql       412  1月  9 14:37 2013 mysql-bin.000020
drwx------  2 mysql mysql      4096 12月 26 14:08 2012 test
-rw-rw----  1 mysql mysql   5242880 12月 25 22:01 2012 ib_logfile1
drwx------  2 mysql mysql      4096 12月 25 21:32 2012 mysql
drwx------  2 mysql mysql      4096 12月 25 21:25 2012 performance_schema

#現在設定されているmaster情報を確認する
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 元masterのIPアドレス
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000022
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysql-relay-bin.867572
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000022
             Slave_IO_Running: No
            Slave_SQL_Running: No
              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: 107
              Relay_Log_Space: 409
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 10
1 row in set (0.00 sec)

#手順4で確認したshow master statusを元に新しいmaster情報に変更する
mysql> CHANGE MASTER TO
    -> MASTER_HOST='新masterのIPアドレス',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='パスワード',
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=107;
Query OK, 0 rows affected (0.01 sec)

#同期開始
START SLAVE;

#新しいmaster情報に変わっている事と正しく同期がされているか(Slave_IO_Running、Slave_SQL_Running)確認する
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 新masterのIPアドレス
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-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: 107
              Relay_Log_Space: 409
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 20
1 row in set (0.00 sec)

#リレーログの連番が初期化されている
# ls -alt /var/lib/mysql/
合計 337604
drwxr-xr-x  8 mysql mysql      4096  1月 16 21:00 2013 .
-rw-rw----  1 mysql mysql        83  1月 16 21:00 2013 master.info
-rw-rw----  1 mysql mysql       156  1月 16 21:00 2013 mysql-relay-bin.000001
-rw-rw----  1 mysql mysql       253  1月 16 21:00 2013 mysql-relay-bin.000002
-rw-rw----  1 mysql mysql        50  1月 16 21:00 2013 mysql-relay-bin.index
-rw-rw----  1 mysql mysql        52  1月 16 21:00 2013 relay-log.info
-rw-rw----  1 mysql mysql 190040234  1月 16 21:00 2013 mysql-error.log
drwxr-xr-x 18 root  root       4096  1月 11 12:45 2013 ..
-rw-rw----  1 mysql mysql       107  1月 10 14:36 2013 mysql-bin.000024
-rw-rw----  1 mysql mysql        95  1月 10 14:36 2013 mysql-bin.index
srwxrwxrwx  1 mysql mysql         0  1月 10 14:36 2013 mysql.sock
-rw-rw----  1 mysql mysql   5242880  1月 10 14:36 2013 ib_logfile0
-rw-rw----  1 mysql mysql 144703488  1月 10 14:16 2013 ibdata1
-rw-rw----  1 mysql mysql       126  1月 10 14:16 2013 mysql-bin.000023
-rw-rw----  1 mysql mysql       126  1月 10 13:25 2013 mysql-bin.000022
-rw-rw----  1 mysql mysql      1153  1月 10 13:20 2013 mysql-bin.000021
-rw-rw----  1 mysql mysql       412  1月  9 14:37 2013 mysql-bin.000020
drwx------  2 mysql mysql      4096 12月 26 14:08 2012 test
-rw-rw----  1 mysql mysql   5242880 12月 25 22:01 2012 ib_logfile1
drwx------  2 mysql mysql      4096 12月 25 21:32 2012 mysql
drwx------  2 mysql mysql      4096 12月 25 21:25 2012 performance_schema
■手順6)正しくレプリケーションが行われているか確認する。

新しいmasterサーバーのデフォルトで用意されているtestデータベースに、
テスト用にテーブルを作成し、同期が取られるか確認する。
################
# master側
################
#master側がslaveを認識しているか確認
mysql> show slave hosts;
+-----------+---------+------+-----------+
| Server_id | Host    | Port | Master_id |
+-----------+---------+------+-----------+
|        30 | slave30 | 3306 |        20 |
+-----------+---------+------+-----------+

#一応データを登録して確認する
#データベース指定。
use test;

#テーブル作成
CREATE TABLE table_test(
  `id` int(10) unsigned
);

#確認
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| table_test     |
+----------------+
1 row in set (0.00 sec)

################
# slave側
################
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| table_test     |
+----------------+
1 row in set (0.02 sec)
■手順7)元masterをslave用に変更する。

元masterが停止中であること。
#my.cnf編集
vi /etc/my.cnf

server-id=10

#masterでSHOW SLAVE HOSTSコマンドを実行したときにスレーブの一覧が見れるように。
report_host=slave10

#read_onlyを有効化
read_only=1

#起動時の自動同期開始を無効化
skip_slave_start

#バイナリーログを有効化
log_bin=mysql-bin

#リレーログを有効化
relay_log=mysql-relay-bin
設定ファイルの書き換えが終わったら再起動をして反映させます。
#起動する
# /etc/init.d/mysqld start;
mysqld を起動中:                                           [  OK  ]
■手順8)元masterに新master情報を設定する。
#masterの情報を設定していないため空
mysql> SHOW SLAVE STATUS\G
Empty set (0.00 sec)

#手順4で確認したshow master statusを元に新masterの情報を設定(MASTER_LOG_FILEとMASTER_LOG_POSは指定しなくても良いかも?)
mysql> CHANGE MASTER TO
    -> MASTER_HOST='新masterのIPアドレス',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='パスワード',
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=107;
Query OK, 0 rows affected (0.01 sec)

#再度確認してみる
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 新masterのIPアドレス
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysql-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: No
            Slave_SQL_Running: No
              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: 0
              Relay_Log_Space: 107
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
1 row in set (0.00 sec)

#同期開始
mysql> START SLAVE;

#正しく同期されているかSlave_IO_Running,Slave_SQL_Runningを確認する
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 新masterのIPアドレス
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysql-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             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: 0
              Relay_Log_Space: 107
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
1 row in set (0.00 sec)
■手順9)新masterで元masterのslaveを認識できているか確認
mysql> SHOW SLAVE HOSTS;
+-----------+---------+------+-----------+
| Server_id | Host    | Port | Master_id |
+-----------+---------+------+-----------+
|        30 | slave30 | 3306 |        20 |
|        10 | slave10 | 3306 |        20 |
+-----------+---------+------+-----------+
以上です(`・ω・´)ゞビシッ!!

次回は、「MySQL-MHA」を利用した自動切換えを行いたいと思います(ΦωΦ)フフフ…

各サーバーのmy.cnfは次のようにしてあります。
masterからslaveに切り替わったMySQLのmy.cnf設定
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock

default-character-set=utf8

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock

character-set-server=utf8

skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 16M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

#バイナリーログを有効化
log-bin=mysql-bin
#エラーログを有効化
log-error = mysql-error.log
#リレーログを有効化
relay-log=mysql-relay-bin

# binary logging format - mixed recommended
binlog_format=mixed

#バイナリーログの有効期限
expire_logs_days=3

#1回バイナリログへ更新を行うことでディスクへのフラッシュを行う
sync_binlog=1

#InnoDBのログバッファをInnoDBログファイルに書き込むタイミングを決める
innodb_support_xa=1

#2相コミットを行うかどうか。ログをコミットごとにフラッシュしない
innodb_flush_log_at_trx_commit=1

server-id       = 10

#masterでSHOW SLAVE HOSTSコマンドを実行したときにスレーブの一覧が見れるように。
report_host=slave10

#read_onlyを有効化
read_only=1

#起動時の自動同期開始を無効化
skip_slave_start

innodb_buffer_pool_size = 512M
innodb_log_buffer_size = 128M

#今回はデフォルトのままで。(自動拡張有効で、初期化で10MBの領域を確保する)
innodb_data_file_path = ibdata1:10M:autoextend
#拡張時に64MBの領域を確保する
innodb_autoextend_increment=64
#テーブルスペースをテーブル単位で作成する
innodb_file_per_table

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

default-character-set=utf8

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
slaveからmasterに切り替わったMySQLのmy.cnf設定
# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock
default-character-set=utf8

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 32M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

#
character-set-server=utf8
#バイナリーログ
log-bin=mysql-bin
#エラーログ
log-error = mysql-error.log
#リレーログ
#relay-log=mysql-relay-bin
#一般クエリログ
general-log = ON
general-log-file = /var/lib/mysql/mysql-general.log
#スローログ
slow-query-log = ON
slow-query-log-file = /var/lib/mysql/mysql-slow.log
#SQL実行時間が指定された秒数を超えた場合にスローログに書き込む時間
long_query_time = 3
#インデックスが使われていないSQLをスローログに書き込む
log-queries-not-using-indexes

# binary logging format - mixed recommended
binlog_format=mixed

#バイナリーログの有効期限
expire_logs_days=3

server-id=20
#masterでSHOW SLAVE HOSTSコマンドを実行したときにスレーブの一覧が見れるように。
report_host=slave20
#書き込み禁止
#read_only=1
#slaveの同期の自動開始を無効化
skip_slave_start

#デフォルトのままで。(自動拡張有効で、初期化で10MBの領域を確保する)
innodb_data_file_path = ibdata1:10M:autoextend
#拡張時に64MBの領域を確保する
innodb_autoextend_increment=64
#テーブルスペースをテーブル単位で作成する
innodb_file_per_table


[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

default-character-set=utf8
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
slaveから新しいmasterに切り替わったMySQLのmy.cnf設定
# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock
default-character-set=utf8

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 32M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

character-set-server=utf8
#バイナリーログ
log-bin=mysql-bin
#エラーログ
log-error = mysql-error.log
#リレーログ
#relay-log=mysql-relay-bin
#一般クエリログ
general-log = ON
general-log-file = /var/lib/mysql/mysql-general.log
#スローログ
slow-query-log = ON
slow-query-log-file = /var/lib/mysql/mysql-slow.log
#SQL実行時間が指定された秒数を超えた場合にスローログに書き込む時間
long_query_time = 3
#インデックスが使われていないSQLをスローログに書き込む
log-queries-not-using-indexes

# binary logging format - mixed recommended
binlog_format=mixed

#バイナリーログの有効期限
expire_logs_days=3

server-id=30
#masterでSHOW SLAVE HOSTSコマンドを実行したときにスレーブの一覧が見れるように。
report_host=slave30
#書き込み禁止
read_only=1
#slaveの同期の自動開始を無効化
skip_slave_start


#今回はデフォルトのままで。(自動拡張有効で、初期化で10MBの領域を確保する)
innodb_data_file_path = ibdata1:10M:autoextend
#拡張時に64MBの領域を確保する
innodb_autoextend_increment=64
#テーブルスペースをテーブル単位で作成する
innodb_file_per_table

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates

default-character-set=utf8
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

参考URL

0 件のコメント:

コメントを投稿