개발 노트

MySQL - SQL Replication 본문

데이타베이스/MySQL

MySQL - SQL Replication

알 수 없는 사용자 2023. 1. 9. 16:42

레플리케이션은 마스터 와 슬레이브로 나눠서 데이터를 복제한다.

우선 데이터 복제는 방식에 따라 두가지로 나뉜다.

 

동기 - Master 수정 -> 즉시 Slave 수정 -> 적합성이 높다

비동기 - Mster 수정 -> 잠시 후 Slave 수정 -> 성능이 높다  두가지를 합치면 semi-sync라고 있다더라.

 

Replication의 방식은 다양하다. (기본적으로는 비동기 복제 방식을 따른다.)

기본적으로 Master 노드에서 변경되는 데이터에 대한 이력을 로그(Binary Log)에 입력(기록)하면 Replication Master Thread가 비동기적으로 이를 읽어서 Slave쪽으로 전송하는 방식.

 

동기 - 모든 변화에 대해 Slave의 적용에 대한 응답을 수신

        └ 트랜잭션 도중 발생되는 변경에 대해서는 비동기로 작동하다가 Commit 단계에만 Slave 응답을 수신하도록 가능

비동기 - 파일의 로그를 별도의 스레드가 읽어서 Slave로 전송하는 방식

            └ 트랜잭션을 수행하는 스레드가 직접 Slave로 변경 사항을 전송하도록 구현될 수도 있을 것이다.\

 

**트랜잭션은 데이터베이스를 상태를 바꾸는 일종의 작업 단위이다.

아래는 레플리케이션 진행 순서이다.

 

Replication을 위해 반드시 필요한 요소

참고용 이미지 출처:http://cloudrain21.com/mysql-replication

- Master에서의 변경을 기록하기 위한 Binary Log

- Binary log를 읽어서 Slave쪽으로 데이터 전송을 위한 Master Thread

- Slave에서 데이터를 수신하여 Relay Log에 기록하기 위한 I/O Thread

- Relay Log를 읽어서 해당 데이터를 Slave에 Apply(적용)하기위한 SQL Thread

 

**위의 사진에서 바이너리 로그를 전송할 때는 비동기적으로 전송한다.

 

데이터 -> 다른 노드로 복제하는 상황에서 여러 방식이 있다.

1. SQL전송 Replay방식 - SBR(Statement Baseed Replication - 로그의 크기가 작다.

2. 변경되는 Row데이터 전송->복제 - RBR(Row Based Replication) - 데이터 적합성 유리.   

3. 위의 방식들을 섞은 MBR(Mixed Based Replication) - 평상시에는 SBR, 비결정성(Unsafe Statement)를 만나면? RBR로 기록

 

SQL의 성격, 데이터 양을 고려해서 방식을 선택하면 된다.

 

Replication 구성 요소들 설명

1. Master Thread

Master Thread = 서버라고 보면된다, Slave Thread가 클라이언트로써 접속요청을 할 시에 마스터에는 Slave가 로그인 할 수 있는 계정과 권한이 필요하다.

 

Master쪽으로 동시에 다수의 Slave Thread가 접속 할 수 있기에, Master Thread와 Slave Thread는 1:1 대응이다.

└한가지 역할 수행 = Binary Log를 읽어서 Slave로 전송 -> Binlog Sender 또는 Binlog Dump라고도 불린다.

 

Slave의 접속은 Client와 다를바 없다.

-> 접속 후 Binary log의 송신을 요청하는 명령어를 쏴야한다.

(COM_BINLOG_DUMP와 COM_BINLOG_DUMP_GTID)

└Binary Log 파일명과 포지션에 의해     16GTID에 의해 Binary Log 포지션 결정

**Position은 실제 파일의 바이트 수를 의미한다.

 

위의 작업 이후에 COM_QUERY라는 Protocol을 통해 실제 데이터(SQL)송신을 요청한다.

 

2.Slave I/O Thread

연속적으로 수신한 데이터를 로그파일에 순차적 기록

Relay Log Format(방식) = Binary Log Format  = 둘의 방식은 동일한다(인덱스 파일 존재o, 파일명에 6자리 숫자가 붙음o)

└Replication 시작시 자동 생성(Relay log를 확인하는 명령어 = SHOW RELAYLOG EVENTS)

 

3.Relay Log

파일의 기본적인 이름은 '호스트명-relay-log'이며 호스트 이름이 변경될경우 오류 발생의 위험이 있으니 relay_log옵션을 이용하여 의도적으로 정해야 한다.

 

4.Slave SQL Thread

relay log의 변경 데이터를 읽어서 스토리지 엔진을 통해 slave측에 replay(재생)하는 Thread이다.

처리량과 연산량이 I/O < SQL이다. 왜? DB내의 실제 내용을 변경하기 때문이다.

└이는 Replication처리의 병목지점이 될 수 있다는 것을 의미한다.

Master측은 많은 수의 Thread가 변경을 발생시키고 있는데

Slave에서는 하나의 SQL Thread가 DB반영 작업을 수행하기 때문이다.

=> MTS 등장 => SQL Thread가 병렬로 DB 갱신 수행

 

 

 

 

 

 

'데이타베이스 > MySQL' 카테고리의 다른 글

Nodejs -> mysql 대량의 값을 insert 또는 delete  (0) 2023.04.25
mySQL Replication A to Z mySQL 동기화  (0) 2023.01.19
mySQL DATETIME 타입  (0) 2022.12.09
Query  (0) 2022.11.21
sql  (0) 2022.04.19