MySQL 은 이중화 기법으로 비동기, 반동기 방식 2가지를 제공한다.
참고로 Goldilocks 에서는 이중화 방식으로 Cyclone 툴인 비동기 방식, Cluster 인 완전한 동기화 방식을 지원합니다.
비동기 방식
마스터 측은 슬레이브에 반영되었는지에 대한 여부를 판단하지 않습니다.
따라서 네트워크 비용 + 슬레이브 동기화 비용이 빠지기 때문에 사용자는 빠른 응답을 받게됩니다.
그러나 만약 네트워크 장애가 발생한다면 마스터와 슬레이브의 갭 차이는 벌어지게 됩니다.
반동기 방식
마스터 측은 슬레이브에 릴레이 로그 기록까지를 동기화 범주로 판단합니다.
이후 이 로그를 이용하여 슬레이브의 실 데이터베이스 업데이트는 판단하지 않습니다.
여기에서는 네트워크 비용 + 슬레이브 동기화 비용이 추가됩니다.
그렇지만 장애 발생 시 슬레이브에서 응답을 받지 못하게 되는 마스터는 대기현상이 발생하므로 데이터 차이는 벌어지지 않게 됩니다.
두가지 방식 중 비동기 방식 이중화를 구성해보도록 하겠습니다.
[mysqld] log-bin=mysql-bin server-id=1
$ 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)
Master-mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.04 sec)
$ mysqldump --single-transaction -u root -p --all-databases > mozi.sql Enter password:
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)
Master-mysql> UNLOCK TABLES; Query OK, 0 rows affected (0.00 sec)
[mysqld] log-bin=mysql-bin server-id=2
$ mysql -u root -p < mozi.sql Enter password:
옵션 |
설명 |
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)
'Database > MySQL' 카테고리의 다른 글
[MySQL] 실행한 쿼리를 파일로 확인하기 (0) | 2018.10.17 |
---|---|
[MySQL] 인덱스 종류 및 고려사항 (단일, 복합, 클러스터, 논클러스터, 커버드) (0) | 2018.10.17 |
[MySQL] 소켓 번호 변경하기 (0) | 2018.10.08 |
[MySQL] NL, Sort Merge, Hash Join 최적의 결합 방법 선택하기 (1) | 2018.08.17 |
[MySQL] Establishing SSL connection without server's identity verification is not recommended. (0) | 2018.07.04 |