MySQL Replication 이란?
마스터 서버에서 하나 또는 여러 개의 슬레이브 서버로 데이터를 동기화 시켜주는 기능입니다.
데이터를 실시간으로 백업하거나, DB 서버의 부하를 분산하기 위하여 사용합니다.
Master 역할 : Binary log를 생성하여 이벤트를 기록. Slave 서버에 전달합니다. 주로 Write 용으로 사용됩니다.
Slave 역할 : Master에게 전달받은 Binary log를 읽어 DB에 반영합니다. 주로 Read 용으로 사용됩니다.
(IO thread 가 전달받은 binary log 를 읽어 relay log생성하고, SQL thread는 relay log를 읽고 이벤트를 실행)
결론 : master서버의 데이터를 slave 서버에 복제하여 데이터의 가용성과 안정성을 높이고 읽기 쿼리 성능을 향상시키는 기능
1. slave 에서 접속할 repl 계정 생성
2. my.cnf 설정 추가
# vi /etc/my.cnf
### Replication conf
server-id=1 # ID는 복제 프로세스에서 마스터와 슬레이브를 식별하는 데 사용
#slave-skip-errors = all # 슬레이브 서버가 복제 중 오류를 만났을 때, 모든 오류를 자동으로 건너뛰도록 설정합니다. 이 옵션은 데이터 무결성 문제를 일으킬 수 있으므로 주의해서 사용해야 합니다.
expire_logs_days = 10
max_binlog_size = 1000M
log_slave_updates = 1 # 슬레이브 서버에서 받은 복제 데이터를 슬레이브의 바이너리 로그에 기록하도록 합니다. 이를 통해 슬레이브 서버 자체가 다른 슬레이브의 마스터로 동작할 수 있게 되어, 복제 체인 또는 복제의 다단계 구성이 가능해집니다.
log_bin_index = /data/mysql/data/mysql-bin.log.index # 바이너리 로그 파일의 인덱스 파일 위치를 지정합니다. 이 인덱스 파일은 모든 바이너리 로그 파일의 목록을 유지 관리
log_bin = /data/mysql/data/mysql-bin.log # 바이너리 로깅을 활성화하고, 로그 파일의 이름과 위치를 지정
relay_log = /data/mysql/data/mysql-relay-bin # 슬레이브 서버에서 사용하는 릴레이 로그의 기본 이름과 위치를 설정합니다. 릴레이 로그는 마스터 서버로부터 받은 이벤트를 임시로 저장하는 로그 파일
relay_log_index = /data/mysql/data/mysql-relay-bin.index # 릴레이 로그 파일의 인덱스 파일 위치를 설정
3. DB 재기동
# /usr/local/mysql/bin/mysqladmin -uroot -p shutdown (종료)
# /usr/local/mysql/bin/mysqld_safe -user=mysql & (실행)
# /usr/local/mysql/bin/mysql –uroot –p (접속)
4. 마스터 서버 포지션 값 확인
1. my.cnf 설정 추가
# vi /etc/my.cnf
### Replication conf
server-id=2
#log_bin=mysql-bin
#slave-skip-errors = all
expire_logs_days = 10
max_binlog_size = 1000M
log_slave_updates = 1
read_only = 1 # 읽기 전용으로 설정
log_bin_index = /data/mysql/data/mysql-bin.log.index
log_bin = /data/mysql/data/mysql-bin.log
relay_log = /data/mysql/data/mysql-relay-bin
relay_log_index = /data/mysql/data/mysql-relay-bin.index
2. DB 재기동
# /usr/local/mysql/bin/mysqladmin -uroot -p shutdown (종료)
# /usr/local/mysql/bin/mysqld_safe -user=mysql & (실행)
# /usr/local/mysql/bin/mysql –uroot –p (접속)
3. Master 정보 입력 하며 연동 설정
mysql [(none)] > CHANGE MASTER TO MASTER_HOST='172.16.3.100',MASTER_PORT=3306 , MASTER_USER='repl',MASTER_PASSWORD='pwrepl', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=328;
mysql [(none)] > start slave;
4. 연동 확인
mysql [(none)] > show slave status \G;
*************************** 1. row ***************************
lave_IO_State: Waiting for master to send event
Master_Host: 172.16.3.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 328
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 555
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.
.
.
.
중략
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master 에서 데이터 생성하여 동기화 test
dual master 설정도 가능 합니다.
1. Slave 서버 정보 확인
2. master에서 접속할 계정 생성
Mysql [(mysql)] > grant replication slave on *.* to repl@172.16.3.100 identified by 'pwrepl';
Mysql [(mysql)] > flush privileges;
Mysql [(none)] > stop slave;
- Slave 서버를 master로 인식시키기
mysql [(none)] > CHANGE MASTER TO MASTER_HOST='172.16.1.38',MASTER_PORT=3306 , MASTER_USER='repl',MASTER_PASSWORD='pwrepl', MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=16037;
mysql [(none)] > start slave;
mysql [(none)] > show slave status \G;
*************************** 1. row ***************************
lave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.38
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 16037
.
.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.
.
양쪽 데이터 생성 후 test