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 를 사용해 접속하려 한다.