윈도우즈기반 도커에 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" 옵션입니다.

docker run -d --privileged --name pgxl centos7 /sbin/init

Download Postgres-XL

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

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

mkdir /svc/build/

cd /svc/build

git clone git://git.postgresql.org/git/postgres-xl.git

cd postgres-xl

./configure -prefix=/svc/pgxl

make -j 4

make install

cd contrib/pgxc_ctl

make install

cd /svc/pgxl

cp bin/pgxc_ctl ./

vi /etc/bashrc

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

export dataDirRoot=/data/pgxl/nodes

export PGXC_CTL_HOME=/svc/pgxl

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에 접속하여 스키마와 초기 데이터를 생성하게 될 때, 오류가 발생합니다.

export USER=postgres

# 사용자 추가

useradd $USER

# 패스워드 변경

passwd $USER

export TARGET_DIR=/svc/pgxl

export DATA_DIR=/data/pgxl/nodes

export LOG_DIR=/opt/log/pgxl

export USER_DB_PORT=5432

export MAX_USER_CONNECTIONS=300

export DATA_NODE_SHARED_BUFFERS="2000MB"

export DATA_NODE_WORK_MEM="128MB"

export DATA_NODE_MAINTENANCE_MEM="128MB"

export DATA_NODE_WAL_BUFFERS="16MB"

export DATA_NODE_CHECKPOINT_SEGMENTS="256"

mkdir -p $TARGET_DIR

mkdir -p $DATA_DIR

mkdir -p $LOG_DIR

chown -R postgres:postgres $TARGET_DIR

chown -R postgres:postgres $DATA_DIR

chown -R postgres:postgres $LOG_DIR

cat <<EOT > $TARGET_DIR/pgxc_ctl.conf

pgxcOwner=$USER

pgxcUser=\$pgxcOwner

tmpDir=/tmp/pgxl

localTmpDir=\$tmpDir

configBackup=n

pgxcInstallDir=$TARGET_DIR

gtmName=gtm

gtmMasterServer=localhost

gtmMasterPort=20001

gtmMasterDir=$DATA_DIR/gtm

gtmSlave=n

gtmProxy=n

coordMasterDirs=($DATA_DIR/coord)

coordNames=(coord)

coordMasterServers=(localhost)

coordPorts=($USER_DB_PORT)

poolerPorts=(20002)

coordMaxWALSenders=(5)

coordSlave=n

datanodeMasterDirs=($DATA_DIR/data1 $DATA_DIR/data2)

datanodeNames=(data1 data2)

datanodeMasterServers=(localhost localhost)

datanodePorts=(3001 3002)

datanodePoolerPorts=(4001 4002)

datanodeMaxWALSenders=(5 5)

datanodeSpecificExtraConfig=(none none)

datanodeSpecificExtraPgHba=(none none)

datanodeSlave=n

coordExtraConfig=coordExtraConfig

cat > \$coordExtraConfig <<EOF

#================================================

# Added to all the coordinator postgresql.conf

log_destination = 'stderr'

logging_collector = on

log_directory = $LOG_DIR

listen_addresses = '*'

log_filename = 'coordinator.log'

max_connections = $MAX_USER_CONNECTIONS

max_pool_size = $MAX_USER_CONNECTIONS

shared_buffers = $DATA_NODE_SHARED_BUFFERS

#checkpoint_segments = $DATA_NODE_CHECKPOINT_SEGMENTS

work_mem = $DATA_NODE_WORK_MEM

maintenance_work_mem = $DATA_NODE_MAINTENANCE_MEM

wal_buffers = $DATA_NODE_WAL_BUFFERS

EOF

datanodeExtraConfig=datanodeExtraConfig

cat > \$datanodeExtraConfig <<EOF

#================================================

# Added to all the datanode postgresql.conf

log_destination = 'stderr'

logging_collector = on

log_directory = $LOG_DIR

log_filename = 'datanode.log'

max_connections = $MAX_USER_CONNECTIONS

max_pool_size = $MAX_USER_CONNECTIONS

shared_buffers = $DATA_NODE_SHARED_BUFFERS

#checkpoint_segments = $DATA_NODE_CHECKPOINT_SEGMENTS

work_mem = $DATA_NODE_WORK_MEM

maintenance_work_mem = $DATA_NODE_MAINTENANCE_MEM

wal_buffers = $DATA_NODE_WAL_BUFFERS

EOF

EOT

tee /usr/lib/sysctl.d/50-pgxl.conf <<EOF

kernel.sem = 1000 32000 32 1000

# up to 400GB shared memory

kernel.shmmax = 429496729600

EOF

# ! 중요. 모든 노드에 리모드 접속 허용 설정

vi /svc/pgxl/share/postgresql/pg_hba.conf.sample

-------------------------------------------------------------------------

# remote all

host    all             all             0.0.0.0/0            password

#host    all             all             0.0.0.0/0            trust

-------------------------------------------------------------------------

# 기본 설정에서 변경하고 싶으신 경우 아래 *.conf.smaple 파일을 수정하면 됩니다.

./share/postgresql/gtm.conf.sample

./share/postgresql/gtm_proxy.conf.sample

./share/postgresql/pg_hba.conf.sample

./share/postgresql/pg_ident.conf.sample

./share/postgresql/pg_service.conf.sample

./share/postgresql/postgresql.conf.sample

./share/postgresql/psqlrc.sample

./share/postgresql/recovery.conf.sample

switch user - postgres

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

su - postgres

mkdir -p ~/.ssh

chmod 700 ~/.ssh

cd ~/.ssh

if [ ! -f id_rsa.pub ]; then

ssh-keygen -t rsa -N "" -f id_rsa

fi

cat id_rsa.pub >> authorized_keys

chmod 600 authorized_keys

압축하여 모든 노드에 복사

설정파일까지 생성이 완료된 Postgres-XL을 압축하여 모든 노드에 복사합니다.

현재의 시나리오(컨테이너 하나)에서는 복사 하는 과정을 건너뜁니다.

# postgres 유저로

cd /svc/

tar cvfz pgxl.tgz pgxl

# 여러 노드가 있다면...

# scp pgxl.tgz postgres@host2:/svc/

# scp pgxl.tgz postgres@host3:/svc/

# scp pgxl.tgz postgres@host4:/svc/

pgxc init

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

# postgres 유저로 수행

postgres@fcd727ce0bcf:/svc/pgxl:> pgxc_ctl init all

/bin/bash

Installing pgxc_ctl_bash script as /svc/pgxl/pgxc_ctl_bash.

Installing pgxc_ctl_bash script as /svc/pgxl/pgxc_ctl_bash.

Reading configuration using /svc/pgxl/pgxc_ctl_bash --home /svc/pgxl --configuration /svc/pgxl/pgxc_ctl.conf

Finished reading configuration.

******** PGXC_CTL START ***************

Current directory: /svc/pgxl

Initialize GTM master

The files belonging to this GTM system will be owned by user "postgres".

This user must also own the server process.

fixing permissions on existing directory /data/pgxl/nodes/gtm ... ok

creating configuration files ... ok

creating control file ... ok

Success.

waiting for server to shut down.... done

server stopped

Done.

Start GTM master

server starting

Initialize all the coordinator masters.

Initialize coordinator master coord.

The files belonging to this database system will be owned by user "postgres".

This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".

The default database encoding has accordingly been set to "UTF8".

The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /data/pgxl/nodes/coord ... ok

creating subdirectories ... ok

selecting default max_connections ... 100

selecting default shared_buffers ... 128MB

selecting dynamic shared memory implementation ... posix

creating configuration files ... ok

running bootstrap script ... ok

performing post-bootstrap initialization ... creating cluster information ... ok

syncing data to disk ... ok

freezing database template0 ... ok

freezing database template1 ... ok

freezing database postgres ... ok

WARNING: enabling "trust" authentication for local connections

You can change this by editing pg_hba.conf or using the option -A, or

--auth-local and --auth-host, the next time you run initdb.

Success.

Done.

Starting coordinator master.

Starting coordinator master coord

2017-11-05 09:00:51.353 UTC [8765] LOG: listening on IPv4 address "0.0.0.0", port 5432

2017-11-05 09:00:51.353 UTC [8765] LOG: listening on IPv6 address "::", port 5432

2017-11-05 09:00:51.397 UTC [8765] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"

2017-11-05 09:00:51.468 UTC [8765] LOG: redirecting log output to logging collector process

2017-11-05 09:00:51.468 UTC [8765] HINT: Future log output will appear in directory "logs".

Done.

Initialize all the datanode masters.

Initialize the datanode master data1.

Initialize the datanode master data2.

The files belonging to this database system will be owned by user "postgres".

This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".

The default database encoding has accordingly been set to "UTF8".

The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /data/pgxl/nodes/data1 ... ok

creating subdirectories ... ok

selecting default max_connections ... 100

selecting default shared_buffers ... 128MB

selecting dynamic shared memory implementation ... posix

creating configuration files ... ok

running bootstrap script ... ok

performing post-bootstrap initialization ... creating cluster information ... ok

syncing data to disk ... ok

freezing database template0 ... ok

freezing database template1 ... ok

freezing database postgres ... ok

WARNING: enabling "trust" authentication for local connections

You can change this by editing pg_hba.conf or using the option -A, or

--auth-local and --auth-host, the next time you run initdb.

Success.

The files belonging to this database system will be owned by user "postgres".

This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".

The default database encoding has accordingly been set to "UTF8".

The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /data/pgxl/nodes/data2 ... ok

creating subdirectories ... ok

selecting default max_connections ... 100

selecting default shared_buffers ... 128MB

selecting dynamic shared memory implementation ... posix

creating configuration files ... ok

running bootstrap script ... ok

performing post-bootstrap initialization ... creating cluster information ... ok

syncing data to disk ... ok

freezing database template0 ... ok

freezing database template1 ... ok

freezing database postgres ... ok

WARNING: enabling "trust" authentication for local connections

You can change this by editing pg_hba.conf or using the option -A, or

--auth-local and --auth-host, the next time you run initdb.

Success.

Done.

Starting all the datanode masters.

Starting datanode master data1.

Starting datanode master data2.

2017-11-05 09:00:57.122 UTC [9429] LOG: listening on IPv4 address "0.0.0.0", port 3001

2017-11-05 09:00:57.122 UTC [9429] LOG: listening on IPv6 address "::", port 3001

2017-11-05 09:00:57.210 UTC [9429] LOG: listening on Unix socket "/tmp/.s.PGSQL.3001"

2017-11-05 09:00:57.325 UTC [9429] LOG: redirecting log output to logging collector process

2017-11-05 09:00:57.325 UTC [9429] HINT: Future log output will appear in directory "logs".

2017-11-05 09:00:57.144 UTC [9441] LOG: listening on IPv4 address "0.0.0.0", port 3002

2017-11-05 09:00:57.144 UTC [9441] LOG: listening on IPv6 address "::", port 3002

2017-11-05 09:00:57.232 UTC [9441] LOG: listening on Unix socket "/tmp/.s.PGSQL.3002"

2017-11-05 09:00:57.355 UTC [9441] LOG: redirecting log output to logging collector process

2017-11-05 09:00:57.355 UTC [9441] HINT: Future log output will appear in directory "logs".

Done.

ALTER NODE coord WITH (HOST='localhost', PORT=5432);

ALTER NODE

CREATE NODE data1 WITH (TYPE='datanode', HOST='localhost', PORT=3001, PREFERRED);

CREATE NODE

CREATE NODE data2 WITH (TYPE='datanode', HOST='localhost', PORT=3002, PREFERRED);

CREATE NODE

SELECT pgxc_pool_reload();

pgxc_pool_reload

------------------

t

(1 row)

Done.

EXECUTE DIRECT ON (data1) 'CREATE NODE coord WITH (TYPE=''coordinator'', HOST=''localhost'', PORT=5432)';

EXECUTE DIRECT

EXECUTE DIRECT ON (data1) 'ALTER NODE data1 WITH (TYPE=''datanode'', HOST=''localhost'', PORT=3001, PREFERRED)';

EXECUTE DIRECT

EXECUTE DIRECT ON (data1) 'CREATE NODE data2 WITH (TYPE=''datanode'', HOST=''localhost'', PORT=3002, PREFERRED)';

EXECUTE DIRECT

EXECUTE DIRECT ON (data1) 'SELECT pgxc_pool_reload()';

pgxc_pool_reload

------------------

t

(1 row)

EXECUTE DIRECT ON (data2) 'CREATE NODE coord WITH (TYPE=''coordinator'', HOST=''localhost'', PORT=5432)';

EXECUTE DIRECT

EXECUTE DIRECT ON (data2) 'CREATE NODE data1 WITH (TYPE=''datanode'', HOST=''localhost'', PORT=3001, PREFERRED)';

EXECUTE DIRECT

EXECUTE DIRECT ON (data2) 'ALTER NODE data2 WITH (TYPE=''datanode'', HOST=''localhost'', PORT=3002, PREFERRED)';

EXECUTE DIRECT

EXECUTE DIRECT ON (data2) 'SELECT pgxc_pool_reload()';

pgxc_pool_reload

------------------

t

(1 row)

Done.

추가 명령어

# 구성요소의 동작상태 점검

pgxc_ctl monitor all

# 구성요소 프로세스 모두 stop

pgxc_ctl stop all

# 구성요소 모두 제거

pgxc_ctl remove all

# help 명령어를 잊지마세요

pgxc_ctl help

pgxl process status monitoring

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

postgres@fcd727ce0bcf:/svc/pgxl:> pgxc_ctl monitor all

/bin/bash

Installing pgxc_ctl_bash script as /svc/pgxl/pgxc_ctl_bash.

Installing pgxc_ctl_bash script as /svc/pgxl/pgxc_ctl_bash.

Reading configuration using /svc/pgxl/pgxc_ctl_bash --home /svc/pgxl --configuration /svc/pgxl/pgxc_ctl.conf

Finished reading configuration.

******** PGXC_CTL START ***************

Current directory: /svc/pgxl

Running: gtm master

Running: coordinator master coord

Running: datanode master data1

Running: datanode master data2

test DB를 통한 쿼리 수행

이제 쿼리를 수행해 봅니다.

쿼리는 cordinator port 5432 접속하여 수행합니다.

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

- 권고사항

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

pgxc_ctl

> Createdb test

# coord1 호스트에서 수행 (insert)

$ psql test -p 5432

test=# create table contact( id int, name text, phone varchar(30)) DISTRIBUTE BY REPLICATION;

test=# insert into contact values ( 1,’tom’,’1212121′);

test=# select * from contact;

# datanode1 호스트에서 수행 (select)

$ psql test -p 3001

select * from contact;

# datanode2 호스트에서 수행 (select)

$ psql test -p 3002

select * from contact;

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

# CREATE DATABASE 

pgxc_ctl

> Createdb data

Selected coord.

# user는 시스템에서 강제로 소문자 변경되어 생성 됨

> Createuser big -d -l -r -s --replication

Selected coord.

# password 수정

psql data -h localhost -p 5432 -U big

> ALTER USER big WITH PASSWORD 'data';

> ALTER DATABASE data OWNER TO big;

# 유저를 삭제 할때

> dropuser big

================================================================================================

> bin/dropuser -h localhost -p 5432 -i

Enter name of role to drop: big

Role "big" will be permanently removed.

Are you sure? (y/n) y

# big 계정에 Bypass RLS 속성도 부여한다

> psql data -h localhost -p 5432

# data Role에 부여된 속성

data=# \du

List of roles

Role name | Attributes | Member of

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

data | Superuser, Create role, Create DB, Replication | {}

postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

# postgres Role 과 동일하게 Bypass RLS 를 부여해 준다

data=# ALTER ROLE big WITH LOGIN CREATEDB CREATEROLE SUPERUSER REPLICATION BYPASSRLS;

data=# \du

List of roles

Role name | Attributes | Member of

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

data | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

# datanode1에 접속

psql data -h 180.70.98.177 -p 3001-U big

# datanode2에 접속

psql data -h 180.70.98.178 -p 3002 -U big

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

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

# 모든 datanode에 PK를 hashing key로 분산 저장한다.

create table site(

site_id INT PRIMARY KEY,

code text,

code_space TEXT,

code_version timestamp(0) without time zone,

geometry geometry,

valid_from timestamp(0) without time zone,

valid_to timestamp(0) without time zone,

begin_life_span_version timestamp(0) without time zone,

end_life_span_version timestamp(0) without time zone,

holding_id INT

) DISTRIBUTE BY HASH (site_id);

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

# 모든 datanode에 PK를 기준으로 복제하여 저장한다.

create table site(

site_id INT PRIMARY KEY,

code text,

code_space TEXT,

code_version timestamp(0) without time zone,

geometry geometry,

valid_from timestamp(0) without time zone,

valid_to timestamp(0) without time zone,

begin_life_span_version timestamp(0) without time zone,

end_life_span_version timestamp(0) without time zone,

holding_id INT

) DISTRIBUTE BY REPLICATION;

Reference Architecture

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

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

| GTM Master |

| Coordinator |

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

/ | \

/ | \

/ | \

/ | \

+-------------+ | +-------------+

| GTM Proxy1 | | GTM Proxy8 |

| Datanode1 |--------- ... ---------| Datanode8 |

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

* 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

글쓴이

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


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.