Database/Clickhouse

Clickhouse 개요 및 Docker로 Multi node 구성

daeunnniii 2024. 11. 16. 16:57
728x90
반응형

1. ClickHouse 개요

1.1 ClickHouse

  • ClickHouse는 OLAP을 위한 고성능, 컬럼 지향형 SQL DBMS이다.
  • 기존 데이터베이스보다 100~1000배 더 빠르게 작동하고 초당 수억에서 수십억 행과 수십 기가바이트의 데이터를 처리한다.
  • 오픈소스로 무료이고, ClickHouse에서 클라우드로 제공해주는 서비스는 유료이다.

1.2 OLAP (Online analytical processing)

  • OLAP란 OnLine Analytical Processing의 약자로 다양한 관점에서 비지니스 데이터를 분석하는 데에 사용할 수 있는 소프트웨어 기술이다.
  • 온라인 분석 처리(OLAP)는 다음과 같은 특성을 가진 복잡한 분석 쿼리에 대해 대규모 데이터 세트에 대한 실시간 응답이 필요하다.
    • 데이터 세트는 수십억 또는 수조개의 행으로 방대할 수 있다.
    • 데이터는 많은 열을 포함하는 표로 구성된다.
    • 특정 쿼리에 답변하기 위해 몇개의 열만 선택된다.
      • 특정 쿼리에서 뽑은 열의 개수는 상당히 적을 때 - 칼럼 수가 1000개일 때 2개의 칼럼만 조회하는 경우
    • 결과는 밀리초 또는 초단위로 반환되어야 함.
  • 대부분의 쿼리를 처리하는데 최소 100배는 더 빠름

1.3 OLTP(로우지향) VS 칼럼지향(OLAP)

Row oriented

  • 일반적인 DB에 해당
  • 데이터가 ROW 단위로 저장됨.

https://clickhouse.com/docs/en/intro

Column oriented

  • 데이터분석에 사용되는 DB
  • 컬럼 단위의 읽고 쓰기에 최적화되어있음.
  • 같은 열에는 유사한 데이터가 반복되기 때문에 매우 작게 압축할 수 있음
  • 열별로 데이터가 저장되어있기 때문에 필요한 열만 로드하여 디스크 I/O를 줄인다.

https://clickhouse.com/docs/en/intro

 

1.4 ClickHouse 주요 특징

  • 데이터와 함께 불필요한 값들이 저장되지 않는다.
  • 효율적인 데이터 압축이 기능하다.
  • 멀티코어 연산이 가능하다.
  • 하드를 가상 메모리처럼 쓴다.
    • 실제 필요한 용량보다 하드를 좀 더 크게 쓰는 것을 권장한다고 한다.
  • 일반적인 SQL 언어 지원
  • 쿼리를 빠르게 수행하기 위해 병합트리를 사용하여 정렬한다.
    • 백그라운드에서 병합이 진행됨.
  • 데이터가 추가 될 때 lock 이 필요 없다.
  • 백업 기능 제공

Query 성능 비교

https://dzone.com/articles/column-store-database-benchmarks-mariadb-columnsto
https://dzone.com/articles/column-store-database-benchmarks-mariadb-columnsto

1.5 ClickHouse에서 지원하는 데이터베이스 엔진

  • Atomic
  • MySql
  • Lazy
  • PostgreSQL
  • Replicated
  • SQLite

1.6 ClickHouse에서 지원하는 테이블 엔진

  • MergeTree
    • 클릭하우스 기능의 핵심.
    • 기본테이블 엔진이다.
    • pk 별로 데이터를 정렬하여 저장한다.
    • 대용량 데이터를 테이블에 삽입 할 수 있도록 설계됨.
    • 데이터 수집시 자동 데이터 중복 제거 기능이 있다.
      • ReplacingMergeTree, CollapsingMergeTree 사용하면 중복제거 가능
      • INSERT 중에 네트워크 문제가 발생한 경우 소프트웨어가 안전하게 다시 시도 할 수 있다.
      • 알아서 중복을 제거해 주기 때문에 여러번 데이터를 삽입 해도 문제가 없다.
    • MergeTree 테이블 엔진 참고: https://vprog1215.tistory.com/392
  • Kafka
    • 카프카 토픽에서 메시지를 직접 읽을수 있다.
  • S3
    • S3와 연동가능

1.7 ClickHouse 단점

  • 트랜잭션 지원안함.
  • 삽입된 데이터를 수정하거나 삭제하는 기능이 부족하다.
  • 단건의 레코드를 조회하는경우에는 OLTP 보다 느리다.

2. 컨테이너 기반 ClickHouse 설치 및 실행

2.1 단일 컨테이너에 Clickhouse 설치 및 실행

~$ sudo docker run -d --name docker_sandbox -d clickhouse/clickhouse-server:latest
~$ sudo docker container ls
CONTAINER ID   IMAGE                                 COMMAND                   CREATED              STATUS              PORTS                                                                                  NAMES
4a0cb13805ba   clickhouse/clickhouse-server:latest   "/entrypoint.sh"          About a minute ago   Up About a minute   8123/tcp, 9000/tcp, 9009/tcp                                                           docker_sandbox
 
~$ sudo docker exec -it 4a0cb13805ba bash
 
# 컨테이너 내부에서 clickhouse-client 입력하여 Clickhouse 실행
root@4a0cb13805ba:/# clickhouse-client

2.2 docker-compose를 활용하여 다중 컨테이너에 ClickHouse 설치 및 실행

  • 3개의 ClickHouse 컨테이너를 생성하여 다중 노드 클러스터 환경에 Clickhouse를 구성하고, 단일 노드에 Zookeeper를 구성한다.
  • docker-compose를 사용하여 Clickhouse를 실행하면 필요한 모든 컨테이너를 한번에 실행할 수 있으며, 브리지 네트워크를 사용하여 노드 간 네트워킹이 더 쉬워진다.

2.2.1 docker-compose.yml

version: '3'
 
services:
  zookeeper:
    image: 'bitnami/zookeeper:latest'
    networks:
      - ch_replicated
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
      - ZOOKEEPER_CLIENT_PORT=2181
    ports:
      - "2182:2181"
      - "2888:2888"
      - "3888:3888"
     
  clickhouse1:
    image: clickhouse/clickhouse-server
    volumes:
      - /mnt/Data/ClickHouse1/data_dir:/var/lib/clickhouse
      - /mnt/Data/ClickHouse1/clickhouse_config.xml:/etc/clickhouse-server/config.xml
    ports:
      - "8002:9000"
      - "9123:8123"
    ulimits:
      nproc: 65535
      nofile:
        soft: 262144
        hard: 262144
    networks:
      - ch_replicated
    depends_on:
      - zookeeper
       
  clickhouse2:
    image: clickhouse/clickhouse-server
    volumes:
      - /mnt/Data/ClickHouse2/data_dir:/var/lib/clickhouse
      - /mnt/Data/ClickHouse2/clickhouse_config.xml:/etc/clickhouse-server/config.xml
    ports:
      - "8003:9000"
      - "9124:8123"
    ulimits:
      nproc: 65535
      nofile:
        soft: 262144
        hard: 262144
    networks:
      - ch_replicated
    depends_on:
      - zookeeper
       
  clickhouse3:
    image: clickhouse/clickhouse-server
    volumes:
      - /mnt/Data/ClickHouse3/data_dir:/var/lib/clickhouse
      - /mnt/Data/ClickHouse3/clickhouse_config.xml:/etc/clickhouse-server/config.xml
    ports:
      - "8004:9000"
      - "9125:8123"
    ulimits:
      nproc: 65535
      nofile:
        soft: 262144
        hard: 262144
    networks:
      - ch_replicated
    depends_on:
      - zookeeper
 
  clickhouse4:
    image: clickhouse/clickhouse-server
    volumes:
      - /mnt/Data/ClickHouse4/data_dir:/var/lib/clickhouse
      - /mnt/Data/ClickHouse4/clickhouse_config.xml:/etc/clickhouse-server/config.xml
    ports:
      - "8005:9000"
      - "9126:8123"
    ulimits:
      nproc: 65535
      nofile:
        soft: 262144
        hard: 262144
    networks:
      - ch_replicated
    depends_on:
      - zookeeper
 
networks:
  ch_replicated:
    driver: bridge

 

2.2.2 다중 노드 클러스터 환경에 Clickhouse를 구성하기 위한 config 파일 작성

  • remote_servers 설정의 경우 다중 노드의 정보를 설정하는 부분이다.
  • zookeeper 클러스터의 세부정보도 추가한다.
  • 매크로 replica는 복제된 테이블에서 Zookeeper 경로를 구성하는데 사용된다. (macro 값은 노드마다 다르게 설정해주어야함)

→ ClickHouse의 샤딩 적용을 위한 macro 설정 방법은 다음 게시글 참고

  • 기존 config.xml 파일에서 아래 내용을 참고하여 모든 노드에 추가해준다. (/mnt/Data/ClickHouse*/clickhouse_config.xml)
<remote_servers>
    <!-- Test only shard config for testing distributed storage -->
    <replicated_cluster>
        <shard>
        <internal_replication>true</internal_replication>
        <replica>
            <host>clickhouse1</host>
            <port>9000</port>
        </replica>
        <replica>
            <host>clickhouse2</host>
            <port>9000</port>
        </replica>
        </shard>
        <shard>
        <internal_replication>true</internal_replication>
        <replica>
            <host>clickhouse3</host>
            <port>9000</port>
        </replica>
        <replica>
            <host>clickhouse4</host>
            <port>9000</port>
        </replica>
        </shard>
    </replicated_cluster>
</remote_servers>
 
<zookeeper>
    <node index="1">
        <host>zookeeper</host>
        <port>2181</port>
    </node>
</zookeeper>
 
<macros>
    <shard>01</shard>
    <replica>ch1</replica>
</macros>

 

2.2.3 실행

~$ sudo docker-compose up
  • 모든 컨테이너가 잘 작동하는지 확인

~$ sudo docker exec -it 159fe792769d bash
 
# 컨테이너 내부에서 clickhouse-client 입력하여 Clickhouse 실행
root@4a0cb13805ba:/# clickhouse-client -m

 

 

다음 게시글

https://daeunnniii.tistory.com/203

 

Clickhouse에서의 Sharding

1. ClickHouse에서의 샤딩1.1 샤딩(Sharding)이란?샤딩은 동일한 스키마를 가지고 있는 여러대의 데이터베이스 서버들에 데이터를 작은 단위로 나누어 분산 저장하는 기법이다. 이때, 작은 단위를 샤

daeunnniii.tistory.com

 

728x90
반응형

'Database > Clickhouse' 카테고리의 다른 글

Clickhouse에서의 Sharding  (0) 2024.11.16