[Clickhouse] Storage Policy: 멀티 디스크 구성하기

clickhouse는 빅데이터를 다루는 시스템이고, 대부분의 사용사례에서는 디스크를 매우 많이 사용한다.
단일 디스크로는 성능/용량 한계가 분명하기 때문에 어느 시점에서는 분명히 하드웨어 수준 확장을 꾀해야 할 시점이 온다.

그럴 경우에는 단일머신에 디스크를 여러개 달거나, 아니면 아예 멀티노드 클러스터를 구성해야 한다.
여기서는 그 중 단일머신-멀티 디스크를 사용하는 방법만 다룬다.

clickhouse는 멀티 디스크나 외부 파일시스템 연동을 위한 기능을 제법 잘 지원한다.
disk와 storage policy란 시스템 수준 설정을 통해서 여러개의 디스크/저장소를 관리할 수 있다.

-- 디스크 정보 목록 
SELECT * FROM system.disks;

-- 스토리지 정책 목
SELECT * FROM system.storage_policies;

기본값은 대략 이런 형태다.
기본 데이터 경로가 기본 disk로 설정되어있고, 별다른 옵션을 주지 않는다면 이 기본 disk에 저장하도록 테이블이 만들어지는 것이다.

그래서 우리가 할 것은, 디스크를 추가하고, 해당 디스크를 사용하는 storage policy를 추가하는 것이다.




디스크 경로 준비

당연히 먼저 해야할 것은, 추가로 사용할 디스크 디렉토리를 잘 준비해놓는 것이다.
디스크를 마운트해놓고, 마운트한 경로 아래에 적절한 clickhouse용 디렉토리까지 만들어준다.

내 경우에는 저 아래쪽에 4테라짜리 디스크를 쓸 것이다.


clickhouse란 디렉터리를 만들고, 저기에 데이터가 저장되도록 했다.




config.yml 수정

디스크 관련된 설정들은 query로는 수정할 수 없고, 설정파일을 건드려야 한다.

sudo vi /etc/clickhouse-server/config.xml
sudo systemctl restart clickhouse-server

수정하고 DB 서버까지 재부팅해야 한다. 다운타임은 필연적이다.

설정파일에는 다음과 같이 storage_configuration 설정을 추가한다.
기본 디스크는 따로 설정하지 않아도 되고, default라는 이름으로 존재한다.
아래처럼 추가 디스크 설정만 추가해서 넣으면 된다.

    <storage_configuration>
        <disks>
            <!-- 추가 볼륨 -->
            <second_disk>
                <path>/mnt/ssd4tb/clickhouse/</path>
            </second_disk>
        </disks>

        <policies>
            <!-- 2번째 디스크만 쓰는 정책 -->
           <second_policy>
                <volumes>
                    <main>
                        <disk>second_disk</disk>
                    </main>
                </volumes>
            </second_policy>

            <!-- 두 디스크를 모두 사용하는 정책 -->
            <multi_disk_policy>
                <volumes>
                    <volume1>
                        <disk>default</disk>
                    </volume1>
                    <volume2>
                        <disk>second_disk</disk>
                    </volume2>
                </volumes>
            </multi_disk_policy>

            <!-- 자동으로 여러 디스크에 분산하는 정책 -->
            <balanced_policy>
                <volumes>
                    <main>
                        <disk>default</disk>
                        <disk>second_disk</disk>
                    </main>
                </volumes>
            </balanced_policy>
        </policies>
    </storage_configuration>

그리고 재시작해서 오류가 안나면 세팅은 잘 된 것이다.

그러면 이제 디스크 목록에도 추가가 될 것이고

Storage Policy에도 추가가 되었을 것이다.
이러면 사용 준비는 끝이다.




Storage Policy 사용하기

Storage Policy의 사용법은 간단하다.
테이블을 만들때 옵션만 적절히 넣어주면 자동으로 거기에 속한 디스크에 저장을 해준다.

CREATE TABLE laboratory.foo (
	id BigInt, 
	value String
) 
ENGINE = MergeTree 
ORDER BY id
SETTINGS storage_policy = 'second_policy'

이렇게 만들고 나면


이런 식으로 해당 디스크 경로에 저장이 될 것이다.

단, 유의할 점은. DDL 같은 기본적인 메타데이터들은 디폴트 볼륨 영역에 저장된다는 것이다. 여기에는 대부분의 용량을 차지하는 메인 세그먼트들이 저장된다.



참조
https://clickhouse.com/docs/operations/storing-data