Skip to content

Failover, Switchover 처리 방식

Park JunHyun edited this page Nov 28, 2024 · 2 revisions

Failover 처리

Replication으로 운영 중인 캐시 클러스터의 노드 중 MASTER 노드에 장애가 발생하면 Failover 처리가 시작된다. MASTER 노드에 장애가 발생하면 Java Client에서는 ZK Event를 통해 이 사실을 확인하게 된다.

Java Client는 Failover에 대한 처리를 하기 위해 다음과 같은 작업을 진행한다.

  1. 기존 MASTER 노드에 존재하는 Read Queue의 멱등한 연산들을 새로운 MASTER 노드의 Write Queue로 이동시킨다.
  2. 기존 MASTER 노드에 존재하는 Input Queue, Write Queue의 연산들을 새로운 MASTER 노드의 Write Queue로 이동시킨다.

Switchover 처리

java client 쪽에서 switchover에 대한 처리를 한다는 것은

  1. 내부적으로 관리하는 커넥션, 노드 구성에 대한 ROLE을 클러스터 상태와 동일하도록 변경하고,
  2. 기존 MASTER 노드의 Operation Queues에 있는 Operations을 새로운 MASTER 노드의 Write Queue에 그대로 이동시키는 것을 의미한다.
    • Input Queue, Write Queue에 있는 Operation은 그대로 이동
    • Read Queue에 있는 Operation은 멱등성 여부에 따라 이동시킬지, 취소(cancel)시킬지를 결정

즉시 Switchover 처리

대부분의 경우 switchover에 대한 처리를 즉시 수행한다.

아래는 즉시 switchover 처리를 하는 경우들이다.

  • 서버로부터 SWITCHOVER / REPL_SLAVE 응답을 받았을 때

    • 응답을 받은 Write 연산부터 Read Queue에 있는 다른 Write 연산들은 서버에서 처리되지 않았음이 보장된다.
    • 이미 기존 MASTER 노드가 switchover되어 SLAVE 노드가 되었음을 확인하는 것이므로 switcover 처리를 한다.
  • 서버로부터 SWITCHOVER / REPL_SLAVE 응답을 받지 못하고 ZK Event를 통해 switchover 확인했을 때

    • Read Queue가 비어있거나 멱등 연산만을 포함하는 경우 즉시 switchover 처리를 한다.

지연 Switchover 처리

아래는 지연 switchover 처리를 하는 경우들이다.

  • 서버로부터 SWITCHOVER / REPL_SLAVE 응답을 받지 못하고 ZK Event를 통해 switchover 확인했을 때
    • Read Queue가 비어있지 않고 멱등하지 않은 연산을 하나라도 포함한다면 지연 switchover 처리를 한다.

switchover 처리를 지연 수행하는 과정은 아래와 같다.

  • READ Queue에 있는 Operation들의 응답을 받을 때까지 switchover 처리를 최대 50ms 지연한다. 기다리다 보면 조회 연산의 경우 응답이 올 수 있고, 쓰기 연산의 경우 정상 응답이 오거나 SWITCHOVER/REPL_SLAVE 응답이 올 수 있다.

    • MASTER 노드가 SLAVE로 변경된 후에 쓰기 연산에서 정상 응답이 오는 경우는 극히 드물겠지만 가능하다. MASTER 노드였을 때 서버 내부에서 요청 처리와 switchover 작업이 동시에 발생했거나, 요청 처리는 완료되었지만 TCP 재전송이 발생한 경우, 응답이 클라이언트에 전송되는 시점에 해당 노드가 SLAVE로 변경된 상태일 수 있다.
  • 대기 중 SWITCHOVER/REPL_SLAVE 응답이 왔다면, 그 즉시 switchover에 대한 처리를 수행한다. 이 때 Read Queue에 남아있는 멱등하지 않은(nonidempotent) Operation도 새로운 MASTER 노드의 Write Queue에 전달한다. 왜냐하면 이미 SLAVE 노드가 되었기 때문에 멱등하지 않은 연산 자체를 처리하지 못할 것이기 때문이다.

  • 대기 중 SWITCHOVER/REPL_SLAVE 응답이 오지 않았다면, 50ms가 지난 것이므로 Read Queue에 남아있는 멱등하지 않은 연산은 취소시키고 멱등한 연산만 새로운 MASTER 노드에 전달한다. Input Queue, Write Queue에 있는 연산은 아직 보내지지 않았기 때문에 그대로 새로운 MASTER 노드의 Write Queue에 전달하면 된다.

  • 대기 중 모종의 이유로 인해 서버와 reconnect를 시도한다면, Read Queue에 존재하는 멱등하지 않은 연산을 취소한 후 즉시 switchover 처리를 수행한다. 기존 MASTER 노드에 연산이 반영되었는지 여부를 알 수 없기 때문이다.

Switchover 처리 이후

switchover에 대한 처리가 완료되면 기존 MASTER 였던 노드로 즉시 재연결하여 기존 Read Queue에 존재했던 Operation들에 대한 응답을 받지 않도록 한다. 만약 기존 Read Queue에 Operation이 하나도 존재하지 않았다면 재연결할 필요가 없다.