2011年2月9日水曜日

repl太郎

Mysqlのレプリケーション設定してみた。

環境は、
VM上で
CentOS 4.8
Mysql 4.1.22
です。

準備として、Master→Slave、Slave→Masterへ
telnet IPアドレス mysqlのポート(3306?)で
つなげることチェックしておいてください。

確認しないとあとあとめんどいですわ。


MasterとSlaveの設定ファイルを追加します。
serveridの値は、uniqな数字にしてください。
uniqにしないとほかサーバのreplが全停止したりします。
log_binはバイナリログを出力する設定です。(ORACLEのredoログ的なのりだと思ってます)


#Master側
vi /etc/my.cnf
[mysqld]
server-id = 1
log_bin

#Slave側
CMD >vi /etc/my.cnf
[mysqld]
server-id = 2


編集後、Master側、Slave側で設定反映させるためにmysqlを再起動します。

/etc/init.d/mysqld stop
/etc/init.d/mysqld start

#一応、Master側でlog_ binが有効になっているかを確認。

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin   | ON |
+---------------+-------+
1 row in set (0.00 sec)

#Master側にレプリケーション専用のユーザをつくります。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'SlaveサーバのIP' IDENTIFIED BY 'パスワード';

#んでユーザできたか、確認
mysql> select * from mysql.user where user = 'replication'\G

*************************** 1. row ***************************
Host: IPアドレス
User: replication
Password: ********
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: Y
Repl_client_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
1 row in set (0.00 sec)



んで、Master側のバイナリログの出力ポジションを確認する。
Slaveからは、、File(BALTHAZAR-bin.000002)の、position(203)から
レプリケーションを開始する必要があるので、必ず確認する。


mysql> SHOW MASTER STATUS;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| BALTHAZAR-bin.000002 | 203 | | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

#んでSlave側で、Masterの情報を設定する。
mysql> CHANGE MASTER TO MASTER_HOST = 'MASTER側のIP',
-> MASTER_USER = 'replication',
-> MASTER_PASSWORD = 'replicationユーザのパスワード',
-> MASTER_LOG_FILE = 'BALTHAZAR-bin.000002',
-> MASTER_LOG_POS = 203;

#Slaveを動かす。
mysql> START SLAVE;

#Master側で状態を見てみる。
mysql> show processlist\G
*************************** 2. row ***************************
Id: 7
User: replication
Host: IPアドレス:32855
db: NULL
Command: Binlog Dump
Time: 18
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL

#Slave側で状態を見てみる。

*************************** 2. row ***************************
Id: 26
User: system user
Host:
db: NULL
Command: Connect
Time: 4
State: Waiting for master to send event
Info: NULL
*************************** 3. row ***************************
Id: 27
User: system user
Host:
db: NULL
Command: Connect
Time: 4
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL




#最後にほんとにレプリケーションできてるかっつーことでMaster側で
mysql> use test
Database changed

mysql> CREATE TABLE SAS (id int(10));
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO SAS VALUES (1);
;
mysql> select * from SAS;
+------+
| id |
+------+
| 1 |
+------+

#Slave側で、
mysql> use test
Database changed

mysql> select * from SAS;
+------+
| id |
+------+
| 1 |
+------+



SLAVE側から接続するとき、最初ちゃんとできませんでした。
FWの設定をいじったら接続できるようになりましたわ。
↓こうなって、masterへ接続できんかった。


*************************** 2. row ***************************
Id: 4
User: system user
Host:
db: NULL
Command: Connect
Time: 477
State: Connecting to master
Info: NULL
*************************** 3. row ***************************
Id: 5
User: system user
Host:
db: NULL
Command: Connect
Time: 477
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
3 rows in set (0.00 sec)

0 件のコメント: