mysql replication 설정하는 방법은 무엇인가요?
💡 요약 정리
- MySQL replication은 master 서버의 bin_log를 이용하여 slave 서버의 DB를 자동으로 동기화하는 기능입니다.
- master 서버에서는 bin_log 생성을 위한 my.cnf 설정과 replication 권한 부여가 필요합니다.
- slave 서버는 master 서버의 DB를 수동으로 복사한 뒤, my.cnf 설정과 master 정보 입력을 통해 replication을 시작합니다.
- 설정 후 show slave status 명령어로 replication 상태를 확인해야 합니다.
1. 마스터 서버 설정
① /etc/my.cnf 수정
- Basic Settings에서
bind-address부분을 주석 처리합니다.
#
# * Basic Settings
#
#skip-networking
# = 127.0.0.1
- Logging and Replication에서 아래와 같이 master(
server-id = 1)로 설정합니다.
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
#log = /var/log/mysql/mysql.log
#
# Error logging goes to syslog. This is a Debian improvement :)
#
# Here you can see queries with especially long duration
#log_slow_queries = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = jook
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
-
replication은 master 서버의 bin_log를 기반으로 slave 서버에서 DB를 업데이트하게 됩니다. 다시 말하면, master 서버에서 DB의 업데이트가 발생하면 bin_log에 기록이 되고, slave에서는 그 로그 파일을 읽어서 slave 서버의 DB를 업데이트합니다. 그러므로, master 서버의 bin_log를 생성하지 않으면 replication 적용으로 slave 서버의 DB 업데이트가 불가능합니다.
-
위에서는
binlog_do_db = jook와 같이 설정하여 bin_log를jook라는 DB에서만 적용시켰으며,jookDB의 데이터가 업데이트될 때만 bin_log가 기록됩니다. master 서버에서 bin_log를 기록하지 않을 경우, 위와 같이 replication을 적용할 DB만 bin_log를 생성하도록 설정하면 됩니다.
② mysql 재시작
localhost:~# /etc/init.d/mysql restart
Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.
localhost:~#
③ mysql 접근 권한 설정
localhost:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.0.51a-24-log (Debian)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
- slave 서버에서 접근할 수 있도록 권한을 설정합니다. (10.10.10.62는 slave 서버의 IP입니다.)
mysql> grant replication slave on *.* to 'jook'@'10.10.10.62' identified by 'XXXXXXXX';
Query OK, 0 rows affected (0.00 sec)
- 권한 설정 후, 아래와 같이
mysqlDB의 user 테이블에서 slave 서버의 접근 권한이 추가된 것을 확인할 수 있습니다.
mysql> use mysql;
Database changed
mysql> select * from user;
- 결과 생략 (출력 확인용 테이블)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000013 | 98 | jook | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
④ DB 백업 후 slave 서버로 전송
localhost:~# mysqldump -u jook -p jook > jook.sql
localhost:~# scp jook.sql 10.10.10.62:/root
2. 슬레이브 서버 설정
① master 서버의 DB를 slave 서버로 복사
-
master 서버에서 replication을 적용할 DB를 slave 서버로 옮깁니다.
mysqldump혹은tar,rsync등 어떤 방법이든 사용 가능합니다. -
slave 서버에서 동일한 DB를 생성하고 사용자 권한을 설정합니다.
localhost:~# mysql -u root -p mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 98
Server version: 5.0.51a-24 (Debian)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database jook;
mysql> insert into user (host,user,password) values('localhost','jook',password('XXXXXXXX'));
mysql> insert into db values('localhost','jook','jook','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y');
mysql> flush privileges;
mysql> exit;
- DB 복사 적용
localhost:~# mysql -u jook -p jook < jook.sql
② /etc/my.cnf 설정
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
#log = /var/log/mysql/mysql.log
#
# Error logging goes to syslog. This is a Debian improvement :)
#
# Here you can see queries with especially long duration
#log_slow_queries = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
server-id = 2
master-host = 10.10.10.61
master-port = 3306
master-user = jook
master-password = XXXXXXXX
master-connect-retry = 60
replicate_do_db = jook
#log-slave-update
#log_bin = /var/log/mysql/mysql-bin.log
- master로부터 데이터를 업데이트할 때 slave에서도 log를 생성하려면
log-slave-update주석을 제거해야 합니다. 동시에log_bin주석도 제거되어야 bin_log가 생성됩니다. 둘 중 하나만 주석 제거 시, MySQL 데몬이 정상 실행되지 않습니다.
③ master 정보 업데이트
localhost:~# mysql -u root -p
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 81
Server version: 5.0.51a-24 (Debian)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> change master to master_host='10.10.10.61', master_user='jook', master_password='XXXXXXXX', master_log_file='mysql-bin.000013', master_log_pos=4;
Query OK, 0 rows affected (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
- replication 상태 확인
mysql> show slave status;
| Slave_IO_State | ... |
|---|---|
| Waiting for master to send event | ... |
-
위 항목이 "Waiting for master to send event"이면 업데이트가 정상적으로 연동됩니다.
-
이외에도 DB 못 읽는 경우
change master to master_log_file='...', master_log_pos=...;로 다시 입력하면 됩니다.
④ replication 테스트
- master 서버에서 INSERT, UPDATE로 DB를 수정한 후, slave 서버에서 SELECT로 동기화 여부를 확인합니다.