일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 컴포넌트
- springboot
- Maven
- spring
- Stateless
- Render
- 스프링
- 리액트
- SpringFramework
- 다형성
- 스프링프레임워크
- mysql
- 스프링 게시판
- mybatis
- 둔산동
- State
- spring framework
- Java
- react
- Ajax
- spring게시판
- 자바
- Restful
- 지족동
- 재정의
- rest
- Gradle
- reactjs
- 스프링게시판
- 스프링부트
- Today
- Total
Dev.GA
[MySQL] MySQL Replication 구성하기 본문
[MySQL] MySQL Replication 구성하기
Replication : 복제
DB 이중화 방식 중 하나로 MySQL에서는 Replication(복제)이라는 기능을 제공하여 Master(#1)와 Slave(#2)간의 데이터 복제를 가능하게 한다.
MySQL은 bin-log라고 하는 binary log에 변경된 정보를 기록하며, Slave(#2)가 Master(#1) 측에서 변경된 정보를 기록한 binary log를 읽어 본인의 DB에 저장하여 복제가 이루어진다.
그럼 MySQL Replication을 구성하기 위한 Master와 Slave에서 설정방법에 대해 알아보자.
1. Master Configuration
1-1. Replication User 생성하기
Slave(#2)가 Master(#1)에 접근하여 변경된 정보를 가져오는 것이기 때문에 Master(#1)에서는 Replication을 위한 전용 계정을 만들어 주어야 한다. root 혹은 기타 계정을 사용할 수 있지만 보안상 문제로 인해 좋지 않은 방법이다.
1 | GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'slavepass'; | cs |
1 2 3 | [mysqld] log-bin=mysql-bin server-id=1 | cs |
1 2 3 4 5 6 7 8 9 10 | [mysql]> flush tables with read lock; Query OK, 0 rows affected (0.00 sec) [mysql]> show master status\G *************************** 1. row *************************** File: mysql-bin.000005 Position: 327 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec) | cs |
1 | mysqldump -uroot -p --all-databases > dump.sql | cs |
2. Slave Configuration
2-1. my.cnf 설정
1 2 3 4 | [mysqld] server-id=2 replicate-do-db='ga' skip-slave-start | cs |
1 | mysql -u root -p --force < dump.sql | cs |
1 2 3 4 5 6 | CHANGE MASTER TO MASTER_HOST='Master server host or IP', MASTER_USER='replication user', MASTER_PASSWORD='replication user password', MASTER_LOG_FILE='Master log file name', MASTER_LOG_POS=position | cs |
3. Check Replication
3-1. [Master] show processlist\G
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | [mysql] > show processlist\G *************************** 1. row *************************** Id: 4 User: root Host: localhost db: NULL Command: Query Time: 0 State: init Info: show processlist Progress: 0.000 *************************** 2. row *************************** Id: 7 User: root Host: 192.168.2.22:56539 db: mysql Command: Sleep Time: 32 State: Info: NULL Progress: 0.000 *************************** 3. row *************************** Id: 8 User: repluser Host: 192.168.2.82:47784 db: NULL Command: Binlog Dump Time: 12 State: Master has sent all binlog to slave; waiting for binlog to be updated Info: NULL Progress: 0.000 3 rows in set (0.00 sec) | cs |
3번의 row를 보면 repleuser라는 계정이 29번째 라인) Master가 보낸 binlog를 slave하였고, 업데이트를 기다리고 있다는 것을 확인 할 수 있다.
3-2. [Slave] show slave status\G
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.81 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 514 Relay_Log_File: localhost-relay-bin.000003 Relay_Log_Pos: 724 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: ga Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 514 Relay_Log_Space: 1026 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: No Gtid_IO_Pos: Replicate_Do_Domain_Ids: Replicate_Ignore_Domain_Ids: Parallel_Mode: conservative 1 row in set (0.00 sec) | cs |
현재 slave의 상태를 보여주는 명령어로 3번째 라인) Master에서 보내주기를 기다린다는 메세지를 통해 Replication이 정상적으로 연결된 것을 알 수 있다. 비 정상적인 연결 설정 혹은 에러는 13,14번째 라인) 에서 Yes가 아닌 No라는 메세지가 나온다면 정상적인 연결이 되지 않았다는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | MariaDB [(none)]> show processlist\G *************************** 1. row *************************** Id: 3 User: root Host: localhost db: NULL Command: Query Time: 0 State: init Info: show processlist Progress: 0.000 *************************** 2. row *************************** Id: 6 User: system user Host: db: NULL Command: Connect Time: 395 State: Waiting for master to send event Info: NULL Progress: 0.000 *************************** 3. row *************************** Id: 7 User: system user Host: db: NULL Command: Connect Time: 370 State: Slave has read all relay log; waiting for the slave I/O thread to update it Info: NULL Progress: 0.000 | cs |
4. 이 밖의 설정