MySQL 5.7에서 마스터-슬레이브(Master-Slave) 구성을 설정하는 방법
MySQL 복제 작동 방식
테스트 환경
호스트 이름 | 아이피 | 역할 | 운영체제 버전 | MySQL 버전 | Server_id |
비고 |
node1 | 192.168.56.101 | master | Ubuntu 22.04.2 LTS | Ver 5.7.41 | 1 | |
node2 | 192.168.56.102 | slave | Ubuntu 22.04.2 LTS | Ver 5.7.41 | 2 | |
node3 | 192.168.56.103 | slave | Ubuntu 22.04.2 LTS | Ver 5.7.41 | 3 |
MySQL 5.7에서 마스터-슬레이브(Master-Slave) 구성을 설정하는 방법은 다음과 같습니다.
1. 마스터 서버 설정
마스터 서버의 my.cnf 파일을 열어서 다음 구성을 추가합니다.
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
마스터 서버를 다시 시작(재기동)하여 설정 변경 사항을 적용합니다.
MySQL 쉘에 접근
/usr/local/mysql/bin/mysql -uroot -p'mysqlpassword'
Replication User 생성하기
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
마스터 상태 확인
flush tables with read lock;
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
show master status\G
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000005
Position: 771
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
2. 슬레이브 서버 설정
슬레이브 서버의 my.cnf 파일을 열어서 다음 구성을 추가합니다.
[mysqld]
...
server-id=2
skip-slave-start
슬레이브 서버를 다시 시작하여 설정 변경 사항을 적용합니다.
3. 마스터 서버에서 백업 데이터 준비
마스터 서버에서 데이터베이스를 백업하고 이를 슬레이브 서버로 전송하는 방법은 여러 가지가 있습니다.
여기서는 mysqldump를 사용하여 백업하고 백업 파일을 슬레이브 서버로 복사하는 방법을 설명하겠습니다.
mysqldump -u <username> -p <database_name> > backup.sql
/usr/local/mysql/bin/mysqldump -uroot -p'mysqlpassword' --all-databases > allDBbackup-${HOSTNAME}_$(date +%Y%m%d).sql
$ /usr/local/mysql/bin/mysqldump -uroot -p'mysqlpassword' --all-databases > allDBbackup-${HOSTNAME}_$(date +%Y%m%d).sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
위 명령을 실행하면 backup.sql 파일에 데이터베이스 백업이 저장됩니다.
$ ls -l allDBbackup-node1_20230523.sql
-rw-r--r-- 1 root root 887256 May 23 08:27 allDBbackup-node1_20230523.sql
SSH KEY 생성 및 배포
ssh-keygen -t rsa
ssh-copy-id root@192.168.56.101
데이터베이스 백업 파일 전송(마스터 서버에서 슬레이브 서버로 전송)
scp allDBbackup-node1_20230523.sql root@192.168.56.101:~
4. 슬레이브 서버에서 마스터 정보 설정
데이터베이스 임포트
/usr/local/mysql/bin/mysql -uroot -p'mysqlpassword' --force < allDBbackup-node1_20230523.sql
MySQL 쉘 접속
/usr/local/mysql/bin/mysql -uroot -p'mysqlpassword'
슬레이브 서버로 이동하여 다음 명령을 실행합니다.
CHANGE MASTER TO MASTER_HOST='<마스터_IP>', MASTER_USER='<마스터_사용자>', MASTER_PASSWORD='<마스터_비밀번호>', MASTER_LOG_FILE='<마스터의_binlog_파일>', MASTER_LOG_POS=<마스터의_binlog_위치>;
위 명령에서 다음 정보를 마스터 서버의 설정에 맞게 변경합니다.
- <마스터_IP>: 마스터 서버의 IP 주소
- <마스터_사용자>: 마스터 서버의 사용자 이름
- <마스터_비밀번호>: 마스터 서버의 비밀번호
- <마스터의_binlog_파일>: 마스터 서버의 현재 이진 로그 파일
- <마스터의_binlog_위치>: 마스터 서버의 현재 이진 로그 파일의 위치
CHANGE MASTER TO
MASTER_HOST='192.168.56.101',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=514;
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.56.101',
-> MASTER_USER='replication_user',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000003',
-> MASTER_LOG_POS=514;
Query OK, 0 rows affected, 2 warnings (0.08 sec)
5. 슬레이브 서버 시작
슬레이브 서버에서 다음 명령을 실행하여 슬레이브 서버를 시작합니다.
START SLAVE;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
이 명령을 실행하면 슬레이브 서버가 마스터 서버와의 복제를 시작합니다.
6. 마스터 및 슬레이브 상태 확인
슬레이브 서버에서 다음 명령을 실행하여 마스터 및 슬레이브 상태를 확인합니다.
- 마스터
SHOW MASTER STATUS;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 514 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
- 마스터
SHOW SLAVE HOSTS;
mysql> SHOW SLAVE HOSTS;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 2 | | 3306 | 1 | 168e9cb8-f8f7-11ed-993f-080027182df0 |
| 3 | | 3306 | 1 | 3ebc580f-f8f7-11ed-adcf-080027704bff |
+-----------+------+------+-----------+--------------------------------------+
2 rows in set (0.00 sec)
- 마스터
show processlist\G
mysql> show processlist\G
*************************** 1. row ***************************
Id: 5
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: starting
Info: show processlist
*************************** 2. row ***************************
Id: 9
User: replication_user
Host: node2:50060
db: NULL
Command: Binlog Dump
Time: 125
State: Master has sent all binlog to slave; waiting for more updates
Info: NULL
*************************** 3. row ***************************
Id: 10
User: replication_user
Host: node3:38394
db: NULL
Command: Binlog Dump
Time: 43
State: Master has sent all binlog to slave; waiting for more updates
Info: NULL
3 rows in set (0.00 sec)
- 슬레이브
show slave status\G
- node2
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.101
Master_User: replication_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 514
Relay_Log_File: node2-relay-bin.000004
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
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: 527
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_UUID: 3ef5caf4-f619-11ed-96e6-080027704bff
Master_Info_File: /usr/local/mysql-5.7.41/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
- node3
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.101
Master_User: replication_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 514
Relay_Log_File: node3-relay-bin.000006
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
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: 527
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_UUID: 3ef5caf4-f619-11ed-96e6-080027704bff
Master_Info_File: /usr/local/mysql-5.7.41/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
이러한 명령을 실행하면 마스터 및 슬레이브 서버의 상태 정보가 표시됩니다. 슬레이브 서버의 Slave_IO_Running 및 Slave_SQL_Running 값이 Yes로 표시되는지 확인하여 복제가 제대로 작동하는지 확인할 수 있습니다.
이제 MySQL 5.7에서 마스터-슬레이브 구성을 설정했습니다. 마스터 서버에서 데이터베이스 변경이 발생하면 해당 변경이 슬레이브 서버로 자동으로 복제될 것입니다.
'리눅스' 카테고리의 다른 글
[리눅스] MySQL에서 신규 데이터베이스를 생성하고 데이터를 추가하고 조회하는 방법 (0) | 2023.05.23 |
---|---|
[리눅스] MySQL에서 사용자의 패스워드를 변경하는 방법 (0) | 2023.05.21 |
MySQL 서버에서 UUID 확인하는 방법 (0) | 2023.05.20 |
CentOS 7에서 rc-local(rc.local) 서비스를 활성화하는 방법 (0) | 2023.05.20 |
우분투에서 IP 주소를 고정하는 방법 (0) | 2023.05.20 |