Skip to content
hello tis
Go back

[26.10.16] ClickHouse 100억 건 적재를 위한 수집 조정하기

ClickHouse 운영 적용을 위한 환경 준비

오늘 진행한 작업

  1. 통계 서버 모니터링 연결
  2. 최근 이틀치 로그 수집
  3. Vector 파일 탐색 주기 조정
  4. 월집계 추가
  5. 1년치 로그 백필 진행

운영 구성

기존 통계 서비스에 영향을 주지 않도록 로그 수집 경로에 Vector를 붙여 ClickHouse에 통계 데이터를 적재합니다.

통계 서버 두 대의 로그는 Vector를 거쳐 ClickHouse로, Node Exporter와 Vector 메트릭은 LGTM으로 전달합니다. ClickHouse 서버의 OTel Collector는 ClickHouse와 호스트 메트릭을 LGTM으로 전송합니다. Rill은 별도 외부 EC2 서버에서 ClickHouse를 조회합니다.

모니터링이 연결되지 않아 디스크 여유 공간을 확인하지 못하는 문제

상황: 통계 서버에 시스템 모니터링이 없어 디스크 여유 공간과 사용량 추이를 확인할 수 없었습니다.

해결 과정: 각 서버에 Node Exporter를 추가하고 Vector → LGTM으로 메트릭을 연결했습니다. 대시보드에는 팀 SLO에 맞춘 기준선을 표시했습니다.

결과: 디스크와 CPU, 메모리를 함께 확인할 수 있게 됐습니다.

Node Exporter 연결 후 통계 서버 두 대의 CPU, 메모리, 루트 파일시스템 사용률과 디스크 I/O, 네트워크, 부하를 확인한 대시보드.

운영 부하를 고려해 로그 수집량을 조절해야 하는 문제

상황: 운영 부하를 줄이기 위해 최근 이틀치부터 수집하고, 나머지는 별도 백필로 채우기로 했습니다.

해결 과정: 기존 Vector 설정으로 수집을 시작했고, 처리량과 서버 부하를 보며 튜닝하고 있습니다.

결과: 초기 수집 처리량은 두 서버 합계 약 2,900건/s였습니다.

통계 서버별 Vector 읽기와 ClickHouse 전송 이벤트 수, ClickHouse InsertedRows를 함께 표시한 처리량 대시보드.

읽는 로그가 줄어도 system CPU가 줄지 않는 문제

상황: 서버 01의 읽기 속도가 67건/s로 줄었는데도 system CPU가 유지됐습니다. 약 3만 4천 개의 파일을 감시하고 있어 파일 탐색과 감시 비용을 원인 후보로 봤습니다.

해결 과정: 코드 수정 전에 옵션 변경만으로 효과를 확인하기 위해, 두 서버의 새 파일 탐색 주기를 기본 1초에서 15초로 늘렸습니다.

glob_minimum_cooldown_ms: 15000 # 새 파일 탐색 주기: 1초 → 15초

결과:

AS-IS: 새 파일 탐색 주기 1초TO-BE: 새 파일 탐색 주기 15초
설정 변경 전 CPU 구성.15초 적용 시점과 이후 system CPU 감소, 적용 직후 user CPU 급증을 함께 보여주는 그래프.

서버 01의 적용 전과 적용 후 20분 측정값입니다.

항목적용 전적용 후
system CPU25.0%8.6%
컨텍스트 스위치/s약 12.8만 회약 4.3만 회

system CPU와 컨텍스트 스위치가 함께 줄어, 탐색 주기를 15초로 유지하기로 했습니다.

후속 이슈: 탐색 주기를 조정해도 로그 처리 시 CPU가 다시 높아져, 통계 서비스와의 CPU 경쟁을 줄이기 위해 데이타임 전에 개선해야 했습니다.

추가 조정:

결과: 열린 로그 파일이 약 3.4만 개에서 4,420개로 줄었고, Vector의 CPU와 메모리 사용량도 감소했습니다.

월 단위 감시 범위 적용 전후 통계 서버 두 대의 CPU 추이. 설정 반영 직후 상승했다가 낮아지는 모습.

월집계 추가 시 기존분과 신규 적재가 중복 집계될 수 있는 문제

상황: 월집계 MV는 생성 이후 적재되는 데이터를 처리하므로 기존분은 별도로 채워야 했습니다. 그 사이 신규 적재가 겹치면 이중 집계될 수 있었습니다.

해결 과정:

순서작업
1통계 서버 01, 02의 Vector 중지. 이 구간에는 백필도 실행하지 않음
2월집계 테이블과 MV 생성 → 기존분 적재 → 이벤트 수 검증
3두 서버의 Vector 재시작

원본 이벤트 수와 월집계의 이벤트 수 합계를 비교했습니다.

SELECT
    (SELECT count() FROM almanager.events) AS events,
    (SELECT sum(events) FROM almanager.events_monthly) AS monthly;

결과: 기존분 적재와 총 이벤트 수 검증을 마치고 수집을 재개했습니다.

백필 중 ClickHouse CPU와 /data 사용률이 높아지는 문제

상황: 두 통계 서버에서 1년치 로그 백필을 시작한 뒤 ClickHouse EC2의 CPU가 높아졌습니다.

1년치 로그 백필 시작 무렵인 19시 전후부터 ClickHouse EC2 CPU가 상승한 그래프. 마지막 83.9%, 구간 최댓값 95.8%.

해결 과정: ClickHouse 내부 변환과 집계, 병합을 나눠 CPU 사용량을 측정했습니다.

원문은 ClickHouse에서 JSON 변환을 거쳐 이벤트로 저장되고, 일집계와 월집계로 각각 분기합니다. 저장 데이터는 백그라운드에서 병합됩니다.

결과 — 백필 마무리 단계:

항목관측값
원본 로그 처리량(환산)약 22만/s
INSERT 지연, 거부, 실패모두 0

최근 60초 동안의 INSERT와 병합 CPU 시간을 합산해 작업별 비중을 확인했습니다.

작업CPU 전체 비중
INSERT 전체 (아래 세 줄 합계)69.0%
└ JSON 파싱 (events_mv)44.0%
└ 원문 쓰기 등 (INSERT에서 MV 몫을 뺀 값)22.0%
└ 월 집계 (events_monthly_mv)4.0%
병합 (아래 세 줄 합계)31.0%
└ raw_logs 병합20.0%
└ events 병합9.0%
└ events_monthly 병합2.0%

/data 디스크 사용률 추이. 마지막 값은 49.5%, 구간 최댓값은 56.7%입니다.


Share this post:

Previous Post
[26.10.19] ClickHouse 100억 건 조회 부하 줄이기
Next Post
[26.10.15] 학습: 알툴즈 AI API의 파일 읽기 방식별 메모리 사용 비교하기