일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 카프카
- scala
- 플레이 프레임워크
- reactive
- RabbitMQ
- kafkastream
- Spring
- 한빛미디어
- spring-batch
- aws
- confluent
- coursera
- springboot
- Kafka
- avo
- Elk
- gradle
- scala 2.10
- Slick
- statestore
- play framework
- Logstash
- schema registry
- spring-kafka
- Elasticsearch
- kafka interactive query
- kafka streams
- spring-cloud-stream
- kafkastreams
- enablekafkastreams
- Today
- Total
b
kafka stream의 fail-over & high-availability 본문
18/01/30 idea
카프카 자체의 data recovery는 훌륭하다. 당연한게 파일로 저장하고 심지어 여러 셋트로 저장한다. 유실되는 경우는 저장 기간을 넘기거나, 1개의 IDC에만 설치한 후 IDC가 물에 잠기는 방법 뿐이다. 이건 다 아는 얘기고, 문제는 이 kafka 를 기반으로 한 streams 를 서비스 할 때이다.
1. Kafka는 기본적으로 1 개의 TopicPartion 에서 1 개의 Consumer Group의 노드가 접속 한다.
2. Kafka Topic은 KStream/KTsble/StateStore 등을 통해서 각각의 topic-partition을 local DB에 싱크를 맞춘후 materilized 한다 (비동기/latency 존재)
우선 1번의 문제부터....
1. 해당 TopicPartion의 정보를 단 1개의 VM(instance)만이 가지고 있을 수 있다 (Application Cluster 자체를 active-standby로 구성하지 않는이상)
이 얘기는 해당 Node가 죽어버리면 '그 순간' 그 데이터들은 VM instnace안에서 존재 하지 않는 다는 것이다.
물론 Kafka Broker 내에는 존재하기 때문에 일정 시간의 기다린다면 새로운 Instacne가 해당 데이터를 살릴 수 있다. 하지만 그 '일정 시간의 텀'이 문제이다.
위에서 얘기한 데로 Application 자체를 standby로 준비하지 않는 이상 힘들다. kafka 역시 standby 로 해결한다.
링크 : https://kafka.apache.org/10/documentation/streams/developer-guide/config-streams.html#id10
동일한 셋을 하나 더 구성하지만 그 녀석은 말그대로 standby이다. 실제 서비스에는 투입이 되지 않으며, resource 역시 많이 차지하지만, 장애 시간을 짧게 가져가는데 필수적인 요소이다.
StreamThread 내에서 task를 active 와 standby로 가지고 있다.
이 부분은 ... 계속 파야할 것 같다.
2. Event가 topic으로 전송이 된다면 해당 topic-partition을 materialized view 로 가지고 있는 consuer group 의 instance는 consumer로 붙는다.
이 때 topic과 state-store의 데이터 불일치는 필연적이다.
이 때 state-store에서 get을 하는 '재고차감' 같은 Domain은 어떤 식으로 처리 할 것인가?
A. 모든것을 sync로 한다 - 의미 없으니 pass
B. instance의 state-store를 ReadyOnlyQueryType으로 사용하는게 아닌 WriteableQueryType으로 사용하여, put도 할 수 있게 한다. 그리고 이 changelog는
remote kafka cluster와 연동한다.
atmoic을 보장 할 수 있는 방법이고, 서버가 죽었을때도 문제가 되지 않는다. 내부 rocksdb에 데이터는 유지되므로 다시 살리기만 한다면 cluster와 동기화를 할 수 있을테니까..
문제는 server가 살릴수 없을 때이다. 이 이슈는 바로 데이터 유실로 이어진다.
적당한 방법들은 보이지만, 정답인지 아닌지 확신이 안선다.
'Cloud' 카테고리의 다른 글
stream kafka app 에 rabbitmq sleuth 사용하기 (0) | 2018.01.31 |
---|---|
Spring Cloud Stream 의 버전 선택 (0) | 2018.01.28 |
Kafka 기반의 event driven stateful microservices (0) | 2018.01.28 |
AWS EC2에 tomcat7 & java8 설치 (0) | 2014.07.09 |
google cloud compute engine 시작하기. (0) | 2013.11.22 |