웹개발 프로젝트를 진행하고 있는데, 멘토님으로부터 피드백을 받아 DB를 이중화를 시켜서 장애 발생시의 경우를 처리할 수 있게,
Replication을 해보는게 어떻게 냐는 피드백을 받아 한번 진행해봤습니다.
MySQL Replication(복제)
replication이란 말에서 알수 있듯이 복제를 하겠다는 의미를 가지고 있습니다.
2대 이상의 DBMS나눠서 데이터를 저장하는 방식이며, 최소한의 구성은 Master/Slave 입니다.
여기서 Slave라는 단어는 정치적으로 부적절한 단어여서 앞으로는 Replica 라고 부르겠습니다 !
(실제로 mysql에서의 GRANT시에 slave라는 단어는 권장하지 않는다고 warning을 띄워주고 있습니다)
그렇다면 Master/Replica의 역할은 뭘까요?
Master DBMS:
웹서버에서 보내는 요청중 수정/등록/삭제에 대항 요청시 바이너리로그를 생성하여 Replica서버에 전송합니다.
Replica DBMS:
Master DBMS로 부터 전달받은 바이너리 로그를 자신의 데이터로 반영하게 됩니다. (복제)
보통 요청이 많은 읽기를 담당하게 됩니다.
MySQL Replication 주의사항
조심해야될 몇가지 부분들이 존재합니다.
- Mysql의 버전을 Master와 Replica를 동일하게 가져가는게 좋습니다 (호환성)
- 만약에 버전이 다른경우 Replica서버가 상위 버전이여야 합니다.
- Replication을 구동시에 무조건 Master -> Replica 순으로 진행해야합니다.
MySQL Replication 구현해보기
Master와 Replica의 구성은 위와 같이 등록/수정/삭제는 Master서버로, 읽기는 Replica서버가 담당하게 구성화 해보도록 하겠습니다.
1. MySQL DB, 계정생성 및 권한 설정
1. 일단은 DB를 먼저 생성해줍니다 (root계정으로 접속하였습니다)
mysql> CREATE DATABASE repl_db DEFAULT CHARACTER SET utf8;
mysql> CREATE USER user22@'%' IDENTIFIED BY 'qwe123';
mysql> GRANT ALL PRIVILEGES ON repl_db.* TO user22@'%' IDENTIFIED BY 'qwe123';
2. 계정을 하나 생성해주고, 모든 권한을 부여해줍니다.
3. Replication를 진행할 계정을 생성합니다.
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'qwe456';
2. MySQL 설정 (my.cnf)
my.cnf파일을 들어가 아래내용을 추가해줍니다.
vi에디터로 수정해줍니다.
들어가는법 -> vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1
여기서 server-id 는 데이터베이스의 고유번호이며 Master가 1번을 담당하고 그 이외에 DB는 아무숫자나 지정하셔도 상관없습니다.
3. MySQL 재시작
$ systemctl restart mysqld
4. Master 서버 정보 확인
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 | 287 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
여기서 2가지만 기억하시면 됩니다.
File에 해당되는 로그파일명과 Position에 해당되는 로그 파일내 읽을 위치입니다.
즉 mysql-bin.000010과 287를 기억해두세요!!!
5. 동기화할 DB를 dump(백업) 파일로 추출합니다.
mysqldump -u root -p -user22 repl_db > repl_db.sql
생성된 dump파일을 이제 Replica DB가 있는 서버로 전송해주면 됩니다.
scp -P 22 repl_db.sql root@xxx.xx.xxx.xxx:/root
Master는 준비 끝! 자 이제 Replica쪽으로 가봅시다.
위 과정과 동일하게 일단은 DB를 이름이 똑같게 하나를 생성해주시고,
계정 역시 생성해줍니다.
1. my.cnf 설정
[mysqld]
server-id=2
replicate-do-db='repl_db'
1번을 제외한 아무숫자나 가능합니다!
2. MySQL dump파일 복원
$ mysql -u user22 -p repl_db < repl_db.sql
$ mysql -u user22 -p
생성되있는 DB에 dump를 한 다음에 접속해줍니다.
3. Master 서버로 연결하기 위한 설정
mysql> change master to
master_host='xx.xxx.xx.xxx',
master_user='repl_user',
master_password='test456',
master_log_file='mysql-bin.000010',
master_log_pos=287;
생성되있는 DB에 dump를 한 다음에 접속해줍니다.
4. MySQL 재시작
$ systemctl restart mysqld
놀랍게도 여기까지가 끝 입니다!
만약 여기까지 잘 됬다면, 확인을 해봐야겠죠!
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.65.148
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000012
Read_Master_Log_Pos: 434
Relay_Log_File: slave-relay-bin.000042
Relay_Log_Pos: 419
Relay_Master_Log_File: mysql-bin.000012
여기가 No이거나 Connecting 중이면 에러입니다.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: repl_db,repl_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: 434
Relay_Log_Space: 419
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
1 row in set (0.00 sec)
'MySQL' 카테고리의 다른 글
MySQL & Oracle 문법의 차이 (0) | 2023.01.13 |
---|---|
MySQL VS Oracle 차이점 (1) | 2023.01.13 |
MySQL Join Query (0) | 2023.01.13 |