본문 바로가기

RDBMS/Mysql

[Debezium] Mysql의 Master-Slave 스위칭시 디비지움 동작 방식

회사에서는 Mysql 클러스터를 MHA로 구성해서 사용중이다. 마스터/슬레이브 모두 마스터용/슬레이브용 도메인에 연결되어있으며, failover로 인해 마스터-슬레이브간 스위칭 발생시 도메인도 함께 변경된다.

디비지움  POC를 진행하면서 Mysql의 마스터-슬레이브가 스위칭이 될때 디비지움이 어떻게 동작하는지, 정상적으로 CDC는 가능한지를 테스트 해보았고, 이것을 정리해 보고자한다.

보통 두가지 상황에서 마스터-슬레이브 스위칭이 발생한다.

  1. Master 장애 발생시 MHA 설정에 따른 Failover 시
  2. 대용량 테이블에 Alter를 수행하기 위해 실행하는 스위칭

두가지 상황에서 디비지움이 어떻게 동작하는지 확인해 보았다.

1. MHA Failover에 의한 마스터-슬레이브 스위칭

마스터에 장애가 발생하면 MHA에 의해 자동으로 Slave가 Master로 승격이 된다. 이때 디비지움의 동작을 확인해보았다.

1) 디비지움을 Mysql의 마스터에 연결했을 때

정상적인 상황에서는 위와 같은 형태로 연결되어있다.

이때 마스터에 장애가 발생하면 슬레이브가 마스터로 승격이된다. 그와 동시에 마스터/슬레이브 도메인도 신규 마스터에 할당이 되고, 디비지움도 마스터의 변경을 감지하여 신규 마스터 서버로 자동으로 연결된다.

이후 장애가 발생했던 서버가 복구되면 마스터였던 서버가 Slave로 추가된다. 디비지움은 여전히 신규 마스터를 바라보는 형태로 동작한다.

결론: 마스터-슬레이브 스위칭시 자동으로 신규 Master를 바라보고 정상적으로 CDC 처리 된다.

2) 디비지움을 Mysql의 슬레이브에 연결했을 때

디비지움을 Mysql의 슬레이브 서버에 연결하면 아래 그림과 같이 연결된다.

Mysql 마스터에 장애가 발생하면 마스터/슬레이브 도메인 모두 새로 승격된 마스터 서버를 바라보게 된다.

이때 디비지움은 그대로 연결되어 있기 때문에 `마스터 도메인과 슬레이브 도메인을 모두 가진` 서버에 그대로 연결되어있다.

이후 장애 서버가 복구 되면 복구된 서버가 Slave 서버가 된다.

디비지움은 "처음에는 슬레이브에 연결되어있었지만 장애 복구 후에는 마스터 서버에 연결" 된 상태로 남아 있게 된다.

이 상태로 둬도 CDC는 정상적으로 동작하게 된다. 다만 디비지움을 Master에 연결하는것이 Master 서버에 부담을 줄수 있기 때문에 초기와 같이 Slave에 디비지움을 연결하려면 디비지움 프로세스를 재시작 하면 된다.

재시작하면 디비지움은 다시 슬레이브와 연결된다.

 

결론: 정상적으로 CDC가 진행된다. 다만 Slave와 연결된 디비지움은 Master에 연결된 상태로 변경된다.
따라서 Slave에 연결을 다시 하고 싶다면 디비지움을 재시작한다.

2. 대용량 테이블에 Alter를 수행하기 위한 스위칭

대용량 테이블에 컬럼을 추가한다던가 하는 alter를 수행하기 위해서는 아래와 같은 방식을 사용한다고 한다.

1) Slave 도메인을 Master로 연결(마스터는 슬레이브/마스터 도메인을 모두 가지게 된다)
2) Slave 서버에 Alter 수행
3) MHA Switching
- master에 접속되어있는 세션은 모두 kill
- slave에 접속되어있던 세션은 유지
- 이를 통해 alter를 수행한 Slave가 Master로 승격됨
4) 신규 Slave 서버(Master 였던)에 alter 수행

위와같이 강제로 도메인 변경을 할때 디비지움은 아래와 같이 동작한다.

1) 디비지움을 Mysql의 마스터에 연결했을 때

이 상황은 Slave에 연결했을때도 동일하게 동작한다.

3번작업에 의해 마스터가 슬레이브로 스위칭 되었을때 여전히 디비지움은 마스터였던 서버(스위칭 이후에는 슬레이브)와 계속 커넥션이 맺어진 상태로 CDC를 수행하게 된다.

 

원래 위와 같은 상화에서 3번의 스위칭이 진행되면 

디비지움은 Master/Slave의 스위칭을 알아채지 못하고 마스터였던 서버와 계속 연결된 상태로 CDC가 진행된다.

DNS 캐시 때문일지도 모른다는 생각에 Kafka Connect에 "-Dsun.net.inetaddr.ttl=0" 설정을 하여 DNS 캐시를 사용하지 않도록 했지만 동일하게 동작했다.

 

결론: 정상적으로 CDC가 동작한다. 다만 마스터에 연결되었던 디비지움이 슬레이브에 연결된 상태로 남아있게 되므로, 처음과 같이 마스터에 연결하려면 재시작을 해야한다.

'RDBMS > Mysql' 카테고리의 다른 글

[Mysql] binlog enable/disable  (0) 2020.02.11