Pub / Sub 메시지를 압축하는 방법 및 더 많은 비용 절감

(2020 년 12 월 29 일)

압축은 많은 문제를 해결하는 데 사용할 수있는 트릭입니다. 종종 도구는 콘텐츠를 투명하게 압축합니다. 대부분의 최신 브라우저는 gzip으로 압축 된 HTTP 페이로드를 요청하고 일부 파일 시스템은 사용자가 요청하지 않고 블록을 압축하도록 구성 할 수 있습니다.

잘 알려진 사용 사례 외에는 다음이 있습니다. 압축을 활용하여 효율성을 높이거나 비용을 절감 할 수있는 다양한 기회를 제공합니다. 일반적인 사용 사례를 알고 있으면 이러한 기회가 발생할 때이를 활용할 수 있습니다.

로그 마이그레이션

최근 예로 저희 팀은 하나의 Elasticsearch 클러스터에서 로그를 마이그레이션하고있었습니다. 다른 사람에게. BigData ™는 아니지만이 클러스터에는 100 억 개의 로그 항목 또는 약 60TB의 원시 JSON이 있습니다.

이러한 장기 실행 대규모 마이그레이션을 처리 한 경험이있는 경우 다음과 같은 프로세스를 구축하려고합니다. 가능한 한 자주 게임 저장을 할 수 있습니다. 즉, 내보내기 프로세스를 구축하고 실행하여 발생할 모든 문제를 처리 한 다음 (약속합니다!) 가져 오기 프로세스로 깔끔하게 이동할 수 있습니다. 내보내기와 마찬가지로 가져 오기 프로세스도 망가집니다. 따라서 가져 오기도 쉽게 다시 실행할 수 있어야합니다.

여러 GoCardless 시스템에서 사용되므로 Google Pub / Sub 는이 문제에 자연스럽게 적합합니다. Google의 마케팅 태그 라인은 이상적이고 분리 된 프로세스를 설명하기 위해 작성된 것처럼 들립니다.

Pub / Sub는 이벤트를 처리하는 서비스에서 이벤트를 생성하는 서비스를 분리하는 비동기 메시징 서비스입니다.

Pub / Sub에서 주제에 메시지를 게시 합니다. 각 주제에는 소비자가 메시지를 가져올 수있는 많은 구독이있을 수 있습니다. 가장 간단한 용어로 마이그레이션은 다음과 같습니다.

  1. 원본 클러스터의 로그를 (인덱스 별) Pub / Sub 주제로 내보내기
  2. Pub / Sub 구독 구성 이벤트를 유지하려면 (retain\_acked\_messages 설정, 메시지 재생 및 제거 참조) 이벤트를 재생할 수 있습니다. 가져 오기가 잘못됨
  3. 주제 구독에서 메시지를 가져 와서 로그 가져 오기

그러면 이것이 압축과 어떤 관련이 있습니까? 대부분의 클라우드 서비스와 마찬가지로 Pub / Sub는 사용량에 대해 요금을 부과하므로 서비스를 통해 푸시 할 데이터에 비례하여 요금이 부과됩니다.

이러한 요금은 다음과 같습니다.

  • 전달 된 TiB 당 40 달러, 게시 및 구독에 적용
  • Google Compute Engine 네트워크 요금 (복잡해 지므로 무시 함)
  • 검색 관련 메시지 저장소 메시지를 GiB- 월당 $ 0.27로 유지

첫 번째 시도에서 성공적으로 가져 오기 / 내보내기를 수행하는 가장 좋은 경우 (이는 발생하지 않았으며 발생하지 않았 음) 게시 및 구독에 모두 적용되므로 2 x 40 달러 x 60TB = 4,800 달러의 메시지 전달 비용이 청구됩니다 . 이전이 진행되는 동안 2 주 동안 메시지를 보관하면 0.5 x $ 0.27 x 60,000GB = $ 8,100의 메시지 저장소 비용이 청구됩니다 .

이전을 수행하려면 하한선 $ 12,900이 남습니다. .

이제 GoCardless는 가난하지 않습니다. 경험상 일반적으로 인프라 비용보다 엔지니어링 시간을 최적화하려고합니다.

그러나 최소한의 노력으로 비용을 줄일 수 있다면 그렇게해야합니다.

게시하기 압축 된 메시지

이를 위해 Google은 Pub / Sub에 게시 한 메시지의 압축을 지원하기 위해 마이그레이션 도구 (elastic-toolbox)를 약간 변경했습니다.

오류 처리가 제거 된 게시 방법은 직렬화 후 압축을 적용합니다.

메시지 페이로드에 조건부로 압축 적용

압축 자체는 매우 간단하며 거의 전적으로 관찰 코드입니다.

관찰 가능성이있는 gzip 압축 구현

절감액이 압축 비율 (압축 / 원래 바이트)에 비례하므로 어떻게 압축 가능합니다.

JSON 로그는 다음과 같이 매우 압축 될 수 있습니다.

  • 로그는 중복 제거 될 수있는 많은 JSON 키를 공유합니다 (kubernetes.pod\_name)
  • 일반적인 로그 필드의 값은 매우 자주 발생할 수 있습니다 (kubernetes.labels.namespace)

수정 된 elastic-toolbox 세 가지 다른 색인의 동시 내보내기를 실행하려면 elastic\_toolbox\_export\_pubsub\_write\_compression\_ratio Prometheus 측정 항목을 사용할 수 있습니다 (compress 방법) 압축 비율의 히트 맵 작성 :

압축 바이트 / 원래 바이트, 항상 0 \%

이 히트 맵은 모든 메시지가 원래 크기의 최대 30 \% . 전체 로그 코퍼스에서 측정했을 때 평균 압축률은 ~ 12 \%입니다. 즉, 1GiB의 로그가 120MiB에 불과합니다.

원래 청구서 $ 12,900이 12 \% x $ 12,900 = $ 1,548가되었습니다.

즉, 약 $ 11,500를 절약했습니다.

Raintank 스냅 샷 : elastic-toolbox 압축 에서 데이터를 직접 살펴보세요.

다음 단계? 정규직 지원.

가장 분명한 다음 단계는 로깅 파이프 라인에 항상 적용하는 것이 었습니다. 컨테이너 로그를 Pub / Sub로 바로 전송하고 구독에서 Elasticsearch로 가져 오면 동일한 압축 전략을 적용하는 fluentd 필터를 쉽게 작성할 수 있습니다.

제 동료 인 Ben은 우리가 절약하는 금액을 추적하기 위해 멋진 대시 보드를 만들었습니다.이 대시 보드는 매월 수천 개 :

로깅 파이프 라인에 들어갈 때 로그를 압축하여 절약

다른 곳에서 압축이 도움이 될 수 있습니까?

클라우드 환경에서 작업하는 경우 데이터를 압축하여 비용을 절감하세요.

로그 외에도 GoCardless의 또 다른 예는 draupnir 라는 도구입니다. 이 서비스는 부하 테스트 및 포렌식 분석 (쿼리 계획 예측 등)을위한 프로덕션 데이터베이스 사본을 호스팅합니다. Google SSD 스토리지 비용은 TiB / 월에 $ 187입니다. 즉, 5TB Postgres의 모든 사본은 월 $ 1,000 입니다.

Draupnir는 사용 사례에 따라 한 번에 여러 사본을 호스팅 할 수 있습니다. btrfs 압축 을 활성화하여 파일 시스템 블록을 투명하게 압축하여 를 사용할 수있게함으로써 많은 비용을 절약 할 수 있습니다. SSD 용량이 다른 경우보다 70 \% 더 적습니다 .

압축이 비용 절감으로 제한되었다고 생각했다면 틀렸을 것입니다! 사람들이 대규모 백필을 실행하거나 새 데이터베이스 인덱스를 구축 할 때 가끔 마이크로 정전이 발생하여 Postgres WAL 압축을 활성화하여 문제를 해결했습니다 ( Postgres Underused 기능 : WAL 압축 또는 Postgres Write Ahead Log 문서 ).

중단은 대량의 WAL 변동을 일으키는 데이터베이스 작업으로 인해 발생했습니다. WAL을 디스크에 쓰는 동안 복제본이 멈 춥니 다. WAL 스트림을 압축함으로써 IO 스파이크를 크게 줄여 복제본이 문제없이 스트림을 처리 할 수 ​​있도록했습니다 .

더 많은 예가 있지만 이것이 좋은 그림이라고 생각합니다.

어떻게 도움이 되나요?

압축은 트레이드 오프이며 우리가 내리는 결정입니다. 더 비싸거나 덜 사용 가능한 다른 리소스로 CPU를 교환하십시오. CPU, 메모리 또는 네트워크 대역폭에 할당 된 값은 지속적으로 변경되므로 사례별로이 계산을 수행해야합니다.

이 게시물은 비용이 발생하는 시나리오를 다루기위한 것입니다. 컴퓨팅 리소스와 구축 시간 모두에서 압축이 절감 효과보다 훨씬 컸습니다. 모든 상황이 동일한 경제성을 갖는 것은 아니지만 어느 쪽이든 결정하는 데 몇 분의 냅킨 수학이 필요합니다.

이 사례 연구가 표준, 지루한 사용 사례를 벗어난 압축 고려를 유도하고 도움이되기를 바랍니다. 자신의 시스템에 적용 할 수있는 기회를 찾으십시오.

이 게시물에 대해 Hackernews .

원래 게시 위치 : https : // blog .lawrencejones.dev 2020 년 12 월 29 일