Wed, 16 Jun 2021 12:59:53 +0900

자료 분산 처리 Sharding 이야기

파티션 테이블과 뭐가 다르지?

하나의 테이블에 많은 자료가 담기면 여러 문제가 생긴다.

테이블 자료를 다 살펴봐야 끝나는 ALTER TABLE 작업이 아주 오래 걸린다.
최신 버전에서는 ALTER TABLE 작업에서 이렇게 테이블 자료를 모두 살펴보는 일이 많지는 않지만, 그래도 자료가 많은 테이블의 ALTER TABLE 작업은 언제나 부담이 된다.

부분 인덱스를 사용하지 않는 경우라면, 그 자료량만큼 인덱스도 커진다.

테이블 청소를 신경 써야한다. (아직까지 로봇 청소기(autovacuum)가 그리 똑똑하게 작동하지 않는다.)

이런 여러 문제들 때문에, 한 테이블에 담을 자료량이 많으면, 자료가 담기지 않는 상위 테이블과 자료가 담기는 여러 개의 하위 테이블을 만들고, 사용자는 상위 테이블만 사용하는 파티션 테이블 개념이 등장했다.

이 파티션 테이블 이야기는 많은 사용자들이 잘 알고 있을 것이다.

이 글에서는 이 파티션 테이블 확장을 이야기한다. 그 부분 자료를 이제는 하나의 데이터베이스 서버가 아닌 다른 데이터베이스 서버에 저장하고, 여러 데이터베이스 서버를 마치 하나의 데이터베이스 서버처럼, 아니, 하나의 테이블인것 처럼 사용하는 방법을 이야기한다.

greenplum 같은 분산 병렬 이야기를 단지 PostgreSQL 만으로 다루는 것이다.

멀티마스터와 샤딩

하나의 데이터베이스 서버가 하나의 서비스에 사용 될 때는 그냥 '서버'라고 하는데, 이 서버들이 여러개 있고, 그것들이 모두 하나의 서비스에 사용 될 때는 요즘은 '노드'라는 말을 한다. 여러 노드(부분 데이터베이스 서버)가 모여 하나의 데이터베이스 서버가 되는 것이다.

이 때 그 부분 데이터베이스 서버에서 다루는 자료가 모두 같은 자료인지, 아니면 전체 자료의 부분 자료인지에 따라 구분할 필요가 있다.

흔히 '멀티마스터 데이터베이스' 이야기를 할 때 이 부분을 생각해야한다.

오라클 RAC인 경우는 각 노드에 있는 자료가 모두 같다.

몽고디비나 엘라스틱서치의 경우는 각 노드가 전체 자료의 부분 자료만 다룬다.

요즘 추세는 후자다. (물론 아직까지 RAC는 넘사벽이다)

이 각 노드는 자신의 자료만 저장하는 것을 샤딩이라고 한다.

샤딩을 이야기 할 때는 그 응용 프로그램이 접근하고자 하는 자료가 있는 노드로 찾아가는 일을 어디서 할 것인가를 잘 살펴봐야한다.

샤딩 기능이 있는 요즘 데이터베이스 서버들은 대부분 이 분산 처리를 위한 또 하나의 서버를 둔다.

이 글에서는 이 두가지 모두를 구현하는 방법을 다룬다.

논리 복제로 구현하는 멀티마스터

이 글에서 다루는 멀티마스터는 오라클의 RAC를 뜻하지 않는다. 고작 테이블 수준의 비동기식 하위 테이블 복제 수준이다. PostgreSQL 13 버전에서 파티션 테이블의 하위 테이블이 논리 복제를 할 수 있게 되었다.

위 그림과 같이 '거래내역' 테이블은 3개의 노드에 그 구조가 똑같은 파티션 테이블이 있고, 하위 테이블도 똑 같이 있을 때, 개별 하위 테이블은 각각의 노드에서 읽기/쓰기가 가능하고, 나머지는 다른 노드에서 논리 복제로 기능으로 복제된 읽기 전용 하위 테이블로 구성한다.

위 그림의 경우라면, 2020년 자료는 초록색 테이블이 있는 노드에서 DML 작업을 하고, 그 자료 변경 결과는 각각 노란색과 파란색 테이블로 논리 복제 된다.

이런식으로 다른 노드들도 자기 노드에서 DML 작업이 가능한 하위 테이블과 읽기 전용으로 사용할 하위 테이블을 구분해서 구성한다.

최종적으로는 세 파티션 테이블의 모든 자료는 동일하게 세 곳에 저장된다.

다음은 PostgreSQL 13 버전 기준 위 그림을 구현한 DDL 구문이다.

호스트 이름: node1, node2, node3

테이블 소유주(롤):

논리 복제 롤:

외부 자료 싸개

PostgreSQL 12 버전에서 파티션 테이블의 하위 테이블로 외부 테이블을 사용할 수 있게 되었다.

자료가 담기지 않는 상위 테이블이 있는 서버와, 부분 자료들이 각각 담기는 하위 테이블이 있는 서버들을 이용해서 분산 처리하는 방법이다.

또 다른 방법으로,

각 노드는 모두 똑 같은 상위 파티션 테이블이 있고,

각 노드별로 자기 노드에 저장되는 하위 테이블과 다른 노드에 저장되는 여러 외부 테이블로 구성할 수도 있다.

숙제