Skip to content
난이도 문제은행 5

그룹 복제와 InnoDB 클러스터 2 ​

그룹 복제와 InnoDB 클러스터에서 본 그룹 복제(Group Replication)는 멤버들이 합의(consensus)로 정한 순서대로 충돌 검사(certification)를 해서, 같은 행을 고친 트랜잭션(transaction) 가운데 앞선 쪽만 커밋(commit)하고 뒤쪽은 롤백(rollback)한다. 이 문서는 쓰기를 한 멤버만 받을지 모든 멤버가 받을지 고르는 두 운영 모드와, 그룹이 장애 난 멤버를 알아채고 과반수로 스플릿 브레인(split brain)을 막는 방법을 다룬다.

싱글 프라이머리와 멀티 프라이머리 ​

비교싱글 프라이머리 (기본)멀티 프라이머리
쓰기를 받는 멤버프라이머리 1대모든 멤버
나머지 멤버읽기 전용(super_read_only=ON)모두 읽기·쓰기
쓰기 충돌한 곳에서만 써서 거의 없음같은 행 동시 수정 시 한쪽 롤백
프라이머리 장애새 프라이머리를 자동 선출다른 멤버로 연결만 옮김
제약적음많음

싱글 프라이머리 모드(single-primary mode)는 쓰기를 받는 프라이머리(primary) 한 대와 읽기 전용 세컨더리(secondary) 여러 대로 운영한다. 세컨더리는 super_read_only가 켜져 있어 관리자 권한(privilege) 계정도 직접 쓸 수 없다. group_replication_single_primary_mode의 기본값이 ON이고, InnoDB 클러스터도 보통 이 모드로 쓴다. 프라이머리가 그룹을 떠나면 남은 멤버 중에서 새 프라이머리가 자동으로 뽑힌다. 새 프라이머리는 옛 프라이머리의 변경을 아직 다 적용하지 못했을 수 있다. 이때 새 트랜잭션을 받으면 이미 커밋된 최신 값 대신 옛 값을 읽거나 그 위에 쓸 수 있으므로, 8.4는 기본 설정으로 밀린 변경을 다 적용할 때까지 새 트랜잭션을 잠시 붙잡아 둔다.

멀티 프라이머리 모드(multi-primary mode)는 모든 멤버가 쓰기를 받는다. 여러 멤버에서 같은 행을 동시에 고치면 충돌 검사에서 늦은 쪽이 롤백되므로, 애플리케이션은 커밋 실패를 받고 다시 시도할 준비를 해야 한다. 자주 충돌하는 트랜잭션은 같은 멤버에서 실행하는 편이 낫다. 그러면 뒤에 온 트랜잭션이 그 서버의 행 잠금에서 앞 트랜잭션이 끝나기를 기다리므로, 둘이 동시에 충돌 검사에 올라가지 않아 롤백을 피할 수 있다. 어느 모드든 그룹 복제는 클라이언트 연결을 옮겨 주지 않는다. 그 일은 애플리케이션과 DB 사이에서 지금의 프라이머리로 연결을 보내 주는 MySQL Router 같은 중간 계층이 한다. 멀티 프라이머리 모드에 더 붙는 제약은 그룹 복제와 InnoDB 클러스터 3에서 다룬다.

장애 감지와 정족수 ​

멤버들은 서로 연결되어 계속 메시지를 주고받는다. 한 멤버가 다른 멤버에게서 5초 동안 아무 메시지도 받지 못하면 그 멤버를 의심하고, 서버 내부 상태를 테이블로 보여 주는 Performance 스키마(Performance Schema)의 replication_group_members 테이블에 UNREACHABLE로 표시한다. 의심이 group_replication_member_expel_timeout(8.4 기본 5초)을 넘기면 그룹은 합의를 거쳐 그 멤버를 추방(expel)한다. 추방된 멤버가 다시 살아나면 기본으로 3번까지 스스로 재가입을 시도한다.

그룹이 무엇이든 결정하려면 멤버의 과반수가 동의해야 한다. 이 과반수를 정족수(quorum)라 한다. 장애 f대를 견디려면 멤버가 2f + 1대 있어야 한다.

멤버 수과반수견디는 동시 장애
110
321
431
532
743

4대는 3대와 견디는 장애 수가 같으므로, 멤버 수는 보통 홀수로 잡는다. 한 그룹의 최대 멤버 수는 9대다. 네트워크가 둘로 갈라지면 과반수는 한쪽에만 있을 수 있다. 과반수를 잃은 쪽은 상대가 죽었는지 끊겼을 뿐인지 알 수 없으므로 쓰기를 멈추고 기다린다. 그래서 과반수를 가진 쪽 하나만 계속 일하고 스플릿 브레인이 생기지 않는다. 과반수를 잃은 그룹을 되살리는 방법은 그룹 복제와 InnoDB 클러스터 4에서 다룬다.

이어지는 내용은 그룹 복제와 InnoDB 클러스터 3에서 다룬다.

면접 포인트 ​

  • "3대 그룹에서 2대가 동시에 죽으면?" → 과반수를 잃어 남은 1대는 쓰기를 멈춘다. 3대는 1대 장애까지만 견딘다.
  • "멤버 수를 왜 홀수로 잡나요?" → 장애 f대를 견디려면 2f + 1대가 필요하고, 4대는 3대와 견디는 장애 수가 같다.
  • "멀티 프라이머리면 쓰기 성능이 늘어나나요?" → 모든 멤버가 결국 모든 쓰기를 적용하고, 충돌 시 롤백과 재시도가 생긴다. 쓰기 확장 수단으로 보지 않는다.

관련 문서