第一部分
本文档以postgres-xl-9.5r1.6为例,安装集群环境(1GTM + 2CN + 2DN),不同版本安装步骤相似。
1.1 Postgres-XL官方文档
https://www.postgres-xl.org/documentation/intro-whatis-postgres-xl.html
1.2 Postgres-XL安装规划
操作系统版本:rhel7.6 Postgres-XL版本:postgres-xl-9.5r1.6
1.3 Postgres-XL组件简介
https://www.postgres-xl.org/documentation/intro-whatis-postgres-xl.html
GTM:全局事务管理器,确保群集范围内的事务一致性。 GTM负责发放事务ID和快照作为其多版本并发控制的一部分。 集群可以配置一个或多个备用GTM,以改进可用性。 集群可以在协调器间配置GTM代理, 可用于改善可扩展性,减少GTM的通信量。 GTM Proxy:GTM需要与所有的Coordinators通信,为了降低压力,可以在每个Coordinator机器上部署一个GTM Proxy。
Coordinator:协调员管理用户会话,并与GTM和数据节点进行交互。 协调员解析、查询计划,并给语句中的每一个组件发送下一个序列化的全局性计划。 为节省机器,通常此服务和数据节点部署在一起。
Data Node:数据节点是数据实际存储的地方。 数据的分布可以由DBA来配置。为了提高可用性,可以配置数据节点的热备以便进行故障转移准备。
总结:GTM是负责ACID的,保证分布式数据库全局事务一致性。得益于此,就算数据节点是分布的,但是在主节点操作增删改查事务时,就如同只操作一个数据库一样简单。 Coordinator是调度的,将操作指令发送到各个数据节点。 datanodes是数据节点,分布式存储数据。
第二部分
2.1 修改系统主机名
hostnamectl set-hostname 主机名
2.2 关闭防火墙
#关闭运行中的服务
systemctl stop firewalld
#关闭操作系统自启动
systemctl disable firewalld
#检查关闭情况
systemctl is-enabled firewalld
systemctl status firewalld | grep -i "Active"
2.2 关闭SELINUX
sed -i "s/SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
setenforce 0
getenforce
2.4 创建安装用户
useradd postgres
passwd postgres
2.5 上传安装包
下载地址:https://www.postgres-xl.org/download/
# 使用工具上传安装包(所有节点)
bzip2 -d postgres-xl-9.5r1.6.tar.bz2
tar xf postgres-xl-9.5r1.6.tar -C /home/postgres
2.6 配置环境变量
su – mongod
vim ~/.bashrc
export PGHOME=/home/pg/pgxl
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH
export PGUSER=postgres
export PGXC_CTL_HOME=/home/pg/pgxl/bin
source ~/.bash_profile
2.7 创建相应目录
#创建配置文件目录(所有节点)
mkdir -p /home/pg/pgxl
mkdir -p /home/pg/pgxc/nodes
mkdir -p /home/postgres/pgxc/conf
2.8 编译安装数据库
#安装系统依赖(所有节点)
yum install -y flex bison readline-devel zlib-devel openjade docbook-style-dsssl gcc
cd /home/postgresql/postgres-xl-9.5r1.6
./configure --prefix=/home/postgresql/pgxl
make -j4
make install
cd /home/postgresql/postgres-xl-9.5r1.6/contrib
make -j4
make install
2.9 配置用户免密登录
#所有节点执行
su - postgresql
ssh-keygen -t rsa
ssh-copy-id server1
ssh-copy-id server2
ssh-copy-id server3
ssh-copy-id server4
2.10 创建集群配置文件模板
#若需要生成模板文件,可执行 pgxc_ctl,输入PREPARE可获取模板文件
cat > /home/postgres/pgxc/conf/pgxc_ctl.conf <<EOF
#!/usr/bin/env bash
######################### 基本信息 #########################
pgxcInstallDir=$HOME/pgxl
pgxcOwner=$USER
pgxcUser=$pgxcOwner
tmpDir=/tmp
localTmpDir=$tmpDir
configBackup=n
configBackupHost=pgxc-linker
configBackupDir=$HOME/pgxc
configBackupFile=pgxc_ctl.bak
######################### GTM #########################
gtmName=gtm
gtmMasterServer=server1
gtmMasterPort=20001
gtmMasterDir=$HOME/pgxc/nodes/gtm
gtmExtraConfig=none
gtmMasterSpecificExtraConfig=none
gtmSlave=n
gtmSlaveName=gtmSlave
gtmSlaveServer=server1_bak
gtmSlavePort=20001
gtmSlaveDir=$HOME/pgxc/nodes/gtm
gtmSlaveSpecificExtraConfig=none
####################### GTM Proxy #######################
gtmProxyDir=$HOME/pgxc/nodes/gtm_pxy
gtmProxy=y
gtmProxyNames=(gtm_pxy1 gtm_pxy2)
gtmProxyServers=(server2 server3)
gtmProxyPorts=(20001 20001)
gtmProxyDirs=($gtmProxyDir $gtmProxyDir) # Not used if it is not configured.
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=(5432 5432)
poolerPorts=(20010 20010)
coordPgHbaEntries=(192.168.56.0/24)
coordMasterServers=(server2 server3)
coordMasterDirs=($coordMasterDir $coordMasterDir)
coordMaxWALsernder=5
coordMaxWALSenders=($coordMaxWALsernder $coordMaxWALsernder)
coordSlave=n
coordSlaveSync=y
coordSlaveServers=(server3 server2)
coordSlavePorts=(20004 20005 20004 20005)
coordSlavePoolerPorts=(20010 20011 20010 20011)
coordSlaveDirs=($coordSlaveDir $coordSlaveDir $coordSlaveDir $coordSlaveDir)
coordArchLogDirs=($coordArchLogDir $coordArchLogDir $coordArchLogDir $coordArchLogDir)
coordExtraConfig=coordExtraConfig
cat > $coordExtraConfig <<EOF
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
listen_addresses = '*'
max_connections = 100
EOF
coordSpecificExtraConfig=(none none)
coordExtraPgHba=none
coordSpecificExtraPgHba=(none none)
coordAdditionalSlaves=n
coordAdditionalSlaveSet=(cad1)
cad1_Sync=n
cad1_Servers=(server2 server3)
cad1_dir=$HOME/pgxc/nodes/coord_slave_cad1
cad1_Dirs=($cad1_dir $cad1_dir)
cad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1
cad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir)
######################### 数据节点 #########################
datanodeMasterDir=$HOME/pgxc/nodes/dn_master
datanodeSlaveDir=$HOME/pgxc/nodes/dn_slave
datanodeArchLogDir=$HOME/pgxc/nodes/datanode_archlog
primaryDatanode=datanode1
datanodeNames=(datanode1 datanode2)
datanodePorts=(20008 2008)
datanodePoolerPorts=(20012 20012)
datanodePgHbaEntries=(192.168.56.0/24)
datanodeMasterServers=(server2 server3)
datanodeMasterDirs=($datanodeMasterDir $datanodeMasterDir)
datanodeMaxWalSender=5
datanodeMaxWALSenders=($datanodeMaxWalSender $datanodeMaxWalSender)
datanodeSlave=n
datanodeSlaveServers=(server3 server2)
datanodeSlavePorts=(20008 20008)
datanodeSlavePoolerPorts=(20012 20012)
datanodeSlaveSync=y
datanodeSlaveDirs=($datanodeSlaveDir $datanodeSlaveDir)
datanodeArchLogDirs=( $datanodeArchLogDir $datanodeArchLogDir)
datanodeExtraConfig=none
datanodeSpecificExtraConfig=(none none)
datanodeExtraPgHba=none
datanodeSpecificExtraPgHba=(none none)
datanodeAdditionalSlaves=n
walArchive=n
walArchiveSet=(war1 war2)
war1_source=(master)
wal1_source=(slave)
wal1_source=(additiona_coordinator_slave_set)
war1_host=server2
war1_backupdir=$HOME/pgxc/backup_war1
wal2_source=(master)
war2_host=server3
war2_backupdir=$HOME/pgxc/backup_war2
EOF
2.11 启动Postgres-XL服务
2.11.1. 初始化Postgresql-XL
pgxc_ctl -c /home/postgres/pgxc/conf/pgxc_ctl.conf init all
2.11.2. 停止Postgresql-XL服务
pgxc_ctl -c /home/postgres/pgxc/conf/pgxc_ctl.conf stop all
2.11.3. 启动Postgresql-XL服务
pgxc_ctl -c /home/postgres/pgxc/conf/pgxc_ctl.conf stop all
2.12 测试Postgresql连接
#连接协调节点
psql -h 192.168.56.112 --port=5432 -U postgres -d postgres
2.13 Postgres-XL使用测试
2.13.1. 创建replication表
create table repltab (id int, value text) distribute by replication;
#创建distribute表
create table disttab (id int, value text) distribute by hash(id);
#创建测试数据
#随机产生150W条数据,插入reptab表
insert into repltab(id, value)
select n, md5(random()::text) from generate_series(1, 1500000) n;
#随机产生150W条数据,插入disttab表
insert into disttab(id, value)
select n, md5(random()::text) from generate_series(1, 1500000) n;
2.13.2. 查看分片表的数据分布情况
postgres=# select xc_node_id, count(*) from repltab group by xc_node_id;
xc_node_id | count
------------+---------
888802358 | 1500000
postgres=# select xc_node_id, count(*) from disttab group by xc_node_id;
xc_node_id | count
------------+--------
888802358 | 751007
-905831925 | 748993
#replication表即复制表,表的内容在每个节点完全相同
#distribute表即分片表,按照分片规则,数据会被分配到不同的数据节点中,通过协调节点查询完整的数据集合。
2.13.3. 不同的抽样方式对照
#system抽样方法
explain analyze select * from disttab tablesample system(1);
#bernoulli抽样方法
explain analyze select * from disttab tablesample Bernoulli(1);
|