Kafka ISR(In-Sync-Replica) 와 acks 옵션
ISR
ISR 이란 리더 파티션과 팔로워 파티션이 모두 싱크가 된 상태를 뜻한다.
복제 갯수가 2인 토픽을 가정해보자 - 이 토픽에는 리더 파티션 1개와 팔로워 파티션 1개가 존재할 것이다. 리더 파티션에 0부터 3의 오프셋이 있다고 가정할 때, 팔로워 파티션에 동기화가 완료되려면 0부터 3까지 오프셋이 존재해야 한다. 동기화가 완료됐다는 의미는 리더 파티션의 모든 데이터가 팔로워 파티션에 복제된 상태를 말하기 때문이다.
ISR 이라는 용어가 나온 이유
- 팔로워 파티션이 리더 파티션으로부터 데이터를 복제하는데에 시간이 걸리기 때문이다.
- 프로듀서가 특정 파티션에 데이터를 저장하는 작업은 리더 파티션을 통해 처리한다. 이때 리더 파티션에 새로운 레코드가 추가되어 오프셋이 증가하면 팔로워 파티션이 위치한 브로커는 리더 파티션의 데이터를 복제한다.
- 리더 파티션에 데이터가 적재된 이후 팔로워 파티션이 복제하는 시간차 때문에 리더 파티션과 팔로워 파티션간의 오프셋 차이가 발생한다.
acks 옵션
acks 옵션을 통해 프로듀서가 전송한 데이터가 카프카 클러스터에 얼마나 신뢰성이 높게 저장될 지 설정할 수 있다. (프로듀서 옵션)
그리고, acks 옵션에 따라 성능이 달라질 수 있으므로 acks 옵션에 따른 카프카의 동작방식을 상세히 알고 설정해야한다. 복제 갯수가 1인 경우 acks 옵션에 따른 성능 변화는 크지않다. 그러나 안정적으로 데이터를 운영하기 위해서는 복제 갯수가 2이상으로 운영하는 경우가 대부분이기 때문에 여기서는 복제 갯수는 2 이상인 경우에 각 acks별 동작 방식에 대해 알아본다.
-
acks = 0
acks를 0으로 설정하는 것은 프로듀서가 리더 파티션으로 데이터를 전송했을 때 리더 파티션으로 데이터가 저장되었는지 확인하지 않는다는 뜻이다.
- 리더 파티션은 데이터가 저장된 이후에 데이터가 몇 번째 오프셋에 저장되었는지 리턴하는데, acks가 0으로 설정되어 있다면 프로듀서는 리더 파티션에 데이터가 저장되었는지 여부에 대한 응답 값을 받지 않는다.
- 데이터의 전송 속도는 acks를 1 또는 all 로 했을 경우보다 훨씬 빠르다. 데이터가 일부 유실이 발생하더라도 전송 속도가 중요한 경우에는 이 옵션값을 사용하면 좋다.
- 해당 옵션을 사용하기 적절한 경우
- 지표데이터를 전송하는 경우 ex) GPS 데이터
-
acks = 1
acks를 1로 설정할 경우 프로듀서는 보낸 데이터가 리더 파티션에만 정상적으로 적재되었는지 확인한다.
- 만약 리더 파티션에 정상적으로 적재되지 않았다면 리더 파티션에 적재될 때까지 재시도할 수 있다.
- 그러나 리더 파티션에 적재되었음을 보장하더라도 데이터를 유실될 수 있다. 왜냐하면 복제 갯수를 2 이상으로 운영할 경우 리더 파티션에 적재가 완료되어도 팔로워 파티션에는 아직 데이터가 동기화되지 않을 수 있는데, 팔로워 파티션이 데이터를 복제하기 직전에 리더 파티션이 있는 브로커에 장애가 발생하면 동기화 되지 못한 데이터가 유실될 수 있기 때문이다.
- 하지만 이런 경우는 드물기 때문에 정말 큰 장애가 아닌 이상은 1 로 설정해도 큰 무리가 없다.
- 일부 데이터의 정합성이 제일 우선시 되는 경우 all 로 설정한다.
-
acks = -1(all), min.insync.replicas = 2
acks를 all 또는 -1로 설정할 경우 프로듀서는 보낸 데이터가 리더 파티션과 팔로워 파티션에 모두 정상적으로 적재되었는지 확인한다.
- 리더 파티션뿐만 아니라 팔로워 파티션까지 데이터가 적재되었는지 확인하기 때문에 0 또는 1 옵션보다 속도가 느리다.
- 그럼에도 불구하고 팔로우 파티션에 데이터가 정상 적재되었는지 기다리기 때문에 일부 브로커에 장애가 발생하더라도 프로듀서는 안전하게 데이터를 전송하고 저장할 수 있음을 보장할 수 있다.
- acks를 all로 설정할 경우에는 토픽 단위로 설정 가능한 min.insync.replicas 옵션값에 따라 데이터의 안정성이 달라진다.
- min.insync.replicas (토픽 옵션)
- min.insync.replicase 옵션은 프로듀서가 리더 파티션과 팔로워 파티션에 데이터가 적재되었는지 확인하기 위한 최소 ISR 그룹의 파티션 갯수이다.
- 예를 들어, min.insync.replicas의 옵션값이 1이라면 ISR 중 최소 1개 이상의 파티션에 데이터가 적재되었음을 확인하는 것이다. 이 경우 acks를 1로 했을 때와 동일한 동작을 하는데, 왜냐하면 ISR 중 가장 처음 적재가 완료되는 파티션은 리더 파티션이기 때문이다.
- 보통의 경우에 2대 이상의 서버가 동시에 장애가 발생하기는 쉽지 않기 때문에 min.insync.replicas 설정을 2로 설정하는 것이 일반적이다.
Comments