[카프카 브로커 간의 데이터 복제]


카프카에서는 서버 단위로 데이터를 복제해서 데이터를 안전하게 보관합니다.
리더 파티션은 프로듀서나 컨슈머와 직접 데이터 통신을 하는 단위이고, 나머지 팔로워 파티션이 복제본입니다.

만약 리더 파티션이 있는 브로커 0번에 장애가 났다고 가정하면, 브로커 1번 혹은 2번에 있던 팔로워 파티션이 리더 파티션으로 승급됩니다.

 

 

[메타데이터로 리더 파티션을 구별한다]


프로듀서나 컨슈머와 같은 카프카 클라이언트는 직접 데이터를 주고받기 전에 메타데이터를 요청합니다. 이 작업을 통해 브로커가 가지고 있는 메타데이터 캐시를 응답값으로 돌려받습니다. 그럼 클라이언트는 어느 브로커로 데이터를 보내야 할지 알게 되고 통신을 수행하게 됩니다.

그런데 이런 메타데이터가 일부 상황에서 적절히 update되지 않는 오류가 발생할 때도 있습니다. 프로듀서나 컨슈머가 가지고 있는 메타데이터가 적절하게 update되지 않으면 리더 파티션이 존재하지 않는 브로커와 통신을 할 때도 있습니다. 이런 경우에는 NotLeaderForPartitionException이 발생합니다.

 

 

[ISR]

 

프로듀서가 데이터를 리더 파티션으로 보내고 나면 나머지 팔로워 파티션에 데이터가 복제되는데 이 때 모두 데이터가 복제되어 동기화된 상태를 ISR(In-Sync-Replicas)라고 부릅니다. 즉, 모든 리더 파티션의 데이터가 팔로워 파티션에 복제 완료 되었다는 뜻입니다.

 

데이터를 복제하는 데에는 지연이 발생하게 됩니다. 프로듀서는 리더 파티션에 데이터를 보내고 데이터를 저장하는 동안에 그리고 저장이 완료되는 시점에 팔로워 파티션들에는 그 데이터가 없습니다. 왜냐하면, 리더 파티션에 데이터가 안전하게 저장된 이후에 데이터를 팔로워 파티션에 복제하기 때문입니다.

 

즉, 어떤 시점에는 리더와 팔로워 간에 데이터가 동기화되지 않은 시점이 존재하고 그럴 때 리더 파티션에 장애가 발생하게 되면 팔로워 파티션이 리더로 승급할 때 일부 데이터가 유실될 수 있습니다.

 

[min.inssync.replicas]

 

토픽 단위로 설정 가능한 min.inssync.replicas 옵션은 프로듀서가 데이터를 보낼 때 얼마나 안정적으로 데이터를 보낼지 설정하는 값으로 사용됩니다. 참고로 이 값은 acks라는 옵션을 all로 설정했을 때만 유효합니다.

 

min.inssync.replicas 값이 2일 때는 데이터가 최소 리더 파티션과 팔로워 파티션 1개에 안전하게 데이터를 저장하는 것을 보장합니다. 때문에 리더 파티션에 데이터가 저장된 직후 데이터가 복제되지 않은 상태에서 브로커 0번에 장애가 발생하면, 프로듀서는 데이터가 정상적으로 보내지지 않았다는 것을 감지하고 다시 데이터를 보내게 됩니다.

 

min.inssync.replicas 값이 3일때는 리더 파티션과 팔로워 파티션 2개에 모두 데이터가 복제 완료되었을 때 데이터가 정상적으로 전송되었음을 보장합니다. 그리고 브로커 개수만큼 min.inssync.replicas 값을 설정하면 브로커가 한 대라도 죽으면 프로듀서는 더 이상 데이터를 보내지 않습니다. 때문에 min.inssync.replicas 값은 브로커 개수보다 작게 설정해야 합니다.

 

[unclean.leader.election.enable]

 

** unclean.leader.election.enable = true: 데이터 유실을 감안해도 지속 운영하겠다
** unclean.leader.election.enable = false: 데이터 유실을 절대 허용하지 않겠다

 

unclean.leader.election.enable은 만에하나 팔로워 파티션들이 ISR로 묶이지 못한 경우에 설정할 수 있는 값입니다.

브로커급 장애가 발생했을 때, 데이터의 유실을 감수하고서라도 데이터를 지속 처리할지 결정하는 옵션입니다.

 

unclean.leader.election.enable 값이 false인 경우 리더 파티션이 있는 브로커에 장애가 발생하면,

리더 파티션이 있는 브로커가 다시 정상화될때까지 영원히 기다리게 됩니다.

+ Recent posts