Database/MySQL

[MySQL] MySQL 이중화(HA구성)하기

꽁담 2018. 10. 8. 22:32

MySQL 은 이중화 기법으로 비동기, 반동기 방식 2가지를 제공한다.


  참고로 Goldilocks 에서는 이중화 방식으로 Cyclone 툴인 비동기 방식, Cluster 인 완전한 동기화 방식을 지원합니다.


비동기 방식

마스터 측은 슬레이브에 반영되었는지에 대한 여부를 판단하지 않습니다.

따라서 네트워크 비용 + 슬레이브 동기화 비용이 빠지기 때문에 사용자는 빠른 응답을 받게됩니다.

그러나 만약 네트워크 장애가 발생한다면 마스터와 슬레이브의 갭 차이는 벌어지게 됩니다.


반동기 방식

마스터 측은 슬레이브에 릴레이 로그 기록까지를 동기화 범주로 판단합니다.

이후 이 로그를 이용하여 슬레이브의 실 데이터베이스 업데이트는 판단하지 않습니다.

여기에서는 네트워크 비용 + 슬레이브 동기화 비용이 추가됩니다.

그렇지만 장애 발생 시 슬레이브에서 응답을 받지 못하게 되는 마스터는 대기현상이 발생하므로 데이터 차이는 벌어지지 않게 됩니다.



두가지 방식 중 비동기 방식 이중화를 구성해보도록 하겠습니다.

MySQL 에 대한 기본지식을 가지고 있다는 바탕으로 진행됩니다.

Master 구성
1. my.cnf 의 mysqld 에 프로퍼티를 설정합니다.
   server-id 는 각 데이터베이스 별로 고유값이어야 합니다.
[mysqld]
log-bin=mysql-bin
server-id=1
2. MySQL 을 재구동 합니다.

3. 이중화를 진행할 계정을 생성합니다.
$ mysql -u root -p mysql
mysql> GRANT REPLICATION SLAVE ON *.* TO 'mozi'@'%' IDENTIFIED BY 'tistory';
Query OK, 0 rows affected, 1 warning (5.41 sec)
4. 이중화 구성 시, 데이터 변경작업이 있으면 안되므로 쓰기 작업을 막습니다.
   주의할 점이 있습니다. 이 세션이 나가게 되는 경우 LOCK 이 해제되므로 세션을 종료하여서는 안됩니다.

Master-mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.04 sec)

5. 데이터베이스를 백업받습니다.
$ mysqldump --single-transaction -u root -p --all-databases > mozi.sql
Enter password:
6. 생성된 Dump 의 지점을 확인합니다.
Master-mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mysqld-bin.000011 |     1942 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
7. LOCK 을 해제합니다.
Master-mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

Slave 구성
1. my.cnf 의 mysqld 에 프로퍼티를 설정합니다.
[mysqld]
log-bin=mysql-bin
server-id=2
2. MySQL 을 재구동 합니다.

3. Master 에서 백업받은 데이터베이스를 Slave 에 적용합니다.
$ mysql -u root -p < mozi.sql 
Enter password: 
4. Master 의 정보를 입력하여 이중화를 구성합니다.
  입력해야 할 정보는 다음과 같습니다.

 옵션

 설명

 MASTER_HOST

 마스터의 호스트 IP

 MASTER_USER

 마스터에서 생성한 이중화 계정 아이디

 MASTER_PASSWORD

 마스터에서 생성한 이중화 계정 비밀번호

 MASTER_PORT

 마스터의 소켓 번호

 MASTER_LOG_FILE 마스터의 SHOW MASTER STATUS 에서 나온 File 값
 MASTER_LOG_POS

 마스터의 SHOW MASTER STATUS 에서 나온 Position 값

Slave-mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.50', MASTER_USER='mozi', MASTER_PASSWORD='tistory', MASTER_PORT=3307, MASTER_LOG_FILE='mysqld-bin.000011', MASTER_LOG_POS=1942;
Query OK, 0 rows affected, 2 warnings (0.14 sec)

5. 슬레이브를 시작합니다.

Slave-mysql> START SLAVE;
Query OK, 0 rows affected (0.02 sec)


Master 에서 테이블 생성 및 데이터 적재 후 Slave 에서 조회

Master-mysql> CREATE TABLE MOZI (C1 INT, C2 VARCHAR(20));
CQuery OK, 0 rows affected (0.31 sec)

Master-mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

Master-mysql> INSERT INTO MOZI VALUES (1, 'MOZI');
Query OK, 1 row affected (0.08 sec)

Master-mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

Master-mysql> SELECT * FROM MOZI;
+------+------+
| C1   | C2   |
+------+------+
|    1 | MOZI |
+------+------+
1 row in set (0.00 sec)
Slave-mysql> SELECT * FROM MOZI;
+------+------+
| C1   | C2   |
+------+------+
|    1 | MOZI |
+------+------+
1 row in set (0.00 sec)