본문 바로가기

카테고리 없음

MySQL 5.5 Replication v1.0

MySQL 5.5 Replication

 

from

 

1.    MySQL Replication

MySQL Replication 은 단어 그대로 복제된 데이터 베이스를 말한다. 복제의 대상이 된 Original Master 로 지칭하며 복제의 결과물을 Slave 라 한다.

 

MySQL Replication ORACLE Dataguard 와 대응하는 개념이라 보면 된다.

 

다만 Instance Level 로 복제되는 Oracle 과 달리 Instance Level 뿐만 아니라 Database (MySQL 에서의… Schema 를 말한다.) 또는 Table 로 한정지을 수 있다.

 

이 게시물에서는 같은 장비에 Replication 을 과거데이타 없이 구성한다고 가정하여 진행하겠다.

 

2.    Configuration for MySQL Replication (OUTLINE)

l  Master

my.cnf 파일에 다음의 내용을 추가한다.

 

-      server_id

 

Slave 에서 접속 할 유저를 생성한다.

 

l  Slave

my.cnf 파일에 다음의 내용을 추가한다.

 

-      server_id

 

mysql 에 접속하여 다음의 명령을 실행한다.

 

-      change master

 

사용하는 예는 다음과 같다.

change master to

master_host = 'xxx.xxx.xxx.xxx',

master_user = 'user',

master_password = 'pass',

master_port = port_number,

master_log_file = 'Binary_log_name',

master_log_pos = Binary_log_position

 

(master_port master_log_pos 는 양의 정수값을 받는다. ‘ ‘ 를 사용하지 않는다.)

 

3.    Scenario

Replication 구성이 동일 장비에 구 데이타 없이 구성된다고 가정하겠다.

datadir 은 생략하였다. ( 해당 파라미터 생략시 base directory 밑의 data 폴더를 datadir 로 사용한다. )

 

 

<Master>

base directory = /home/mysql/mysql1

 

[client]

port = 7000

socket = /tmp/mysql1.sock

 

[mysqld]

port = 7000

socket = /tmp/mysql1.sock

server_id = 7000

log-bin=mysql-bin

 

<Slave>

basse directory = /home/mysql/mysql2

 

[client]

port = 7001

socket = /tmp/mysql2.sock

 

[mysqld]

port = 7001

socket = /tmp/mysql2.sock

server_id = 7001

 

 

<MySQL 설치>

 

l  in Master

 

oracle32@/home/mysql/mysql1>mkdir conf

oracle32@/home/mysql/mysql1>cd support-files/

oracle32@/home/mysql/mysql1/support-files>cp my-small.cnf ../conf/my.cnf

 

앞서 언급한대로 위에서 복제한 my.cnf 를 열어 [mysqld] 항목의 port, socket, server_id 를 수정하였다.

 

oracle32@/home/mysql/mysql1>./scripts/mysql_install_db --defaults-file=/home/mysql/mysql1/conf/my.cnf --user=mysql

 

설치를 완료했다. Slave 도 위와 같이 설치한다. 앞서 언급한 대로 my.cnf [mysqld] 항목에서 port, socket 을 구성해 진행한다.

 

<MySQL 기동>

 

l  in Master

 

oracle32@/home/mysql/mysql1>./bin/mysqld_safe --defaults-file=/home/mysql/mysql1/conf/my.cnf --user=mysql &

 

l  in Slave

 

oracle32@/home/mysql/mysql2>./bin/mysqld_safe --defaults-file=/home/mysql/mysql2/conf/my.cnf --user=mysql &

 

<MySQL 접속>

 

l  in Master

 

oracle32@/home/mysql/mysql1>./bin/mysql -uroot --socket=/tmp/mysql1.sock

 

l  in Slave

 

oracle32@/home/mysql/mysql2>./bin/mysql -uroot --socket=/tmp/mysql2.sock

 

<MySQL Process 확인>

Replication 구성 전 각 노드의 프로세스를 확인해 보았다.

 

l  in Master

 

mysql> show processlist

    -> ;

+----+------+-----------+------+---------+------+-------+------------------+

| Id | User | Host      | db   | Command | Time | State | Info             |

+----+------+-----------+------+---------+------+-------+------------------+

|  1 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |

+----+------+-----------+------+---------+------+-------+------------------+

1 row in set (0.00 sec)

 

l  in Slave

 

mysql> show processlist;

+----+------+-----------+------+---------+------+-------+------------------+

| Id | User | Host      | db   | Command | Time | State | Info             |

+----+------+-----------+------+---------+------+-------+------------------+

|  1 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |

+----+------+-----------+------+---------+------+-------+------------------+

1 row in set (0.00 sec)

 

Replication 구성 이전이며 또 Test 용도이기에 위 쓰레드 뿐이다.

 

<Replication 구성>

l  in Master

 

mysql> grant replication client,replication slave on *.*

    -> to 'mysql2'@'10.10.10.31' identified by 'mysql2';

Query OK, 0 rows affected (0.00 sec)

 

mysql> show binary logs;

+------------------+-----------+

| Log_name         | File_size |

+------------------+-----------+

| mysql-bin.000001 |       107 |

+------------------+-----------+

1 row in set (0.00 sec)

 

l  in Slave

 

mysql> change master to

    -> master_host = '10.10.10.31',

    -> master_user = 'mysql2',

    -> master_password = 'mysql2',

    -> master_port = 7000,

    -> master_log_file = 'mysql-bin.000001',

    -> master_log_pos = 107;

Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)

 

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

 

<Process 확인>

l  in Master

mysql> show processlist;

+----+--------+-------------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+

| Id | User   | Host                    | db   | Command     | Time | State                                                                 | Info             |

+----+--------+-------------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+

| 37 | mysql2 | oracle32.test.com:64005 | NULL | Binlog Dump |  299 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL             |

| 38 | root   | localhost               | NULL | Query       |    0 | NULL                                                                  | show processlist |

+----+--------+-------------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+

2 rows in set (0.00 sec)

 

l  in Slave

mysql> show processlist;

+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+

| Id | User        | Host      | db   | Command | Time | State                                                                       | Info             |

+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+

| 17 | root        | localhost | NULL | Query   |    0 | NULL                                                                        | show processlist |

| 18 | system user |           | NULL | Connect |    4 | Waiting for master to send event                                            | NULL             |

| 19 | system user |           | NULL | Connect |  399 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |

+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+

3 rows in set (0.00 sec)

 

4.    Replication 구성 시 주의점

l  Change master 구문 사용시 master_log_file 에 경로는 쓰지 않는다.

절대경로를 쓴 경우 Master Binlog Dump 항목이 보이지 않았고 Slave 에서는 Slave has read all relay log 항목만 나타났다. Slave Alert log 를 확인한 결과 Relay log 를 만드는 Process 가 잘못된 파일경로로 killed 되었음을 확인하였다.

l  Start slave 구문이 성공하더라도 process list 확인했을 때 Master Binlog Dump, Slave Waiting for master to send event, Slave has read all relay log 가 나타나지 않으면 구성이 잘못된 것이다.

l  동일한 장비에 Replication 구성 시 (test 때를 제외하고 이럴 일은 없다.) mysql 접속 때 각기 다른 sock 를 사용해 접속해야 한다. mysql -S (= --socket) 옵션을 사용하지 않는 경우 /tmp/mysql.sock 를 사용해 접속하려 한다.