카프카 - URP, Under Min ISR
URP (Under Replicated Partition)
카프카를 운영하다보면 URP 장애가 종종 발생한다. URP 장애는 다양한 이유로 발생하는데 원인을 알기 위해선 먼저 URP 가 먼지 알아야 한다.
카프카에는 파티션이라는 개념이 있고 파티션은 리더와 팔로워 파티션으로 나눠진다. 파티션은 토픽의 데이터가 저장되는 스토리지로 보면 되는데 리더 파티션은 프로튜서와 컨슈머로부터 토픽을 주고 받는 부분이고 팔로워 파티션은 리더 파티션의 내용을 복제한다. 스토리지에서 볼 수 있는 RAID 처럼 카프카도 내용을 복제해서 고가용성과 내구성을 확보하는 방식으로 동작한다. 카프카 운영자는 replicas.factor 옵션으로 복제본의 개수를 설정할 수 있는데 주로 3개 정도 둔다.
URP 는 리더 파티션과 동기화되지 않는 파티션이 존재하지 않는 경우를 말한다. 즉 리더 파티션에 있는 데이터가 팔로워 파티션에 복제되지 않은 상태가 존재하는 경우를 말하며 데이터 일관성을 보장할 수 없는 상태다.
URP 상황 자체가 카프카를 아예 쓸 수 없는 상태를 의미하진 않는다. 팔로워 파티션에 복제만 못하고 있을 뿐 리더 파티션은 여전히 데이터가 잘 들어오고 있다는 상태니 프로듀서나 컨슈머를 통해서 메시지를 계속 주고받고 있을 수 있긴 하다. 그러나 URP 가 발생했다는건 원래 동작해야할게 하지 않았다는 것이고 이것은 곧 브로커 상태가 온전치 않다는 문제를 의미하기도 한다.
마치 눈이 충혈된 상태인데 시력에는 이상이 없어 일상생활을 할 수 있는 상태랑 비슷하다고 할까. 지금 당장 문제가 없어 보이지만 큰 장애로 이어질 수 있기 때문에 확인해봐야한다.
Under Min ISR partitions
min.insync.replica 라는 옵션도 있는데 이건 메시지가 성공적으로 기록되었다고 간주할 때 사용하는 복제본의 수다.
만약 replicas.factor 가 5고 min.insync.replica 값이 3이면 카프카에서는 복제본을 5개 기록하지만 3개만 성공해도 메시지가 성공적으로 입력됐다고 간주하고 클라이언트에게 200으로 응답을 준다.
카프카에 토픽 메시지를 보낼 때 acks 옵션이 있는데 값이 -1 이거나 all 인 경우에는 최소 복제본의 수가 업데이트 됐는지 확인하고 나서 응답을 받는다. 이런 경우 복제 시간이 오래걸릴수록 응답이 늦어지는 문제가 발생하기도 하는데 min.insync.replica 값을 조정해서 응답 속도를 단축할 수 있다. 물론 acks 옵션 자체를 변경해서도 가능하다.
Under Min ISR partition 는 min.insync.replica 를 만족시키지 못하는 파티션이 존재하고 있다는 것을 의미한다. URP 와 같이 발생할 수 있는 에러다.