오픈소스/ClickHouse

[ClickHouse] Data 구조

책만펴면감성폭발 2023. 6. 30. 17:49

  Clickhouse는 모든 데이터를 File로 저장(Disk)해서 사용한다.

Database, Table을 Directory로 구성하고 해당 경로 안에 데이터를 컬럼 단위로 쪼개어 .bin 확장자 파일로 저장한다.
  ex ) [컬럼명].bin

또한, 물리적인 위치를 찾아가기 위해 .mrk2 확장자를 갖는 파일을 저장하는데, 이 파일은 해당 컬럼의 Index 정보와 블록 위치를 찾아가기 위한 매핑 파일이다.

  ex ) [컬럼명].mrk2

Data 파일 예시 (.bin, .mrk2)

  열 단위로 데이터를 모아서 저장하는, 위와 같은 데이터 구조로 인해, 특정 열에 대한 접근 성능을 향상시키고 전체 열에 대한 로드를 없애면서 자원 사용량을 획기적으로 줄인다. 이 밖에도, Index에 대한 정보를 담는 파일(.idx), 테이블을 생성한 DDL 문을 담고 있는 파일(.sql) 등 메타 데이터를 포함한 모든 데이터를 파일로 저장하여 사용한다.

 

  Clickhouse의 Table에 저장되는 데이터들은 각 Part 단위로 저장되는데, 임의의 시간에 백그라운드에서 내부적으로 해당 데이터들의 병합(Merge)을 수행한다. 이 때, 각 Part에 저장된 데이터들은 물리적은 구조가 조정되며, 같은 값 또는 유사한 값을 갖는 데이터들을 모으거나, 파티셔닝 작업이 이루어진다. 병합이 끝난 Part는 삭제되며, 데이터가 새로 저장될 때 마다 반복된다.

 

Data 병합(Merge) 과정

 

  Clickhouse는 Data를 저장할 때, 또 하나의 특징이 있다.

Data가 Insert 될 때 특정 키(컬럼)를 기준으로 물리적인 데이터의 위치를 정렬한다는 것인데, 정렬의 기준이 되는 키(컬럼)는 Table을 Create할 때 기재한 Order by 구문에 의해 선정된다.

Create 문 예시

  위 DDL 구문은 Clickhouse에서 테이블을 생성하는 예시문이다.

해당 구문의 자세한 분석은 후술하기로 하고, 아래서 3번 째 ORDER BY 문에 적힌 컬럼을 확인할 수 있다. Create 구문에서의 ORDER BY는 vst_dt 라는 컬럼을 기준으로 데이터를 정렬해서 저장하겠다는 의미이다. 이렇게 생성된 Table은 데이터가 Insert 되면, 동일한 또는 유사한 데이터들을 정렬해서 물리적으로 근접한 위치에 저장하고, ORDER BY 에 기재된 컬럼에 대한 Primary Index(primary.idx 파일)가 생성된다.

 

  Primary Index에 의해 정렬되어 저장된 데이터는 데이터의 접근 성능을 높인다. Index의 구조 또한 일반적인 RDBMS의 그것과는 동작방식이 상이하기 때문에 Clickhouse의 Index에 대해서도 후술하도록 한다.

 

  상기한 내용처럼 ClickHouse는 데이터를 열 단위의 파일로 관리하며, Order By 컬럼을 기준으로 정렬된 데이터를 Part 단위로 묶어 저장한다. 그리고 증분된 데이터에 대해서는 백그라운드에서 병합(Merge)을 수행 함으로써 Part의 수를 줄이고 데이터 접근 성능이 더 나아지도록 조정하는 구조를 갖고 있다. Clickhouse가 대용량 데이터를 다루는데에 있어 고속을 자랑하는 이유는 이와 같은 데이터 구조를 갖고 있기 때문이며, 이런 구조로 인해 파생되는 단점 또한 명확하다. 이는 후에 Index에 대한 설명과 함께 포스팅 할 예정이다.