본문으로 건너뛰기

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에서만 적용시켰으며, jook DB의 데이터가 업데이트될 때만 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)
  • 권한 설정 후, 아래와 같이 mysql DB의 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로 동기화 여부를 확인합니다.