InfoGrab DocsInfoGrab Docs

GitLab 활동 데이터를 ClickHouse에 저장하기

GitLab 활동 데이터를 PostgreSQL에서 ClickHouse로 마이그레이션하는 방법과 데이터 구조, 쿼리 최적화 전략을 설명합니다.

기존 구현 개요 # GitLab 활동 데이터란 무엇인가 # GitLab은 사용자가 애플리케이션과 상호 작용할 때 운영 중에 활동 데이터를 기록합니다. 이러한 상호 작용의 대부분은 프로젝트, 이슈, 머지 리퀘스트 도메인 객체를 중심으로 이루어집니다. 사용자는 여러 가지 다양한 작업을 수행할 수 있으며, 이 중 일부 작업은 events 라는 별도의 PostgreSQL 데이터베이스 테이블에 기록됩니다. 이벤트 예시: 이슈 열림 이슈 다시 열림 사용자가 프로젝트에 참여함 머지 리퀘스트 머지됨 리포지터리 푸시됨 스니펫 생성됨 활동 데이터가 사용되는 위치 # 여러 기능에서 활동 데이터를 사용합니다: 프로필 페이지의 사용자 기여 달력 . 사용자 기여 목록 페이지네이션. 프로젝트 및 그룹에 대한 사용자 활동의 페이지네이션 목록. 기여 분석 . 활동 데이터 생성 방식 # 활동 데이터는 보통 사용자가 특정 작업을 실행할 때 서비스 레이어에서 생성됩니다. events 레코드의 영속성 특성은 서비스 구현 방식에 따라 달라집니다. 두 가지 주요 접근 방식이 있습니다: 실제 이벤트가 발생하는 데이터베이스 트랜잭션 내에서. 데이터베이스 트랜잭션 이후(지연될 수 있음). 위에서 언급한 메커니즘은 "대부분" 일관된 events 스트림을 제공합니다. 예를 들어, events 레코드를 일관되게 기록하는 경우: ApplicationRecord.transaction do issue.closed! Event.create!(action: :closed, target: issue) end events 레코드를 안전하지 않게 기록하는 예시: ApplicationRecord.transaction do issue.closed! end # If a crash happens here, the event will not be recorded. Event.create!(action: :closed, target: issue) 데이터베이스 테이블 구조 # events 테이블은 다형성 연관(polymorphic association) 을 사용하여 다양한 데이터베이스 테이블(이슈, 머지 리퀘스트 등)을 레코드에 연결할 수 있도록 합니다. 간략한 데이터베이스 구조: Column | Type | Nullable | Default | Storage | -------------+--------------------------+-----------+----------+------------------------------------+ project_id | integer | | | plain | author_id | integer | not null | | plain | target_id | integer | | | plain | created_at | timestamp with time zone | not null | | plain | updated_at | timestamp with time zone | not null | | plain | action | smallint | not null | | p