InnoDB Cluster는 5가지의 동시성 제어 모드를 제공하며group_replication_consistency 파라미터 설정으로 변경할 수 있다.
데이터는 최종적으로 일관성이 유지되나, 각 노드 간의 읽기 트랜잭션 결과가 일치하지 않는 순간이 발생할 수 있다.
Eventual 모드에서 트랜잭션 처리 과정은 아래와 같다.
해당 모드에서는 트랜잭션 데이터를 다른 노드들로 전파한 후, 본인 노드만을 기준으로 트랜잭션 커밋처리를 한다. 각 노드의 트랜잭션 커밋 시점은 서로 다를 수 있기 때문에 READ가 어떤 노드에서 수행됐느냐에 따라 특정 시점에는 서로 다른 read result를 갖게될 수 있다.
수신한 트랜잭션은 일단 다른 노드로 전파한 후 수행되고 인증단계를 거치기에, 서로 다른 노드로 RW 트랜잭션이 발생할 경우, 인증단계에서 만약 트랜잭션 선행 완료된 다른 트랜잭션과 충돌된다면 트랜잭션 충돌로 인한 롤백이 많이 발생할 수 있다.
Eventual과 같은 방식으로 동작하나, Primary Failover가 발생했을 때엔 Read 트랜잭션과 Read-Write 트랜잭션이 relay log의 이전 Primary 노드로부터 전달받은 트랜잭션들이 모두 적용될 때까지 대기하게 된다.
RO, RW 트랜잭션 모두 선행되는 트랜잭션이 완료될 때까지 대기한 후 수행된다. Eventual 모드에서는 트랜잭션 수행이 선행되는 트랜잭션 완료까지 대기하지 않기에, Eventual에 비하면 트랜잭션 수신 시점부터 적용 완료까지 지연이 발생할 수 있다.
또한, 각 노드들의 커밋 시점이 일치하지 않기 때문에 각 노드들 사이에 read 트랜잭션의 결과가 불일치할 수 있다.
또한, Before on primary failover 수준이 제공하는 일관성 보장을 포함한다.
After 모드는 트랜잭션 수신시, RO는 별다른 제약없이 바로 수행되나 RW 트랜잭션은 각 노드가 알아서 커밋하는게 아니라 모든 노드들이 full-mesh 형태로 prepare 응답을 주고 받으며 모두 트랜잭션을 커밋할 준비가 되었음을 확인하고 커밋한다. 또한, 선행되는 트랜잭션이 수행 완료될 때까지 대기하지는 않는다. 상세 과정은 아래와 같다.
After 모드는 어떤 멤버에서든 일관된 최신 데이터를 얻을 수 있으나, full-mesh 형태로 prepare를 수행해야하기에 쓰기 지연이 많이 발생한다.
그에 따라 AFTER 일관성 수준은 DB에서 쓰기 요청보다 읽기 요청이 많고 분산된 최신 읽기를 수행하고자 할 때 사용하는 것이 좋다.
또한, Before on primary failover 수준이 제공하는 일관성 보장을 포함한다.
Before and after는 After처럼 RW 트랜잭션은 트랜잭션 커밋 전 prepare 과정을 수행하는 동시에, 트랜잭션 수행 전 선행되는 트랜잭션들이 모두 적용될 때까지 대기 후 수행한다.
RO 트랜잭션은 선행되는 트랜잭션들이 적용될 때까지 대기한 후 수행된다.
또한, Before on primary failover 수준이 제공하는 일관성 보장을 포함한다.
group replication consistency가 나뉘는 기준은 크게 나누면 다음과 같다.