윈도우즈기반 도커에 Postgres-XL 설치하기

빅데이터용 RDBMS가 필요해!

인터파크 사내에 추천시스템을 제공하기위해서 수많은 상품과 사용자 데이터를 마이닝하고 모델링을 거친 추천 상품들을 핸들링하기 위한 RDBMS가 필요했습니다. (그러나,,, RDBMS가 꼭 필요한 경우가 아니라면, 오픈소스 MPP 보단 가급적 Parquet 또는 다른 하둡 에코를 이용하시는게 정신건강에 이롭습니다.)

후보 솔루션 및 솔루션 선정

찾아본 솔루션은 다음과 같습니다.

  • Cockroach DB : Raft 합의알고리즘채택으로 가장 많이 기대하고 사용해 봤으나, 1천만 건 테이블 Join 시 killed. 적은 건수는 잘 됨. (go로 개발되었는데, 메모리 할당할 때 문제가 생기는 듯…)
  • Pivotal Greenplum : Postgres 버전이 낮음. v8.3 (버전관리 안하고있는듯…)
  • Citusdata : 꼭 상용 솔루션을 써야만 될것 같은 느낌적인 느낌! Postgresql v10 지원.  Google BigQuery의 분산 병렬쿼리 엔진인 Deremel 을 참조하여 구현됨. (개인적으로는 가장 나이스해 보입니다.)
  • Postgres-XL : 2014년부터 출시되어 많은 유저가 있다. (선택 : 팀에서 원해서)

Postgres-XL은?

Alt text

  • Postgres-XL은 단독 서버에서 실행되는 Postgresql DB을 여러 노드에 분산 배치하고, 병렬처리가 가능하게 함으로써 대용량의  데이터를 저장, 처리할 수 있는 오픈소스 솔루션입니다.
  • 이 솔루션은 TransLattice에서(Geographically Distributed Database 솔루션 회사) 2014 5월 중순에 출시했습니다. Postgres-XL은 PostgresSQL을 확장가능한 구조로 변경한 대규모 병렬처리 데이터베이스 입니다. Postgres-XL의 핵심 기능에는 OLTP 쓰기 확장성, 대규모 병렬 처리(MPP), 클러스터 와이드 ACID(원자성, 일관성, 격리, 내구성)속성 및 multi-tenant 보안이 있습니다.

주요 구성요소

1. Global Transaction Monitor (GTM)
글로벌 트랜잭션 모니터는 클러스터 전반의 트랜잭션 일관성을 보장합니다. GTM은 다중 버전 동시성 제어 (Multi-version Concurrency Control)의 일환으로 트랜잭션 ID와 Snap-shot을 발행합니다.

클러스터는 가용성을 향상시키기 위해 선택적으로 GTM Standby로 구성 될 수도 있습니다.

또한 GTM과의 통신량을 줄이고 확장성을 향상시키기 위하여 Coordinators에서 GTM 프록시를 구성 할 수도 있습니다.

2. Coordinator
Coordinator는 사용자 세션을 관리하고 GTM 및 Data Node와 상호작용합니다. Coordinator는 쿼리들을 파싱하고 플래닝하며 일련의 글로벌 플랜을 명령문에 포함 된 구성요소로 보냅니다.

3. Data Node
Data Node는 실제 데이터가 저장되는 곳입니다. 데이터의 분배는 DBA가 구성 할 수 있습니다. 향상된 가용성을 위해 데이터 노드의 warm standby를 failover-ready로 설정할 수 있습니다.

Alt text

 

왜? 윈도우즈 기반의 Docker 인가요?

처음에는, Postgresql DB기반의 클러스터링 기능이 제공되는 go로 작성 된 Cockroach DB를 설치하여 사용하였는데,  1억건 미만의 Join 중 Crash가 발생하여 사용할 수 없는 상황에 이르게 되었습니다. 시스템 메세지에도 남지 않고, 오직 Stacktrace 가 10줄정도 남기면서 종료되는 상황에, 디버깅 옵션으로 빌드해서 면밀이 검토해야겠다는 숙제를 안고, 빠르게 대체가 가능한 솔루션을 찾아봐야 하는 상황이 되었습니다.

주말 늦게 개발 서버군에 설치하다가 실패하고, 일정의 압박과 해결이 안되는건 집요하게 물고늘어지는 본인의 성격으로 당일 밤 잠을 못이루고, 토요일 새벽에 집에서라도 설치를 해야겠다는 생각으로 윈도우즈 기반의 Docker 에서 설치를 수행해 보았습니다.

Prepare windows’s docker

지금부터는 Postgres-XL를 Docker 기반으로 실행하는 방법에 대해 살펴 보겠습니다.

다음 명령어를 통하여 docker 컨테이너를 하나 생성합니다.

여기서 두가지 옵션에 주목해야 하는데,
호스트OS의 기능을 사용할 수 있게 하는 “privileged”와  시스템 프로세스를 관리할수 있는 “/sbin/init” 옵션입니다.

Download Postgres-XL

이제, 컨테이너 내부에서 Postgres-XL 소스를 다운로드 하고, 빌드 후 설치를 진행합니다.

빌드는 postgres-xl 과 pgxc_ctl 두 가지를 각각 수행합니다.

vi /etc/bashrc

실행되는데 필요한 환경변수를 추가합니다.

pgxl configuration

Postgres-XL을 위한 설정파일을 정의하고 생성 합니다.
프로세스를 실행하는 계정은 postgres 입니다.

설정파일에 다음과 같이 필수적인 옵션이 있습니다.

[pgxc_ctl.conf 중요 옵션]
– max_connections = 100 # 커넥션 허용 가능 개수
설정하지 않으면 pgxc_ctl init 시 오류가 발생합니다.

[pg_hba.conf.sample 중요 옵션]
– host    all             all             0.0.0.0/0            password   #remote 접속 허용
설정하지 않으면, pgxc_init 시 리모트로 각 구성요소 DB에 접속하여 스키마와 초기 데이터를 생성하게 될 때, 오류가 발생합니다.

 

switch user – postgres

이제 프로세스를 실행하는 postgres 계정으로 원격 접속이 원할 하도록, 모든 노드에 ssh-copy-id 실행해줍니다.

압축하여 모든 노드에 복사

설정파일까지 생성이 완료된 Postgres-XL을 압축하여 모든 노드에 복사합니다.
현재의 시나리오(컨테이너 하나)에서는 복사 하는 과정을 건너뜁니다.

pgxc init

클러스터를 관리하는 명령어 pgxc_ctl를 통하여 Postgres-XL 이 동작할 수 있도록 구성요소들을 초기화 합니다.

추가 명령어

pgxl process status monitoring

pgxc_ctl 명령어로 모니터링을 수행해 봅니다. Running: 으로 표시되는 것을 볼 수 있습니다.

test DB를 통한 쿼리 수행

이제 쿼리를 수행해 봅니다.
쿼리는 cordinator port 5432 접속하여 수행합니다.

쿼리 수행을 위한 test db를 생성합니다.

– 권고사항

  1. db 명과, user 은 소문자를 사용합니다. pgxc_ctl 로는 생성되나,  psql  콘솔로는 대문자도 모두 소문자 처리되어 대문자로 된 db와 user 삭제가 안되는 상황에 처하게 됩니다.
  2. coordi 는 2대 이상, datanode 는 4대 이상으로, gtm 의 부하가 높을 때는 gtm proxy 를 두고 사용합니다.

실제로 사용할 DB와 USER를 생성

 분산 테이블 / 복제 테이블 생성

분산 테이블 생성은 create 문 마지막에 “DISTRIBUTE BY HASH” 라는 구문으로 정의하며 해싱키로 site_id 라는 PK를 지정해줍니다.

복제 테이블 생성은 create 문 마지막에 “DISTRIBUTE BY REPLICATION” 라는 구문으로 정의합니다.

Reference Architecture

아래 그림은 GTM Master외에 GTM Proxy를 배치하여 GTM의 부하를 분산하는 아키텍처 입니다.

* 9.5 –> 9.6 변경사항

현재는 Postgres-XL이 9.5 기반이나 9.6에서는 쿼리를 병렬로 수행하여 성능이 향상됩니다.

Alt text

–>

Alt text

 

Reference

http://deepdive.stanford.edu/#what-is-deepdive
https://ruihaijiang.wordpress.com/2015/09/17/postgres-xl-installation-example-on-linux/
https://blog.2ndquadrant.com/testing-postgres-xl-with-dbt-3/
https://www.postgres-xl.org/https://www.slideshare.net/mason_s/postgres-xl-scaling

글쓴이

인터파크에서 빅데이터 플랫폼을 담당하고 있는 소프트웨어 엔지니어 전득진 입니다.