일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- WebAuthn
- 앱스토어
- MSYS2
- SSL
- SSH
- otpkey
- 안드로이드
- OTP
- SWIFT
- 애플
- FIDO2
- SwiftUI
- 인증
- css
- albumbook
- appres
- apple
- openssl
- 2FA
- MYSQL
- Xcode
- MFA
- 앨범북
- kmip
- OSX
- Android
- 앱리소스
- fido
- git
- Nodejs
- Today
- Total
인디노트
윈도우즈기반 도커에 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은?
- 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로 설정할 수 있습니다.
왜? 윈도우즈 기반의 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를 생성합니다.
- 권고사항
- db 명과, user 은 소문자를 사용합니다. pgxc_ctl 로는 생성되나, psql 콘솔로는 대문자도 모두 소문자 처리되어 대문자로 된 db와 user 삭제가 안되는 상황에 처하게 됩니다.
- 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에서는 쿼리를 병렬로 수행하여 성능이 향상됩니다.
-->
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
'개발 플랫폼 및 언어' 카테고리의 다른 글
CentOS 7 오래된 커널 손쉽게 지우기 (0) | 2018.12.31 |
---|---|
1.3. Creating a Postgres-XL cluster (0) | 2018.12.13 |
Set a Static IP Address in VMware Fusion 7 (0) | 2018.12.13 |
[CentOS] PostgreSQL 설치 (0) | 2018.12.12 |
pgxc_ctl.conf (0) | 2018.12.11 |