profile image

L o a d i n g . . .

728x90

이전 포스팅에서 DBMS가 쿼리를 어떻게 처리하는지 살펴봤습니다. 이번 포스팅에서는 쿼리의 병렬 처리 방법에 대해 살펴보겠습니다. 

Process Model

쿼리를 병렬로 처리할 수 있는 process model에 대해 살펴보겠습니다. 

쿼리 요청을 처리하는 DBMS 내부의 컴포넌트를 worker라고 합니다. 

Process per DBMS Worker

각각의 worker는 독립된 프로세스 위에서 동작합니다. 운영체제 스케쥴러에 의해 작업이 할당되고 데이터를 공유할 때 shared memory를 활용합니다. 독립된 프로세스 위에서 동작하므로 하나의 worker에 에러가 발생하더라도 전체 시스템이 다운되지 않습니다. 

Process per DBMS Worker

Process Pool

프로세스를 미리 만들어서 pool에 보관하고 요청이 발생하면 사용 가능한 process를 pool에서 가져와 쿼리를 처리하는 방법입니다. 

Process Pool

Thread per DBMS Worker 

스레드를 활용해 요청을 처리하는 방식입니다. DBMS가 스레드를 직접 스케쥴링을 할 수 있다는 장점이 있습니다. 단점은 동일한 프로세스 내부의 스레드 중 하나가 에러를 발생시키면 전체 프로세스가 다운될 수 있는 위험이 있습니다. 

Thread per DBMS Model

스레드를 활용하는 방식은 프로세스를 활용하는 방식에 있어 context switch 비용이 낮습니다. 또한 데이터 공유를 위해 shared memory를 활용할 필요가 없습니다. 

위에서 설명드린 process model을 통해 달성할 수 있는 병렬 처리의 형태는 다음과 같습니다. 
- Intra-query parallelism: 하나의 쿼리를 병렬로 처리 
- Inter-query parallelism: 서로 다른 쿼리를 병렬로 처리 

 

Operator Parallelism

다음으로는 operator 병렬 처리에 대해 살펴보겠습니다. Intra-query parallelim을 달성할 수 있는 방법으로는 intra-operator parallelism과 inter-operator parallelism가 있습니다. 각각 처리 방법에 대해 살펴보겠습니다. 

 

Intra-operator Parallelism

동일 기능을 하는 여러 operator들을 fragment 단위로 나눈 후, 처리해야 하는 데이터를 병렬로 처리합니다. Exchange operator를 통해 children/parent operators로부터 반환받은 결과를 나누거나 병합합니다.

Exchange operator는 다음과 같은 기능을 수행합니다. 
- Gather: 여러 worker로부터 전달받은 결과를 병합시킵니다. 
- Distribute: 하나의 input stream으로부터 전달받은 결과를 여러 output stream으로 분리해서 전달합니다. 
- Repartition: 여러 input stream으로부터 전달받은 결과를 다수의 output stream으로 분리해서 전달합니다. 

Intra-operator Parallelism

 

Inter-operator Parallelism

두 번째 방법으로는 서로 다른 operator을 병렬로 실행하는 방법입니다. Pipeline parallelism이라고 부르기도 합니다. 다음과 같은 쿼리 요청을 처리한다고 하면 inter-operator parallelism은 join operator와 select operator을 동시에 실행합니다. 

SELECT * 
FROM student 
JOIN class on student.class_id = class.id

 

Bushy Parallelism 

위에서 설명드린 두 방법의 장점을 혼합한 방식입니다. 

 

I/O Parallelism

여기서 중요한 것은 아무리 프로세스나 스레드의 수를 늘려서 쿼리를 병렬 처리한다고 하더라도 디스크 I/O에서 병목이 발생하면 성능이 좋아질 수 없습니다. DBMS는 디스크의 I/O를 병렬 처리하기 위해서 multi disk parallelism 또는 partitioning 방식을 활용합니다. 

 

Multi-disk Parallelism 

DBMS의 file을 여러 디스크에 저장하는 방식입니다(RAID 등) 

RAID 0(Striping)
RAID 1(Mirroring)

 

Database Partitioning 

Partitioning은 테이블에 저장된 데이터를 적절히 나눠서 디스크에 저장하는 방식입니다. Partitioning 방법에 따라 horizontal 그리고 vertical 방식으로 구분할 수 있습니다. 

Horizontal Partitioning 

하나의 테이블을 수평으로 분리하는 방식입니다. 각각의 partition은 서로 다른 위치에 저장되고 관리됩니다. 

Horizontal Partitioning

Vertical Partitioning 

하나의 테이블을 수직으로 분리하는 방식입니다. 

Vertical Partitioning

 

마무리 

이번 포스팅을 통해 쿼리 요청을 어떻게 병렬 처리하는지 살펴봤습니다. 매번 느끼는 거지만 병렬 처리 도입하면 구현 난이도는 배가 되는 것 같습니다. 다음 포스팅을 통해 쿼리 요청을 어떻게 처리할 것인지 계획을 세우는, 쿼리 플랜에 대해 살펴보겠습니다. 

728x90
복사했습니다!