MySQL. MariaDB

GTID란? (MariaDB)

케키키케 2022. 6. 1. 18:58

오늘 한번 제대로 알아보자.

일단 공홈에서는 MariaDB와 MySQL의 GTID가 다르게 구현되어 있고, 서로 호환되지 않는다고 말하고 있다.

Note that MariaDB and MySQL have different GTID implementations, and that these are not compatible with each other.

 

나는 MariaDB의 GTID에 대해 알아볼 것이기 때문에, MySQL의 GTID가 궁금한 사람들은 다른 문서를 참고하길 바란다.

 

GTID에 들어가기 앞서..

Master 서버에서는 DML, DDL과 같은 DB를 갱신하는 내용들은 모두 bignary log에 쓴다.

Replica(Slave, 이하 R)서버는 biglog events를  읽고, Primary(Master, 이하 P)와 같은 변경사항을  R에 적용한다.

R은 R에 적용된 마지막 이벤트의 binlog 위치를 추적합니다.

 

 

GTID(Global Transaction ID)란 무엇일까

  • 파일의 물리적인 위치 정보가 아닌, 전체 서버 그룹에서 호환 가능한 가상의 Transaction ID입니다.
  • Transaction은 non-transactional DML과 DDL도 포함합니다.

 

GTID의 장점

1. Easy to change a replica server to connect to and replicate from a different primary server.

R은 이전 P에서 마지막으로 적용된 이벤트 그룹의 GTID를 기억합니다.

공통된 GTID를 사용하기 때문에 복제를 재개할 위치를 쉽게 찾을 수 있습니다.

파일 명과 마지막 P의 offset만 알았던 이전 복제 방식에서는 새로운 P의 정확한 파일명과 offset를 추측하기 어렵습니다.

 

질문

-> 새로운 P도 GTID를 가지고 있는건가? 새로운 P를 올릴 때, 이전 P의 데이터를 모두 복제해서 가지고 있으면 이전 GTID도 복제해오는 것인가?

->  만약 이전 P가 다운된 후에 다시 올라올 수 없는 상황이어서 S에서 복제해서 데이터를 입수시켰다면?

-> 그리고 새로운 P가 올라가면서 server-id가 변경되었다면?  그럼 GTID의 두번째 값이 바뀌는 것 아닌가?

 

2. The state of the replica is recorded in a crash-safe way.

-> 잘 모르겠음.

 

 

어쨋든 이러한 장점들로 인해, MariaDB 10.0.2 또는 이후 버전에서 복제 설정 시 GTID를 사용할 것을 권장하고 있다.

하지만, 이전 방식의 복제 구성 또한 사용이 가능하며, GTID와 이전 복제 방식은 자연스럽게 함께 사용될 수 있다. 

 

 

GTID 구현

'-'로 구분하여 다음과 같이 구성된다.

domain ID - server ID - seq num(ex. 0-1-10)

  • Domain ID : 멀티 소스 레플리케이션 시 사용할 수 있는 마스터 노드의 정보
  • Server ID : Server ID
  • Sequence number : binlog에 기록되는 new event group에 대해 증가하는 숫자


기본적으로 R은 P에서 복제된 마지막 이벤트 그룹의 GTID를 기억한다. 

R과 P에 연결되면, R 기억하고 있던 GTID를  P에 보냅니다. 

그럼 P는 해당 GTID를 기록한 event group의 다음 이벤트부터 R에 전송합니다.

 

 

GTID 사용 방법

1. GTID 확인

요 아래 명령어가 마지막으로 적용된 이벤트의 GTID이다.

SELECT @@GLOBAL.gtid_slave_pos
0-1-1

P -> R 복제 시에 GTID도 사용할 수 있고, old-style인 filename/offset 을 사용할 수도 있다.

 

 

2. GTID를 사용한 복제 구성

CHANGE MASTER TO master_use_gtid = { slave_pos | current_pos | no }

//replica set
CHANGE MASTER TO master_use_gtid = slave_pos

R의 GTID는 slave pos로 설정된다. 

왜냐~ R이 P에 connect를 시도 할 때, 마지막으로 복제된 event의 위치부터 복제를 해야하기 때문이다.

모든 R server들은 같은 GTID를 가진다.

 

질문

- 근데 진짜 난생 처음 복제되는거면 어디서부터..?

-> 그러면, gtid_slave_pos가 읎다! 그러면, master_use_gtid=current_pos를 사용한다. 이건 gtid_current_pos를 사용하는건데, 

 

근데 무튼 명령어로 GTID를 확인하고, P와 new R의 gtid_slave_pos가 같은지 우선 먼저 확인해보면, 실수를 줄일 수 있지 않을까 생각한다.

 

 

이어서 공부하자..오늘은 이만..

https://mariadb.com/kb/en/gtid/

여기서 부터 다시 읽으셈

When using master_use_gtid=current_pos there is no need to consider whether a server was a primary or a replica prior to using CHANGE MASTER.