文所描述的Postgres-XC版本:v1.2.1
项目主页地址:http://sourceforge.net/projects/postgres-xc/

pdf文件下载:

Postgres-XC集群搭建.PDF

一、理解Postgres-XC集群架构
Postgres-XC是基于PostgreSQL的SHARED NOTHING的分布式关系型数据库集群,它可以管理和处理分布在多个不同主机上的海量数据。对于Postgres-XC来说,一个实例实际上是由多个独立的 PostgreSQL 实例组成,它们分布在不同的物理(或虚拟)主机上协同工作,呈现给用户的是一个数据库实例的效果。每一个Coordinator都可以作为Postgres-XC系统的访问入口,负责处理客户端的连接及 SQL 命令、协调系统中的其他Coordinator和Datanode工作,Datanode负责管理和处理用户数据,而GTM则遵循关系型数据库的ACID特性提供保障。
1、开始之前
在搭建Postgres-XC集群之前,我们需要先熟悉Postgres-XC的各组件。Postgres-XC由三个主要的组件组成,分别为GTM(Global Transaction Manager), Coordinator和Datanode。下面分别介绍这三个组件。
GTM提供事务一致性管理,遵循数据库的ACID要素;
Coordinator是应用程序的访问入口,它的行为类似传统的PostgreSQL的后端进程(backend process),无论何时,Coordinator不存储任何数据,只接收SQL语句,取得必要的全局事务ID(Global Transaction Id)和全局快照(Global Snapshot),决定SQL分发到哪一个Datanode去执行。
Datanode是实际存储和处理数据的地方。数据可以在Datanode之间分片保存,或每个Datanode保存一份副本。Datanode不具有对整个数据库的全局视图,它仅仅需要负责管理本地存储的数据。

2、如何部署
如果只为试用和理解如何配置、运行Postgres-XC,可以将Postgres-XC安装在一台服务器上,也可以在不同的虚拟机上安装不同的Postgres-XC组件。尽管可以将Postgres-XC Cluster安装在单节点的服务器上,但还是建议通过Virtual Box或VMWare安装在多台虚拟服务器上,服务器的数量取决于你的Postgres-XC配置。建议使用64bit操作系统,至少4GB内存。可以选择任意流行的Linux 64bit操作,开发团队的开发与测试在CentoOS 5.4平台.
最低硬件配置便可以用来测试Postgres-XC的功能。当然,如果你想更好的体验Postgres-XC如何扩展,我们建议您使用多台服务器搭建群集。

二、通过源码编译安装Postgres-XC
1、为OS安装Postgres-XC依赖的工具包和库
编译Postgres-XC需要GNU make version 3.80 或更高版本,编译器推荐使用GCC,也可以使用其他的ISO/ANSI C compiler (at least C89-compliant);其他的还有GNU Readline library及必要的库,例如如果需要Postgres-XC支持UUID,在编译时需要引入UUID的头文件及动态链接库。
安装所需包可以使用下面的命令一次性安装所有依赖包:
yum -y install gcc* libtool* libxml2-devel readline-devel flex bison crypto* perl-ExtUtils-Embed zlib-devel pam-devel libxslt-devel openldap-devel python-devel openssl-devel cmake

2、通过源码编译安装UUID(*可选)
这一步不是必须的,不需要UUID可以跳过。
在ossp下载OSSP-UUID:http://www.ossp.org/pkg/lib/uuid/,这里下载的是uuid-1.6.2,下载后解压、编译安装:./configure --prefix=/opt/ossp-uuid/ && make && make install
在编译PG-XC时不要忘记加上以下选项:
--with-ossp-uuid --with-libs=/opt/ossp-uuid/lib/ --with-includes=/opt/ossp-uuid/include/

3、编译源码并安装
下载Postgres-XC源码包并解压
http://sourceforge.net/projects/postgres-xc/
tar -xf pgxc-v1.2.1.tar.gz
解压之后,会在当前目录创建一个存放源码的postgres-xc-1.2.1目录,进入该目录开始后续的安装步骤。Configuration和Build的选项与PostgreSQL是一样的,可以完全参考传统的PostgreSQL的配置和安装步骤。
./configure --prefix=/opt/PostgreXC/1.2.1/ --with-perl --with-python --with-openssl --with-pam  --without-ldap --with-libxslt --with-libxml --with-ossp-uuid --with-libs=/opt/ossp-uuid/lib/ --with-includes=/opt/ossp-uuid/include/ && gmake && gmake install
需要卸载Postgres-XC可以执行gmake uninstall。

三、搭建Postgres-XC数据库集群
在每个集群节点执行安装操作,安装完毕后进行各节点的数据库实例化以及集群的配置。在本例中我们使用4台机器搭建Postgres-XC集群,集群中包括1个主的GTM(Master),1个备的GTM(Standby),2个GTM-Proxy,2个Coordinator,2个Datanode。

1、创建Postgres-XC的OS用户
adduser postgres -d /home/postgres
passwd postgres

2、实例化Coordinator和Datanode节点
首先在每个Coordinator和Datanode节点实例化数据库,在架构设计阶段需要我们确认使用多少个Coordinator和多少个Datanode,(官方文档推荐的)最佳实践是在哪里运行一个Datanode则在配置一个Coordinator。与传统的PostgreSQL一样,实例化数据库使用initdb命令,使用-D选项指定数据目录,可以通过设置环境变量PGDATA来简化使用。但如果将Coordinator和Datanode节点配置在同一台SERVER上,-D参数必须指定不同的目录,设置环境变量PGDATA便不方便了,同时它们的Port也需要是不同的。initdb的-D参数指定的数据目录如果不存在,会自动进行创建,所以需要注意运行initdb的用户有足够的权限在指定的数据目录创建所需目录。
在每台机器创建各个组件的工作目录,并修改属主为postgres用户
mkdir -p /db/pgsql/
chown -R postgres.postgres /db/pgsql/
需要注意initdb命令需要Postgre-XC用户执行,它的命令使用方式与PostgreSQL类似,不同的是需要指定当前实例化的节点的名称,节点名称通过nodename选项指定:
$ initdb -D $PGDATA --nodename foo
也可以使用pg_ctl命令来执行数据库实例化的动作,命令使用方法如下:
$ pg_ctl -D $PGDATA -o '--nodename foo' initdb
在实例化Coordinator和Datanode节点时,选项—nodename是必须的,如果不指定该选项,将会报出“Postgres-XC node name is mandatory”的错误。
下面分别在每个Coordinator和Datanode节点实例化数据
/opt/PostgreXC/1.2.1/bin/initdb -D /db/pgsql/data_coord(1...n) --nodename coord(1...n)
/opt/PostgreXC/1.2.1/bin/initdb -D /db/pgsql/data_datanode(1...n) --nodename datanode(1...n)

3、实例化GTM和GTM-Proxy节点
可以使用initgtm命令来实例化GTM或GTM-PROXY节点,initgtm有两个重要的参数,-D参数用来指定$PGDATA,-Z参数指定实例化节点的类型是GTM还是GTM-PROXY,它的值可以为gtm或gtm_proxy。
在GTM主机上实例化GTM节点
/opt/PostgreXC/1.2.1/bin/initgtm -Z gtm -D /db/pgsql/data_gtm
在GTM-Proxy主机上实例化GTM-Proxy节点
/opt/PostgreXC/1.2.1/bin/initgtm -Z gtm_proxy -D /db/pgsql/data_gtmproxy(1...n)

4、配置Datanode节点
在启动Coordinator和Datanode之前必须先对它们进行配置。在实例化节点时指定的数据目录中的postgresql.conf文件进行配置。Datanode几乎与原生的PostgreSQL加一些扩展是一样的,Postgres-XC对它进行修改和扩展的参数如下:
max_connections和max_prepared_transactions
这个值不能简单设置为每个Coordinator可以接受的最大连接数。因为每个Coordinator节点都有可能连接到不同的Datanode,所以应该将Datanode可接受的最大连接数配置为所有Coordinator节点可接受的最大连接数的总和,例如有3个Coordinator节点,每个Coordinator节点可接受最大100个并发连接,那这个值应该至少设置为300。在设置 max_connections 时,其依赖的参数max_prepared_transactions 参数也需要修改为max_connections相同的值。
pgxc_node_name
在GTM端需要识别每一个Datanode,pgxc_node_name为当前的Datanode指定一个唯一的标识。在initdb时选项--nodename指定的名称会自动写入配置文件;
gtm_port和gtm_host
这两个参数用来配置GTM或GTM-Proxy的端口和地址,GTM默认的端口为6666。
修改各个Datanode的postgresql.conf文件
vi /db/pgsql/data_datanode(1...n)/postgresql.conf
gtm_host = '192.168.100.11'
gtm_port = 6666
pgxc_node_name = 'datanode(1...n)'

5、配置Coordinator节点
max_connections和max_prepared_transactions
Coordinator节点的max_connections参数只需要考虑最大接受多少来自用户的连接,而不必考虑其他Coordinator节点和Datanode节点。max_prepared_transactions则至少设置为集群中Coordinator节点数量的总和,这与Datanode是不同的。下面是Coordinator特有的参数
max_pool_size和min_pool_size
像连接池一样,Coordinator维护着Coordinator到Datanodes的连接。因为每个事务都可能被所有的Datanode参与,这个参数应该至少设置为当前Coordinator的max_connections*集群中Datanode的值。min_pool_size设置Coordinator到远程节点的最小值,缺省值为1。
max_coordinators和max_datanodes
这两个参数用来显式指定集群中Coordinators和Datanodes的最大数量,它们的缺省值是16。如果不打算增加更多的Coordinators和Datanodes可以指定具体的值;如果需要动态的调整Coordinators和Datanodes的数量则指定足够大的值。
enforce_two_phase_commit
是否强制使用两阶段提交(Two-Phase Commit,2PC),它的缺省值是on。
修改各个Coordinator的postgresql.conf文件
vi /db/pgsql/data_coord(1...n)/postgresql.conf
gtm_host = '192.168.100.11'
gtm_port = 6666
pgxc_node_name = 'coord(1...n)'

6、配置GTM-Proxy节点
vi /db/pgsql/data_gtmproxy(1...n)/gtm_proxy.conf
nodename = 'gtm_proxy_(1...n)'
port = 6666
gtm_host = '192.168.100.10'
gtm_port = 6666

7、配置GTM的Standby节点
GTM是Postgres-XC集群中最重要的节点,在上述配置中,只存在一个单独的GTM节点,如果这个GTM节点宕掉,整个集群都会宕掉,所以必须避免GTM的单点故障。
实例化GTM节点的步骤同上,主要的区别在配置部分,修改gtm.conf文件:
vi /db/pgsql/data_gtm/gtm.conf
nodename = 'gtm'
listen_addresses = '*'
port = 6666
startup = STANDBY
active_host = '192.168.100.10'
active_port = 6666
其中active_host指定为GTM Master的主机名或地址,另外nodename的名称必须与GTM Master的名称一致。修改完配置之后启动GTM Standby即可,具体各种failover的情况以及如何promote Standby到Master,在后续的测试部分再详细描述。

8、启动数据库集群
需要注意启动和关闭Postgres-XC集群的顺序。
启动顺序为GTM->GTM-Proxy->Coordinators->Datanodes
关闭顺序为Coordinators->Datanodes-> GTM-Proxy->GTM
启动GTM和GTM Standby:
/opt/PostgreXC/1.2.1/bin/gtm_ctl start -Z gtm -D /db/pgsql/data_gtm/
启动各节点的GTM-Proxies:
/opt/PostgreXC/1.2.1/bin/gtm_ctl start -Z gtm_proxy -D /db/pgsql/data_gtmproxy(1...n)/
启动各节点的Datanodes:
/opt/PostgreXC/1.2.1/bin/pg_ctl start -Z datanode -D /db/pgsql/data_datanode(1...n)/
启动各节点的Coordinators
/opt/PostgreXC/1.2.1/bin/pg_ctl start -Z coordinator -D /db/pgsql/data_coord(1...n)/
启动和停止GTM(Proxy),Datanode,Coordinator推荐使用gtm_ctl和pg_ctl工具,他们可以有更多选项和精确的控制,例如在stop操作时指定SHUTDOWN MODE可以为smart、fast、immediate。
第一次启动Postgres-XC集群,必须为所有的Coordinator节点注册除本身节点之外的Coordinator节点以及所有的Datanode节点信息
/opt/PostgreXC/1.2.1/bin/psql -c "CREATE NODE coord(1...n) WITH (TYPE = 'coordinator', HOST = '192.168.100.12' , PORT = 5432)" postgres
/opt/PostgreXC/1.2.1/bin/psql -c "CREATE NODE datanode(1...n) WITH (TYPE = 'datanode', HOST = '192.168.100.11' , PORT = 15432)" postgres
配置完成在各Coordinator节点reload配置,这一步不是必须的。
/opt/PostgreXC/1.2.1/bin/psql -c "select pgxc_pool_reload();" postgres

9、查看集群中节点的信息
Postgres-XC的系统视图中提供了一组相对PostgreSQL专有的系统视图,pgxc_node保存了所有Coordinators和Datanodes节点的信息。通过psql工具连接上任意一台Coordinator查询可以看到所有Coordinators和Datanodes节点的信息。
/opt/PostgreXC/1.2.1/bin/psql -c "select * from pgxc_node;" postgres

四、集群中各节点的参数配置建议
Postgres-XC集群实际上是由多个PostgreSQL实例所组成。在实际的应用中,每个Coordinators和Datanodes节点拥有自己的全局参数配置文件,所以在配置这些参数时,可以按照传统PostgreSQL的调优方法进行调整。在新的机器上架前,可以先使用pgbench工具对单节点的服务器进行测试,确定一个比较合理的参数范围。需要注意一点的是,如果在一台物理机上同时部署了Coordinator和Datanode,那么他们之间资源的分配比例大概保持在数据库可用资源总量的30%和70%,根据各自可使用的资源再对单个节点参数进行调整。

[原创]Postgres-XC集群笔记-概念与环境搭建的更多相关文章

  1. 【原创】ApacheTomcat集群在Linux下的搭建步骤

    在RedHat5(以下简称RH)上搭建ApacheTomcat的集群环境,有以下步骤: 1.首先安装apr和apr-util apr-util需要依赖于apr包,所以先安装apr, http://fi ...

  2. Hadoop框架:集群模式下分布式环境搭建

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础环境配置 1.三台服务 准备三台Centos7服务,基础环境从伪分布式环境克隆过来. 133 hop01,134 hop02,136 ...

  3. 【朝夕Net社区技术专刊】Core3.1 WebApi集群实战专题---WebApi环境搭建运行发布部署篇

    欢迎大家阅读<朝夕Net社区技术专刊>第1期 原文是我在知乎发表的,现在在这里分享! 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为首 ...

  4. Spark集群基础概念 与 spark架构原理

    一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...

  5. Spark集群基于Zookeeper的HA搭建部署笔记(转)

    原文链接:Spark集群基于Zookeeper的HA搭建部署笔记 1.环境介绍 (1)操作系统RHEL6.2-64 (2)两个节点:spark1(192.168.232.147),spark2(192 ...

  6. CEPH-5:ceph集群基本概念与管理

    ceph集群基本概念与管理 ceph集群基本概念 ceph集群整体结构图 名称 作用 osd 全称Object Storage Device,主要功能是存储数据.复制数据.平衡数据.恢复数据等.每个O ...

  7. 大数据系列(3)——Hadoop集群完全分布式坏境搭建

    前言 上一篇我们讲解了Hadoop单节点的安装,并且已经通过VMware安装了一台CentOS 6.8的Linux系统,咱们本篇的目标就是要配置一个真正的完全分布式的Hadoop集群,闲言少叙,进入本 ...

  8. Hadoop集群完全分布式坏境搭建

    前言 上一篇我们讲解了Hadoop单节点的安装,并且已经通过VMware安装了一台CentOS 6.8的Linux系统,咱们本篇的目标就是要配置一个真正的完全分布式的Hadoop集群,闲言少叙,进入本 ...

  9. Redis创建高可用集群教程【Windows环境】

    模仿的过程中,加入自己的思考和理解,也会有进步和收获. 在这个互联网时代,在高并发和高流量可能随时爆发的情况下,单机版的系统或者单机版的应用已经无法生存,越来越多的应用开始支持集群,支持分布式部署了. ...

随机推荐

  1. Android开发-API指南-数据存储

    Storage Options 英文原文:http://developer.android.com/guide/topics/data/data-storage.html 采集日期:2015-02-0 ...

  2. 慕课网-安卓工程师初养成-3-4 Java中的比较运算符

    来源:http://www.imooc.com/code/1299 比较运算符用于判断两个数据的大小,例如:大于.等于.不等于.比较的结果是一个布尔值( true 或 false ). Java 中常 ...

  3. opencv学习——兴趣区选取

    在OpenCV中,普遍支持ROI和widthStep,函数的操作被限制于感兴趣的区域,要设置或者取消ROI,就要使用cvSetImageROI()和cvResetImage()函数.如过想设置ROI, ...

  4. asp.net ashx 一般处理程序 使用async await异步直接 copy可用哦

    以前一直很懒  碰到ashx要用await异步就绕开  用aspx  或者mvc异步控制器  这次公司需要  我查了国内的文章基本都不能简单copy来处理一堆错关键的过程中函数BeginProcess ...

  5. dreamweaver cs6 的破解方法

    dreamweaver cs6 的破解方法,很简单大家照着下面的方法做肯定能破解方法/步骤 安装DreamWeaver cs6 使用amtlib.dll破解下载amtlib.dll文件后,解压后得到 ...

  6. hbase基本结构

    HBASE  基本结构一.overview1. hbase <=> NOSQL     不错,hbase 就是某种类型的nosql 数据库,唯一的区别就是他支持海量的数据.    hbas ...

  7. 何时使用 Em 与 Rem

    原文  http://www.w3cplus.com/css/when-to-use-em-vs-rem.html   你可能已经很熟练使用这两个灵活的单位,但你可能不完全了解何时使用rem,何时使用 ...

  8. Android 弹出框

    1.Java package com.fish.helloworld; import android.app.Activity; import android.app.AlertDialog; imp ...

  9. 2.2安装JDK

    在Ubuntu下安装JDK的步骤: (1)首先需要自己安装的Ubuntu系统是多少位的,可以使用命令[getconf LONG_BIT]获取这个信息: (2)在JDK官网下载相应(选取和Linux系统 ...

  10. Mir2源码详解之服务端-登录网关(LoginGate)

    传奇这款游戏,一直对我的影响很大.当年为了玩传奇,逃课,被老师叫过N次家长.言归正传,网上有很多源码,当然了,都是delphi的.并且很多源码还不全, 由于一直学习的c.c++.delphi还真不懂. ...