[MySQL] Replication 구성

곽동규·2024년 4월 25일

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 서버에 복제하여 데이터의 가용성과 안정성을 높이고 읽기 쿼리 성능을 향상시키는 기능

MASTER 서버 설정

1. slave 에서 접속할 repl 계정 생성

  • mysql [(none)] > grant replication slave on . to repl@'172.16.1.38' identified by 'pwrepl';
    mysql [(none)] > flush privileges;
  • mysql [(none)] > quit

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. 마스터 서버 포지션 값 확인

추가) my.cnf 설정에 /data/mysql/data 를 DB의 데이터 디렉터리로 설정해 두었으며, 해당 경로에 데이터 정보들이 있음.

SLAVE 서버 설정

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

Master – Master

dual master 설정도 가능 합니다.

1. Slave 서버 정보 확인

2. master에서 접속할 계정 생성

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

Master - Master 설정의 주의점

  1. 데이터 일관성에 대해 고민을 해보아야 합니다. 두 서버에서 동일한 데이터 레코드에 대해 동시에 쓰기 작업을 수행하면 충돌이 발생할 수 있습니다. 이를 관리하기 위해 적절한 애플리케이션 레벨 또는 데이터베이스 레벨의 락(locking) 메커니즘을 구현해야 합니다.
  2. 네트워크 지연이나 높은 트래픽으로 인해 복제 지연이 발생할 수 있습니다. 이는 데이터 불일치를 초래할 수 있으므로, 복제 상태를 주기적으로 모니터링하고, 필요한 경우 조치를 취해야 합니다.
  3. Master-Master 복제 환경에서는 로드 밸런서를 사용하여 쓰기와 읽기 요청을 적절히 분산시키는 것이 좋습니다. 이를 통해 성능을 최적화하고, 한 서버에 과부하가 걸리는 것을 방지할 수 있습니다.

0개의 댓글