简介
Postgres-XL是一个横向扩展的开源数据库集群,具有足够的灵活性来处理不同的数据库工作负载。Postgres-XL的最终目标是提供横跨所有类型数据库工作负载的ACID一致性的数据库可伸缩性。
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
Postgres-XL主要组件
Postgres-XL由三个主要组件组成:GTM (Global Transaction Manager)、Coordinator和 Datanode。
GTM (Global Transaction Manager)
负责ACID,保证分布式数据库全局事务一致性。益于此,就算数据节点是分布的,但是你在主节点操作增删改查事务时,就如同只操作一个数据库一样简单。
GTM Standby
GTM的备节点,增加该备用节点。当GTM出现问题时,GTM Standby可以升级为GTM,保证集群正常工作。
GTM-Proxy
GTM需要与所有的Coordinators通信,为了降低压力,可以在每个Coordinator机器上部署一个GTM-Proxy。
Coordinator
负责处理每个来自Application的SQL任务,并且决定由哪个Datanode执行,然后将任务计划派发给相应的Datanode,根据需要收集结果返还给Application;
Datanode
负责存储表的数据和本地执行由Coordinator派发的SQL任务。
快速入门
模拟环境
本次的模拟环境使用的系统是centos7.2
hostname | IP | function |
gtm | 192.168.72.150 | gtm |
node1 | 192.168.72.151 | coordinator & datanode |
node2 | 192.168.72.152 | coordinator & datanode |
为方便测试,所有节点关闭防火墙和SELINUX
配置hosts
在所有节点添加以下解析:
# vim /etc/hosts
192.168.72.150 gtm
192.168.72.151 node1
192.168.72.152 node2
创建用户
在所有节点创建用户
useradd postgres
passwd postgres
ssh免密登录
#在gtm节点创建key
su postgres
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
#复制key到其它节点
scp ~/.ssh/authorized_keys postgres@node1:~/.ssh/
scp ~/.ssh/authorized_keys postgres@node2:~/.ssh/
安装postgres-xl
以下所有配置,在每个节点都需要运行
安装所需依赖包:
yum install -y flex bison readline-devel zlib-devel openjade docbook-style-dsssl gcc bzip2
安装postgres-xl
和pgxc_ctl
:
#下载解压
wget https://www.postgres-xl.org/downloads/postgres-xl-10alpha2.tar.bz2
tar -jxvf postgres-xl-10alpha2.tar.bz2
#安装
./configure --prefix=/home/postgres/pgxl/
make
make install
cd contrib/
make
make install
编辑环境变量
# vim ~/.bashrc
export PGHOME=/home/postgres/pgxl
export PGUSER=postgres
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH
运行生效:
source ~/.bashrc
配置群集
接下来,就要配置群集,在gtm节点,运行pgxc_ctl
,生成配置文件:
[postgres@gtm ~]$ pgxc_ctl
PGXC$ prepare config empty #生成一个空的配置文件/home/postgres/pgxc_ctl/pgxc_ctl.config
PGXC$ exit
修改配置文件
# vim ~/pgxc_ctl/pgxc_ctl.config
# 修改以下三项
pgxcInstallDir=$HOME/pgxl
pgxcOwner=postgres
dataDirRoot=$HOME/DATA/pgxl/nodes
# 添加以下配置
#===================================================
# gtm
gtmName=gtm
gtmMasterServer=gtm
gtmMasterPort=20001
gtmMasterDir=$dataDirRoot/gtm
#----End of reconfiguration -------------------------
#===================================================
# coordinator
coordNames=( coord1 coord2 )
coordMasterServers=( node1 node2 )
coordPorts=( 30001 30001 )
poolerPorts=( 30011 30011 )
coordPgHbaEntries=(0.0.0.0/0)
coordMasterDirs=( $dataDirRoot/coord_master.1 $dataDirRoot/coord_master.2 )
coordMaxWALSenders=( 5 5 )
coordSlave=n
coordSlaveServers=( none none )
coordSlavePorts=( none none )
coordSlavePoolerPorts=( none none )
coordSlaveDirs=( none none )
coordArchLogDirs=( none none )
coordSpecificExtraConfig=( none none )
coordSpecificExtraPgHba=( none none )
#----End of reconfiguration -------------------------
#===================================================
# database
datanodeNames=( dn1 dn2 )
datanodeMasterServers=( node1 node2 )
datanodePorts=( 40001 40001 )
datanodePoolerPorts=( 40011 40011 )
datanodePgHbaEntries=(0.0.0.0/0)
datanodeMasterDirs=( $dataDirRoot/dn_master.1 $dataDirRoot/dn_master.2 )
datanodeMasterWALDirs=( none none )
datanodeMaxWALSenders=( 5 5 )
datanodeSpecificExtraConfig=( none none )
datanodeSpecificExtraPgHba=( none none )
#----End of reconfiguration -------------------------
初始化所有配置:
[postgres@gtm ~]$ pgxc_ctl init all
查看运行状态:
[postgres@gtm ~]$ pgxc_ctl
PGXC$ monitor all
Running: gtm master
Running: coordinator master coord1
Running: coordinator master coord2
Running: datanode master dn1
Running: datanode master dn2
测试集群
连接安装了coordinator
节点的主机,创建数据库,查看同步情况。
# 在node1节点上
$ psql -p 30001 postgres
postgres=# CREATE DATABASE testdb;
CREATE DATABASE
postgres=# \q
#在node2节点,刚才创建的数据库是否同步过来
$ psql -p 30001 testdb
testdb=# SELECT * FROM pgxc_node;
node_name | node_type | node_port | node_host | nodeis_primary | nodeis_preferred | node_id
-----------+-----------+-----------+-----------+----------------+------------------+-------------
coord1 | C | 30001 | node1 | f | f | 1885696643
coord2 | C | 30001 | node2 | f | f | -1197102633
dn1 | D | 40001 | node1 | f | t | -560021589
dn2 | D | 40001 | node2 | f | f | 352366662
(4 rows)
可以看到,在node2节点上,已经把在node1创建的数据库同步过来。
参考链接:https://www.2ndquadrant.com/en/resources/postgres-xl/