[MySQL] Replication 구성

곽동규·2024년 4월 25일
0

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개의 댓글

관련 채용 정보