阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

基于Postgres-XL的MPP分布式方案

199次阅读
没有评论

共计 9308 个字符,预计需要花费 24 分钟才能阅读完成。

1 简介

Postgres-XL 全称为 Postgres eXtensible Lattice,是一个横向扩展的开源数据库集群,是 TransLattice 公司及其收购数据库技术公司 StormDB 的产品。

Postgres-XC 更适合 oltp 型应用。

Postgres-XL 基于 Postgres-XC,更适合 olap 型应用。

1.1 功能特性

license:Mozilla PublicLicense 许可,允许将开源代码与闭源代码混在一起使用。

完全的 ACID 支持。

可横向扩展的关系型数据库(RDBMS)。

支持 OLAP 应用,采用 MPP(Massively Parallel Processing 大规模并行处理系统)架构模式。

支持 OLTP 应用,读写性能可扩展。

集群级别的 ACID 特性。

多租户安全。

支持分布式 Key-Value 存储、支持 JSON 和 XML 格式。

事务处理与数据分析处理混合型数据库。

支持丰富的 SQL 语句类型,如关联子查询。

支持绝大部分 PostgreSQL 的 SQL 语句。

分布式多版本并发控制(MVCC:Multi-version Concurrency Control)。

支持所有支持 PostgresSQL 类型的驱动 JDBC, ODBC, OLE DB,Python,Ruby,perl DBI,Tcl。

1.2 功能不足

需要使用外部机制实现高可用,如 pg 流复制、Corosync/Pacemaker 等。

增删节点 / 重新分片数据(re-shard)的比较复杂。

数据重分布(redistribution)期间会锁表。

某些外键、唯一性约束功能欠缺。

2Postgres-XL 架构

基于 Postgres-XL 的 MPP 分布式方案

 

由 GTM、GTM-Proxy、Coordinator、Datanode 组成。

    GTM(Gloable Transaction Manager)负责提供事务的 ACID 属性;

    Datanode 负责存储表的数据和本地执行由 Coordinator 派发的 SQL 任务;

    Coordinator 负责处理每个来自 Application 的 SQL 任务,并且决定由哪个 Datanode 执行,然后将任务计划派发给相应的 Datanode,根据需要收集结果返还给 Application;

    GTM 通常由一台独立的服务器承担,GTM 需要处理来自所有 GTM-Proxy 或者 Coordinator 和 Datanode 的事务请求。

     每台机器最好同时配置一个 Coordinator、一个 Datanode 与 GTM-Proxy。

     每台机器同时配置一个 Coordinator 和一个 Datanode,可以负载均衡,同时降低网络流量。GTM-Proxy 会减少 GTM 的负载,将 Coordinator 和 Datanode 上进程的请求和响应聚集到一台机器上,同时会帮助处理 GTM 失效的情况。

     GTM 可能会发生单点故障,可以配置一个 GTM-Standby 节点作为 GTM 的备用节点。

2.1 协调器(Coordinator)

处理客户端连接。

分析查询语句,生成执行计划,并将计划传递给数据节点实际执行。

对数据节点返回的查询中间结果集执行最后处理。

管理事务两阶段提交(2PC)。

存储全局目录(GlobalCatalog)信息。

2.2 数据节点(DataNode)

实际存储表和索引数据,数据自动打散分布 (或者复制) 到集群中各数据节点。

只有协调器连接到数据节点才能可读写。

执行协调器下传的查询,一个查询在所有相关节点上并行查询。

两个数据节点间可建立一对一通讯连接,交换分布式表关联查询的相关信息。

2.3 全局事务管理器(GTM)

全局事务管理器(GTM:Global Transaction Manager)

全集群只有一个 GTM 节点,会有单点故障问题,可以配置 StranBy 热备节点保证高可用。

通过部署 GTM Proxy,解决 GTM 性能瓶颈。

提供事务间一致性视图。

处理必须的 MVCC 任务:

     transaction IDs 事务 ID。

     snapshots 数据快照,MVCC 使用。

管理全局性数据值:

     timestamps 时间戳。

     sequences 序列对象。

2.4GTM Proxy

基于 Postgres-XL 的 MPP 分布式方案

 

Ø  与协调器(Coordinator)和数据节点(DataNode)在一起运行。

Ø  协调器、数据节点直接与 GTM Proxy 交互替代 GTM,它做为后端与 GTM 间的中间人。

Ø  将对 GTM 的请求分组归集,多个请求一次提交给 GTM。

Ø  获取 transaction ids(XIDs)范围。

Ø  获取数据快照。

2.5 数据分布

 

数据分布有两种模式:复制表(Replicated Table)与分布表(Distributed Table)

复制表(Replicated Table):每行记录复制到集群中所有的数据节点,每节点一份。

分布表(DistributedTable):记录分片存在不同节点,可用的分片策略方式 Hash、Round Robin、Modulo。

2.6高可用性

全局事务管理器采用热备方式。

多个协调器间负载均衡。

数据节点使用流复制,复制数据到备节点。

 

3 安装搭建 Postgres-XL

3.1 环境列表

操作系统:CentOS6.5

postgres-xl 版本:postgres-xl-9.5r1.3.tar.g

主机名

ip

角色

用户

pgxlmaster

192.168.204.197

GTM

postgres

pgxlnode1

192.168.204.198

Coordinator、Datanode 与 GTM-Proxy

postgres

Pgxlnode2

192.168.204.199

Coordinator、Datanode 与 GTM-Proxy

postgres

下载:http://www.postgres-xl.org/download/

资料:http://postgres-xc.sourceforge.net/docs/1_1/pgxc-ctl.html 

            http://files.postgres-xl.org/documentation/install-short.html

3.2 设置操作系统环境准备(root 用户在 pgxlmaster 操作)

 

– 配置主机名

hostname 

vi  /etc/sysconfig/network

vi  /etc/hosts

192.168.204.197  pgxlmaster

192.168.204.198  pgxlnode1

192.168.204.199  pgxlnode2

– 设置防火墙

chkconfig iptablesoff

service iptables off

– 创建用户

useradd  postgres

passwd  postgres

– 安装相关编译 pgxl 依赖包(我这里)

ncurses-devel

readline-devel

zlib-devel

flex

3.3 解压至规划目录

mkdik  -p  /pgxl

mkdik  -p  /pgsolf

拷贝 postgres-xl-9.5r1.3.tar.gz 至 /pgsolf

chown    -R  postgres:postgres  /pgxl

chown    -R  postgres:postgres  /pgsolf

tar -zxvf /pgsolf/postgres-xl-9.5r1.3.tar.gz   -C    /pgsolf/

3.4 编译安装

cd  /pgsolf/ postgres-xl-9.5r1.3

./configure –prefix=/pgxl 

make 

make install

 

3.5 配置环境变量

vi  /home/postgres/.bash_profile 或者 vi  .bashrc

export PGUSER=postgres

export PGHOME=/pgxl

export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH

export PATH=$HOME/bin:$PGHOME/bin:$PATH

3.6 在 pgxlnode1、pgxlnode1 同样如上操作

3.7 在 pgxlmaster 配置 ssh 免密码到 pgxlnode1、pgxlnode1 认证

 

postgres 用户执行:

ssh-keygen -t rsa

cd  /home/postgres/.ssh/

catid_rsa.pub>> authorized_keys

root 用户执行:chmod  600 /home/postgres/.ssh/authorized_keys

postgres 用户执行:

scp /home/postgres/.ssh/authorized_keys postgres@pgxlnode1:/home/postgres/.ssh/
scp /home/postgres/.ssh/authorized_keys postgres@pgxlnode2:/home/postgres/.ssh/

3.8 在 gtm 主机;即 pgxlmaster 执行安装工具 pgxc_ctl

cd  /pgsolf/postgres-xl-9.5r1.3/contrib

make 

make install

3.9 在 pgxlmaster 主机配置集群

在 /pgxl/bin 命令执行 pgxc_ctl

PGXC 工具中执行 prepare 会在 /home/postgres/pgxc_ctl 下生成 pgxc_ctl.conf

配置修改 pgxc_ctl.conf 文件(重点关注黄色部分,其他默认即可)

#!/usr/bin/env bash

pgxcInstallDir=$HOME/pgxc

pgxcOwner=$USER

pgxcUser=$pgxcOwner   

tmpDir=/tmp           

localTmpDir=$tmpDir

configBackup=n                 

configBackupHost=pgxc-linker   

configBackupDir=$HOME/pgxc     

configBackupFile=pgxc_ctl.bak 

#—- GTM

#—- GTM Master ———————————————–

gtmName=gtm

gtmMasterServer=pgxlmaster

gtmMasterPort=20001

gtmMasterDir=$HOME/pgxc/nodes/gtm

#—- Configuration —

gtmExtraConfig=none       

gtmMasterSpecificExtraConfig=none 

#—- GTM Slave ———————————————–

gtmSlave=n              #是否启用 gtmSlave

gtmSlaveName=gtmSlave

gtmSlaveServer=pgxlnode1       

gtmSlavePort=20002         

gtmSlaveDir=$HOME/pgxc/nodes/gtm   

#—- GTM Proxy

gtmProxyDir=$HOME/pgxc/nodes/gtm_pxy

gtmProxy=y                  #是否启用 gtmProxy                 

gtmProxyNames=(gtm_pxy1 gtm_pxy2) 

gtmProxyServers=(pgxlnode1 pgxlnode2)         

gtmProxyPorts=(20001  20001)               

gtmProxyDirs=($gtmProxyDir $gtmProxyDir)   

#—- Configuration —-

gtmPxyExtraConfig=none 

gtmPxySpecificExtraConfig=(none none)

coordMasterDir=$HOME/pgxc/nodes/coord

coordSlaveDir=$HOME/pgxc/nodes/coord_slave

coordArchLogDir=$HOME/pgxc/nodes/coord_archlog

coordNames=(coord1 coord2)          # 名称

coordPorts=(20004 20005)            # 端口

poolerPorts=(20010 20011)          # Master pooler ports

coordPgHbaEntries=(192.168.204.0/24)                                       

#coordPgHbaEntries=(::1/128)   

#—- Master ————-

coordMasterServers=(pgxlnode1  pgxlnode2)      #主机名

coordMasterDirs=($coordMasterDir $coordMasterDir)

coordMaxWALsernder=0    # needed to configure slave. If zero value is specified,

coordMaxWALSenders=($coordMaxWALsernder  $coordMaxWALsernder)

#—- Slave ————-

coordSlave=n            # 是否启用协调 coordSlave

coordSlaveSync=y       

coordSlaveServers=(node07 node08 node09 node06)       

coordSlavePorts=(20004 20005 20004 20005)         

coordSlavePoolerPorts=(20010 20011 20010 20011)   

coordSlaveDirs=($coordSlaveDir $coordSlaveDir $coordSlaveDir $coordSlaveDir)

coordArchLogDirs=($coordArchLogDir $coordArchLogDir $coordArchLogDir $coordArchLogDir)

cat > $coordExtraConfig <<EOF

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

# Added to all the coordinator postgresql.conf

# Original: $coordExtraConfig

log_destination = ‘stderr’

logging_collector = on

log_directory = ‘pg_log’

listen_addresses = ‘*’

max_connections = 100

EOF

coordSpecificExtraConfig=(none none)

coordExtraPgHba=none   

coordSpecificExtraPgHba=(none none)

#—– Additional Slaves —–

coordAdditionalSlaves=n   

coordAdditionalSlaveSet=(cad1)                                             

# configured

cad1_Sync=n     

cad1_Servers=(node08 node09 node06 node07) 

cad1_dir=$HOME/pgxc/nodes/coord_slave_cad1

cad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir)

cad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1

cad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir)

#—- Datanodes

datanodeMasterDir=$HOME/pgxc/nodes/dn_master

datanodeSlaveDir=$HOME/pgxc/nodes/dn_slave

datanodeArchLogDir=$HOME/pgxc/nodes/datanode_archlog

primaryDatanode=datanode1              # Primary Node.

datanodeNames=(datanode1 datanode2)

datanodePorts=(20008 20009)    # Master ports

datanodePoolerPorts=(20012 20013)  # Master pooler ports

datanodePgHbaEntries=(192.168.204.0/24)                                   

#—- Master —————-

datanodeMasterServers=(pgxlnode1 pgxlnode2)

datanodeMasterDirs=($datanodeMasterDir  $datanodeMasterDir)

datanodeMaxWalSender=0                             

datanodeMaxWALSenders=($datanodeMaxWalSender $datanodeMaxWalSender)

#—- Slave —————–

datanodeSlave=n    #是否启用 datanodeSlave                         

datanodeSlaveServers=(node07 node08 node09 node06) 

datanodeSlavePorts=(20008 20009 20008 20009)   

datanodeSlavePoolerPorts=(20012 20013 20012 20013)

datanodeSlaveSync=y   

datanodeSlaveDirs=($datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir)

datanodeArchLogDirs=($datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir)

# —- Configuration files —

datanodeExtraConfig=none   

datanodeSpecificExtraConfig=(none none)

datanodeExtraPgHba=none   

datanodeSpecificExtraPgHba=(none none)

#—– Additional Slaves —–

datanodeAdditionalSlaves=n 

# datanodeAdditionalSlaveSet=(dad1 dad2)       

# configured

# dad1_Sync=n                                     

# dad1_Servers=(node08 node09 node06 node07)   

# dad1_dir=$HOME/pgxc/nodes/coord_slave_cad1

# dad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir)

# dad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1

#dad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir)

#—- WAL archives

walArchive=n   

walArchiveSet=(war1 war2)

war1_source=(master)   

wal1_source=(slave)

wal1_source=(additiona_coordinator_slave_set additional_datanode_slave_set)

war1_host=node10   

war1_backupdir=$HOME/pgxc/backup_war1

wal2_source=(master)

war2_host=node11

war2_backupdir=$HOME/pgxc/backup_war2

#=============<< End of future extension demonistration >>

修改好之后

在 /pgxl/bin 命令执行 pgxc_ctl 后 PGXC 工具中执行

init all

等待初始化成功。

3.10 初步使用

stop|start  all

psql  -h (pgxlnode1 或者 pgxlnode2)  -p(20004 或者 20005)– 通过协调节点可读写

psql  -h (pgxlnode1 或者 pgxlnode2)  -p(20008 或者 20009)– 通过数据节点只可读

postgres=# select *from pgxc_node;

创建表语法

CREATE TABLEtest(…)

DISTRIBUTE BY

HASH(col)|MODULO(col)|ROUNDROBIN|REPLICATION

TONODE(nodename1,nodename2…)

如果 DISTRIBUTEBY 后面是 REPLICATION,则是复制模式,其余则是分片模式,HASH 指的是按照指定列的哈希值分布数据,MODULO 指的是按照指定列的取摩运算分布数据,ROUNDROBIN 指的是按照轮询的方式分布数据。TO NODE 指定了数据分布的节点范围,如果没有指定则默认所有数据节点参与数据分布。如果没有指定分布模式,即使用普通的 CREATE TABLE 语句,PGXL 会默认采用复制模式将数据复制到所有数据节点。

通过协调节点操作:

psql  -h  pgxlnode1  -p 20004

CREATE TABLE test(idint primary key, name varchar(10)) DISTRIBUTE BY HASH(id) TO NODE(datanode1,datanode2);

insert into testselect generate_series(1,1000),’lottu’||generate_series(1,1000);

postgres=#select  count(*)  from  test;

 count

——-

  1000

(1 row)

通过数据节点操作:

基于 Postgres-XL 的 MPP 分布式方案

基于 Postgres-XL 的 MPP 分布式方案

完成。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137238.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计9308字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中