티스토리 뷰

이번에 PubSub, Dataflow 를 이용한 pipeline 을 이용하면서 알게된 것을 정리해 놓으려고 한다.
현재, 서버에서 뱉어내는 log를 fluentd 플러그인을 이용해서 BigQuery와, 클라우드에 올려서 보관을 하고 있는데.. 이것을 Google Cloud Platform(이하 GCP)에 완전히 의존을 하려고 한다. 그래서 생각 하게 된 것이, 아래와 같은 파이프라인. 


순서는 다음과 같다.
  1. Server 에서 PubSub client 를 이용해, PubSub 에 log(message)를 publish
  2. PubSub에 올라온 message 를 subscription이 끌어온다.
  3. Dataflow가 PubSub의 subscription 에 있는 message 를 읽어들여 아무런 집계를 하지 않고 raw-data 그대로 1시간 간격으로 파일로 묶어 GCS 에 보관한다.
PubSub에서 메시지를 받기 위해서는 subscription 이 필수다. Dataflow를 이용할 때 알아둘 점이 있는데, PubSub topic 에서 직접 메시지를 끌어오는 방법과 PubSub subscription 에서 메시지를 끌어오는 방법, 두가지 방법이 있다는 것이다.

1. PubSub topic 에서 메시지를 끌어오기

dataflow 생성할 때 자동으로 PubSub topic 과 연결된 subscription 을 만들어 줘서 편하다. dataflow 생성할 때 자동으로 PubSub topic 과 연결된 subscription 을 만들어 줘서 편하다. dataflow job 가 꺼질때, subscription 도 같이 없어지기 때문에, 같은 topic에 publish 한 메시지여도 새로운 subscription 과 이전의 subscription 은 완전히 다른 것이기 때문에 subscription 이 없던 때에 publish 된 메시지의 손실이 발생할 수 있다.

2. PubSub subscription 에서 메시지를 끌어오기

topic 에서 subscription 을 생성하도록 한다. GUI상에서 해도 되고, 코드로도 할 수 있다.
dataflow job 를 꺼도 subscription은 살아있기 때문에, dataflow 가 없을 때에 동일한 topic 으로 publish 된 메시지의 보존이 가능하다.

dataflow 의 데이터 손실 가능성

GCP에 장애가 일어나 dataflow job 이 멈출 경우에 따른 데이터 손실의 유무에 관해 테스트를 하기로 했었다.
dataflow 를 정지시키는 방법은 Cancel 과 Drain 이 있다.
Cancel 은 당장 정지시키는 것으로, dataflow 내에 있는 in-flight data(dataflow 내부로 읽혀 들어와, 처리중인 data) 가 손실될 수 있다.
Drain은 in-flight data 의 처리를 마무리 짓고 정지 작업에 들어가기 때문에 데이터의 손실이 없다.
dataflow 에 장애가 일어나서 job 이 멈출 때에는 in-flight data 를 다 처리해 주고 꺼지는게 아니라, 갑자기 Cancel 처럼 꺼지는 것이라 생각해 Cancel을 이용해 테스트 했지만, 데이터가 손실 되는 것을 볼 수 있었다.
이것을 통해 dataflow 가 PubSub 의 subscription 에 ACK를 날리는 시점이 데이터를 읽어 들였을 때라는 것을 알 수 있다.

dataflow가 장애로 꺼질 때의 데이터 손실 가능성에 대해 구글에 질문해 본 결과

dataflow가 PubSub subscription 에서 데이터를 읽어 들여와 어딘가에 있는 persistent disk 에 작성했을 때에 subscription 에 ACK 를 날려 subscription의 데이터를 삭제한다고 한다. 그렇다면, dataflow 에 장애가 일어나서 꺼지게 되도 문제가 없게 된다. 장애가 복구 되서 dataflow 가 복구 될 때, persistent disk 에서 데이터를 복구 해 와 dataflow job 을 이어가고 GCS 에 메시지를 작성하게 된다. 그렇기 때문에 data 손실의 우려는 없다는 것이다.
Cancel 로 dataflow 를 종료시키면, 명시적으로 Cancel을 한 것이기 때문에, dataflow 와 연결되어 있는 persistent disk 도 같이 꺼지게 되어, 데이터 손실이 일어나게 된다. 한마디로, dataflow 장애로 꺼지는 상황에 대한 테스트는 할 수 없다는 것이다. 그냥 믿자. 


댓글
댓글쓰기 폼