共计 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 架构
由 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
Ø 与协调器(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)
通过数据节点操作:
完成。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137238.htm