2012年12月26日水曜日

slaveの再設定、追加(オンラインバックアップ)

既にレプリケーションが設定されているslaveに対して、フルバックアップからレプリケーションを再設定を行う。
方法としてはいくつかあるみたいで、オンラインバックアップ、コールドバックアップ、スナップショットなどがあるそうです。

・オンラインバックアップ
mysqlの停止は必要無し。ダンプとリストアを行うため時間がかかる。
・コールドバックアップ
mysqlの停止が必要。オンラインバックアップよりかは早い?
同一サーバー間の再構築用はこちら。別サーバー間の再構築用はこちら
・スナップショット
mysqlの停止は必要なし。OSにスナップショット機能が必要。一番早い?

今回はmasterのフルバックアップファイルを利用した、オンラインバックアップを利用したいと思います
基本的には以前の記事のレプリケーションの設定の手順4あたりからやれば問題なさそうですが補足情報になります。

別サーバーで、レプリケーションが行われているmysqlからダンプして
フルバックアップファイルを利用して、slaveを設定しなおす場合に、
mysqlの接続アカウント情報も書き変わってしまう。

そのため、元々masterに設定されていた接続アカウントと
ダンプファイルのアカウント情報が違う場合には、アカウント情報を再設定してあげる必要がある。

たとえば、masterに作られていたレプリケーション用の接続アカウント情報が変わってしまったことで、
正しく同期処理が行えなくなってしまう、アプリ側から接続我行いなどが発生してしまう。

mysql> select user,host from mysql.user;
+------+----------------------+
| user | host                 |
+------+----------------------+
| root | 127.0.0.1            |
| root | ::1                  |
|      | localhost            |
| root | localhost            |
|      | ***.kagoya.net |
| root | ***.kagoya.net |
+------+----------------------+
6 rows in set (0.00 sec)
↓
mysql> select user,host from mysql.user;
+--------+------------+
| user   | host       |
+--------+------------+
| *****  | 10.255.7.% |
| *****  | 10.255.7.% |
| *****  | 10.255.7.% |
| *****  | 10.255.7.% |
| *****  | 10.255.7.% |
| *****  | 10.255.7.% |
| *****  | 10.255.7.% |
| ****   | 10.255.7.% |
| *****  | 10.255.7.% |
| root   | 127.0.0.1  |
| root   | ::1        |
|        | ****       |
| root   | ****       |
|        | localhost  |
| root   | localhost  |
+--------+------------+
15 rows in set (0.00 sec)
アカウント情報が書き変わった状態で、start slaveを実行しても次のようエラーになってしまう。
(レプリケーション用のアカウント情報が以前のと同じであれば発生しない)

Last_IO_Errno: 1130
Last_IO_Error: error connecting to master 'slave@*******:3306' - retry-time: 10  retries: 86400
フルバックアップファイルを持ってきた構成とサーバーのIPアドレスなどが違った場合に、
接続アカウントのホスト情報などが違って取得できなかったりする。

権限を確認してみるが、
なぜか権限を確認してみるが表示されない・・・orz
mysql> SHOW GRANTS FOR 'アカウント名'@'10.255.7.%';
ERROR 1141 (42000): There is no such grant defined for user 'アカウント名' on host '10.255.7.%'
接続アカウント情報を作り直したが良いのかも?
#権限の削除
REVOKE ALL PRIVILEGES ON *.* FROM 'アカウント名'@'10.255.7.%';

#アカウント削除
DELETE FROM mysql.user WHERE user='アカウント名' AND host='10.255.7.%';

#反映
FLUSH PRIVILEGES;
削除したアカウントを作り直す。
次の例ではmaster側にslaveから繋げるレプリケーション用の接続アカウントを作り直しています。
#master側にレプリケーション用のアカウント作成
#slaveごとに共通のアカウントを利用する場合、
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%' IDENTIFIED BY 'パスワード';
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR 'repl'@'%';
+-------------------------------------------------------------------------------------------------------------------------------------+
| Grants for repl@%                                                                                                                   |
+-------------------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%' IDENTIFIED BY PASSWORD '*A424E797037BF97C19A2E88CF7891C5C2038C039' |
+-------------------------------------------------------------------------------------------------------------------------------------+
#
FLUSH PRIVILEGES;

#masterに作成した接続アカウントがslave側から接続できるか確認
$ mysql -h masterのサーバーIPアドレス -u repl -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5320
Server version: 5.5.27-log MySQL Community Server (GPL) by Remi

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

元々あったレプリケーション用の接続アカウントから変更があった場合には、
slave側でCHANGE MASTER TOを実行する必要がある。
#slaveにリストアするダンプファイルから
#CHANGE MASTER TOで設定するバイナリーログ名と、ポジションを取得する。
head -100 /home/admin/replication_all_dump_20121225_01.sql | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='バイナリーログのファイル名', MASTER_LOG_POS=バイナリーログのポジション;

#slave側で設定を変更
CHANGE MASTER TO
MASTER_HOST='マスターのIPアドレス',
MASTER_USER='レプリケーション用の接続アカウント名',
MASTER_PASSWORD='レプリケーション用の接続アカウントのパスワード',
MASTER_PORT=3306,
MASTER_LOG_FILE='バイナリーログのファイル名',
MASTER_LOG_POS=バイナリーログのポジション,
MASTER_CONNECT_RETRY=10;
ユーザーの作成などのコマンドはレプリケーション側でも実行されため、
slave側のユーザーを手動で消した後に、master側の方も消してしまうと、
slave側は既に消えてしまっているのでエラーになり同期がされなくなってしまうので注意!!:(;゙゚'ω゚'):

slaveでエラーが出てしまった場合には、SQL_SLAVE_SKIP_COUNTERを実行して、
1つずつ処理をスキップして解消する!ド━(゚Д゚)━ン!!

スキップごとにをstart slaveを繰り返しながらshow slave status確認し、
Last_SQL_Error:に何もでなくなるまでスキップさせる。
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G

0 件のコメント:

コメントを投稿