본문 바로가기
IT

CITUS DB - 기본 개념

by 힁구띠 2022. 9. 19.

Postgres Extension으로 최신 Postgres 기능, 도구 및 에코시스템을 이용할 수 있습니다.

Postgres를 샤딩, 분산 SQL 엔진, 참조 / 분산 테이블과 같은 기능을 갖춘 분산 데이터베이스로 Scale-out 수 있도록 합니다.

쿼리 엔진은 요청받는 SQL 쿼리를 서버 간 병렬 처리로 빅 데이터 세트에 대하여 더 빠르게 응답합니다. 일반적으로 100GB의 데이터에 이상의 워크로드를 처리합니다.

 

1. 분산 테이블

분산 테이블은 Citus 성능의 핵심이라 할 수 있습니다. 

위 그림은 분산 테이블인 'table'에 대한 SELECT 문 실행의 예시입니다. 애플리케이션으로부터 코디네이터 노드의 테이블에 대한 SELECT문 요청이 들어왔을 때,

메타정보를 참조하여 각 워커 노드에 분산 저장된 테이블에 대한 메타정보를 얻어 병렬 처리를 하는 예시입니다.

Citus는 전체 클러스터에 걸쳐 SQL문뿐만 아니라 DDL문도 실행할 수 있으므로, 분산 테이블의 스키마를 워커 노드의 모든 테이블 샤드에 대하여 계단식으로 변경이 가능합니다.

 

2. 분산 칼럼

분산 칼럼은 분산 테이블 생성 시 데이터를 각 워커 노드에 어떻게 나누어 저장할지 결정하는 중요한 요소이므로 분산 칼럼을 반드시 지정해야 합니다.

분산 칼럼의 선정은 쿼리 성능과 SQL 호환성에 중요한 영향을 미칩니다. 만일 분산 칼럼이 부적절하게 선정되었다면, 불필요한 성능 저하와 일부 SQL 쿼리가 작동되지 않을 수 있습니다.

 

3. LOCAL 테이블

Citus에서 코디네이터 노드는 스탠더드 PostgreSQL과 Citus Cluster를 모두 사용할 수 있습니다. 분산 테이블을 생성하지 않으면 일반 테이블과 동일하게 사용이 가능합니다. 이는 애플리케이션 유저나 로그인, 인증 정보와 같은 작은 관리용 테이블로 적합합니다.

 

4. Shard

SELECT * from pg_dist_shard;

 logicalrelid  | shardid | shardstorage | shardminvalue | shardmaxvalue

---------------+---------+--------------+---------------+---------------

 github_events |  102026 | t            | 268435456     | 402653183

 github_events |  102027 | t            | 402653184     | 536870911

 github_events |  102028 | t            | 536870912     | 671088639

 github_events |  102029 | t            | 671088640     | 805306367

 (4 rows)

 

워커 노드 내의 더 작은 테이블에 있는 분산 테이블 row의 하위 집합을 포함하는 단위입니다.

샤드에 대한 정보는 코디네이터 노드의 메타데이터 테이블인 pg_dist_shard에 저장되어 있습니다.

예를 들어, 코디네이터 노드가 특정 row를 가지고 있는 샤드를 확인하려는 경우 해당 행의 github_events 분산 칼럼 값을 해시하고, 해시된 값이 포함된 샤드의 범위를 확인합니다.

샤드는 데이터 손실을 방지하기 위해 각 워커 노드 간의 복제가 이뤄질 수도 있습니다. Citus에서는 2가지 복제 옵션을 제공합니다.

첫 번째로 Citus 복제는 추가로 백업용 샤드를 미리 배치하고, 그중 하나를 업데이트하는 모든 쿼리를 실행합니다.

두 번째 스트리밍 복제는 PostgreSQL의 스트리밍 복제를 활용하여 각 노드의 전체 데이터베이스를 Follower 데이터베이스에 복제합니다.

이는 Citus의 메타데이터를 테이블의 개입이 필요하지 않아 더욱 투명하고 효율적입니다.

 

5. Co-Location

샤드와 해당 복제본은 원하는 대로 노드에 배치할 수 있으므로 관련 테이블의 관련 행을 포함하는 샤드를 동일한 노드에 함께 배치하는 것이 좋습니다.

이런 식으로 그들 사이의 조인 쿼리는 네트워크를 통해 많은 정보를 주고받는 것을 피할 수 있고, 단일 Citus 노드 내에서 수행될 수 있게 합니다.

Co-location은 데이터를 전술적으로 나누는 방식으로, 관련 정보를 동일한 시스템에 유지하여 효율적인 관계형 작업을 가능하게 하지만 전체 데이터 세트에 대한 수평 확장성을 활용합니다.

데이터의 Co-location의 원칙은 데이터베이스의 모든 테이블에 공통 배포 열이 있고 동일한 방식으로 컴퓨터 간에 분할되어 배포 열 값이 동일한 행이 다른 테이블에서도 항상 동일한 노드에 있다는 것입니다.

 

6. 쿼리 실행 프로세스

다중 샤드 쿼리를 실행할 때 Citus는 병렬 처리의 이점과 데이터베이스 연결의 오버헤드(네트워크 대기 시간 및 워커 노드 리소스 사용량)의 균형을 맞춰야 합니다.

데이터베이스 워크로드에서 최상의 결과를 위해 Citus의 쿼리 실행을 구성하려면 Citus가 코디네이터 노드와 워커 노드 간의 데이터베이스 연결을 관리하고 보존하는 방법을 알아야 합니다.

Citus는 들어오는 각 다중 샤드 쿼리 세션을 태스크라고 하는 샤드 별 쿼리로 변환합니다. 태스크를 큐에 넣고 관련 워커 노드에 연결할 수 있게 되면 작업을 실행합니다.

1) citus.max_adaptive_executor_pool_size

코디네이터 노드는 각 세션에 대한 커넥션 풀을 가집니다. 각 쿼리는 워커 노드당 태스크에 대해 최대 동시 연결 가능 수를 결정합니다. 이 설정은 우선순위 관리를 위해 세션 수준에서 구성할 수 있습니다.

2) citus.executor_slow_start_interval

다중 분할 쿼리에서 작업에 대한 연결 시도 간의 지연을 설정합니다.

새로운 연결을 병렬로 설정하는 것보다 동일한 연결을 통해 짧은 작업을 순차적으로 실행하는 것이 더 빠를 수 있습니다.

반면, 장기 실행 작업은 보다 즉각적인 병렬 처리라는 장점이 있습니다.

3) citus.max_cached_conns_per_worker

연결을 사용하여 작업이 완료되면 세션 풀은 나중을 위해 연결을 유지합니다. 연결을 캐싱하면 조정자와 작업자 간의 연결 재설정 오버헤드를 피할 수 있습니다. 하지만 각 풀은 작업자의 유휴 연결 리소스 사용을 제한하기 위해 한 번에 열린 유휴 연결 이상을 보유하지 않습니다.

4) citus.max_shared_pool_size

모든 작업 간의 작업당 총 연결 수를 제한하여 안전장치 역할을 수행합니다.

'IT' 카테고리의 다른 글

MySQL 사용자 계정 관리 - 1  (0) 2022.09.21
MySQL 정적 변수와 동적 변수  (0) 2022.09.19
스파크 실행과 언어 API  (0) 2022.09.07
MySQL 권한 - 1  (0) 2022.09.05
스파크 데이터 구조  (0) 2022.08.26

댓글