Postgres-X2 - PostgreSQL分布式集群


BSD
Linux
C/C++

软件简介

基于PostgreSQL的分布式数据库集群,同时适合OLTP
和OLAP应用。该项目的目标是整合Postgres-XC 和 Postgres-XL。Postgres-
XC/XL/X2是一个开源项目。它提供了一个多主同步、透明的PostgreSQL的集群解决方案。不同于其它集群工具(如:
Greenplum
)重点突出OLAP,而Postgres-
XC/XL/X2则更强调OLTP,在写入数据的时候具有很强的可扩展性,很好的引入了“多主架构”的集群环境概念。多主意味着在写入数据的时候不再受单一主节点的限制,在写入速度上将有很好的提升。

Postgres-XC/XL/X2数据库安装手册

Postgres-XC有三个主要的组件,即GTM(Global Transaction Manager)、Coordinator和Datanode。

其中GTM是最关键的一个组件,提供统一的事务处理管理和透明的组件控制。该事务管理技术是基于MVCC而来。任何一个Postgres-
XC组件的处理管理都是基于单一的全局状态。

Coordinator是一个针对于应用程序的接口,犹如传统PostgreSQL数据库的后台进程。coordinator不存储实际的数据,只存储关于数据的描述性信息,实际的数据会被存储在datanode上。

Datanode存储实际的数据。表会在所有的datanode之间被分发或者被复制到所有的节点。由于datanode没有全局的数据库视图,所以它只会关心自己本地存储的数据。coordinator对接收的语句进行检查描述,然后重新组装后在有关的datanode上执行。再接着根据需要将数据转储到其它的datanode上。

系统规划

先准备6台机器。1台使用LVS进行负荷分担、1台作GTM、1台作GTM_Standby、剩下的3台作为Coordinator和Datanode节点。

操作系统信息:

    [root@localhost ~]# cat /etc/issue
    CentOS release 6.3 (Final)
    Kernel \r on an \m 
    [root@localhost ~]# uname -a
    Linux localhost.localdomain 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

安装用户: pgxc

安装根目录: /home/pgxc

IP资源分配如下:

功能 主机名 IP地址
LVS lvs_master 192.168.18.160
Global Transaction Manager gtm 192.168.18.164
Global Transaction Manager Standby gtm_standby 192.168.18.165
Coordinator1/Datanode1/GTM Proxy cd1 192.168.18.166
Coordinator2/Datanode2/GTM Proxy cd2 192.168.18.167
Coordinator3/Datanode3/GTM Proxy cd3 192.168.18.168

安装存储目录:

主机名 目录
gtm ~/gtm
gtm_standby ~/ gtm
cd1 ~/ coordinator ~/datanode ~/ coordinator_s ~/datanode_s
cd2 ~/ coordinator ~/datanode ~/ coordinator_s ~/datanode_s
cd3 ~/ coordinator ~/datanode ~/ coordinator_s ~/datanode_s

端口规划:

主机名 端口
gtm 6666
gtm_standby 6666
datanode1/datanode2_s 15432
datanode2/datanode3_s 15433
datanode3/datanode1_s 15434
coordinator1/coordinator2_s 5432
coordinator2/coordinator3_s 5433
coordinator3/coordinator4_s 5434
coordinator1 poolerPorts 20010
coordinator2 poolerPorts 20011
coordinator3 poolerPorts 20012
datanode1 poolerPorts 20013
datanode2 poolerPorts 20014
datanode3 poolerPorts 20015

LVS软件信息:ipvsadm-1.24.tar

数据库软件信息:postgres-xl-v9.2-src.tar

注意:
数据库的环境搭建、安装、维护等均在数据库所在的主机上进行操作,即gtm、gtm_standby、cd1、cd2、cd3。LVS安装、维护均在lvs_master上。

环境准备 (所有主机)

  1. 1 安装依赖包

在数据库安装前需要确认如下依赖包已经安装,推荐在安装操作系统时使用完全安装,完全安装将会包含postgres所需的依赖包。需要的依赖包如下:

    yum install -y flex bison readline-devel zlib-devel openjade docbook-style-dsssl;
  1. 2 新建pgxc用户

因为分布式数据库是不能再root用户下运行的,所以在每台机器上都新建pgxc用户以及用户组:

    #groupadd pgxc           ----新建用户组
    #useradd -g pgxc pgxc     ----新建用户
    #passwd pgxc             ----修改新用户密码(为了后续方便操作,我将所有密码都设置为pgxc)
  1. 3 添加所有主机的域名信息

因为在使用pgxc_ctl的配置信息中会涉及,本次以192.168.18.160~168为例:

    #vi /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    192.168.18.160  lvs_master
    192.168.18.164  gtm
    192.168.18.165  gtm_standby
    192.168.18.166  cd1
    192.168.18.167  cd2
    192.168.18.168  cd3

并且,以GTM为例,在各自的主机上进行如下设置:

    [root@localhost ~]# hostname gtm
    [root@localhost ~]# vi /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=gtm
  1. 4 建立信任关系

在所有机器上执行如下命令

    # su - pgxc
    $ssh-keygen -t rsa

-–提示需要输入时,全部回车即可,执行完该命令后将会生成id_rsa.pub文件。

选择其中一台机器(任意一台,以164为例),以pgxc用户在其上执行如下命令,根据提示输入密码等信息,生成authorized_keys文件:

    $cd ~/.ssh
    $ scp pgxc@192.168.18.164:/home/pgxc/.ssh/id_rsa.pub /home/pgxc/.ssh/authorized_keys
    $ scp pgxc@192.168.18.165:/home/pgxc/.ssh/id_rsa.pub /home/pgxc/.ssh/temp
    $cat temp >> authorized_keys
    $ scp pgxc@192.168.18.166:/home/pgxc/.ssh/id_rsa.pub /home/pgxc/.ssh/temp
    $cat temp >> authorized_keys
    $ scp pgxc@192.168.18.167:/home/pgxc/.ssh/id_rsa.pub /home/pgxc/.ssh/temp
    $cat temp >> authorized_keys
    $ scp pgxc@192.168.18.168:/home/pgxc/.ssh/id_rsa.pub /home/pgxc/.ssh/temp
    $cat temp >> authorized_keys

把authorized_keys拷贝到其他主机上

    $scp ./authorized_keys pgxc@192.168.18.165:/home/pgxc/.ssh/
    $scp ./authorized_keys pgxc@192.168.18.166:/home/pgxc/.ssh/
    $scp ./authorized_keys pgxc@192.168.18.167:/home/pgxc/.ssh/
    $scp ./authorized_keys pgxc@192.168.18.168:/home/pgxc/.ssh/

进行如上操作后便建立起了所有机器间的信任关系,可以用如下方式进行测试信任关系是否建立成功,在pgxc用户下执行如下命令:

    $ssh pgxc@192.168.18.165 --如果不再提示输入密码,表示信任关系建立成功

数据库安装(所有主机)

  1. 1 安装数据库

目前本数据库采用的是编译安装的方式(也可以使用rpm安装)。

首先将postgres-
xl-v9.2-src.tar.gz拷贝到指定目录,然后进行解压,下面以拷贝到/home/pgxc目录下为例,在所有机器上进行如下操作:

    [pgxc@gtm ~]$ tar -zxf postgres-xl-v9.2-src.tar.gz
    [pgxc@gtm ~]$ cd postgres-xl
    [pgxc@gtm postgres-xl]$ ./configure  --prefix=/home/pgxc/pgxl  ---指定安装路径
    [pgxc@gtm postgres-xl]$ make
    [pgxc@gtm postgres-xl]$ make install
    [pgxc@gtm postgres-xl]$ cd contrib/
    [pgxc@gtm postgres-xl]$ make
    [pgxc@gtm postgres-xl]$ make install
  1. 2 添加环境变量

在/home/pgxc/.bashrc中添加如下环境变量,添加完成后以pgxc用户执行source命令使其立即生效。

    export PGHOME=/home/pgxc/pgxl
    export PGUSER=pgxc
    export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
    export PATH=$PGHOME/bin:$PATH
    [pgxc@gtm postgres-xl]$ source ~/.bashrc
  1. 3 放开防火墙限制

使用root权限,在 所有 数据库服务器上进行放开防火墙限制操作。

关闭防火墙的命令如下:

-–永久关闭

    #chkconfig iptables on   --重启后生效

--暂时关闭

    #service iptables stop    --重启后失效

使用端口放通的方法如下:

    [root@cd2 ~]# vi /etc/sysconfig/iptables

增加如下信息:

    -A OUTPUT -p tcp --sport 5432 -j ACCEPT
    -A INPUT -p tcp --dport 5432 -j ACCEPT
    -A OUTPUT -p tcp --sport 5433 -j ACCEPT
    -A INPUT -p tcp --dport 5433 -j ACCEPT
    -A OUTPUT -p tcp --sport 5434 -j ACCEPT
    -A INPUT -p tcp --dport 5434 -j ACCEPT
    -A OUTPUT -p tcp --sport 15432 -j ACCEPT
    -A INPUT -p tcp --dport 15432 -j ACCEPT
    -A OUTPUT -p tcp --sport 15433 -j ACCEPT
    -A INPUT -p tcp --dport 15433 -j ACCEPT
    -A OUTPUT -p tcp --sport 15434 -j ACCEPT
    -A INPUT -p tcp --dport 15434 -j ACCEPT
    -A OUTPUT -p tcp --sport 20010 -j ACCEPT
    -A INPUT -p tcp --dport 20010 -j ACCEPT
    -A OUTPUT -p tcp --sport 20011 -j ACCEPT
    -A INPUT -p tcp --dport 20011 -j ACCEPT
    -A OUTPUT -p tcp --sport 20012 -j ACCEPT
    -A INPUT -p tcp --dport 20012 -j ACCEPT
    -A OUTPUT -p tcp --sport 20013 -j ACCEPT
    -A INPUT -p tcp --dport 20013 -j ACCEPT
    -A OUTPUT -p tcp --sport 20014 -j ACCEPT
    -A INPUT -p tcp --dport 20014 -j ACCEPT
    -A OUTPUT -p tcp --sport 20015 -j ACCEPT
    -A INPUT -p tcp --dport 20015 -j ACCEPT
    -A OUTPUT -p tcp --sport 20016 -j ACCEPT
    -A INPUT -p tcp --dport 20016 -j ACCEPT
    :wq!
    [root@cd2 ~]# service iptables restart
  1. 4 配置节点信息

选择一个主机,以GTM为例,进入/home/pgxc/postgres-xl/contrib/pgxc_ctl目录中,执行pgxc_ctl命令:

    [pgxc@gtm_standby pgxc_ctl]$ ./pgxc_ctl
    Installing pgxc_ctl_bash script as /home/pgxc/pgxc_ctl/pgxc_ctl_bash.
    ERROR: File "/home/pgxc/pgxc_ctl/pgxc_ctl.conf" not found or not a regular file. No such file or directory
    Installing pgxc_ctl_bash script as /home/pgxc/pgxc_ctl/pgxc_ctl_bash.
    Reading configuration using /home/pgxc/pgxc_ctl/pgxc_ctl_bash --home /home/pgxc/pgxc_ctl --configuration /home/pgxc/pgxc_ctl/pgxc_ctl.conf
    Finished to read configuration.
       ******** PGXC_CTL START ***************
    Current directory: /home/pgxc/pgxc_ctl
    PGXC prepare    ---执行该命令将会生成一份配置文件模板
    PGXC ^C

pgxc_ctl有自己的工作目录,一般为$HOME/pgxc_ctl/。在该目录下存有刚才生成的配置模板文件pgxc_ctl.conf以及一些日志信息。

在pgxc_ctl.conf中配置需要安装的节点信息,具体请根据配置文件中的说明进行修改。

修改完成后,执行命令初始化所有数据库:

    $pgxc_ctl  -c pgxc_ctl.conf init all    --初始化完成后会自动启动

初始化完成后需要重启整个集群:

    $pgxc_ctl  -c pgxc_ctl.conf stop all   ---停止整个分布式集群
    $pgxc_ctl  -c pgxc_ctl.conf start all   --启动整个分布式集群

注意:初始化信息如果返回错误,需要检查错误原因,常见错误时端口冲突、网络不通等待,请仔细检查。然后在所有主机上,停止运行的GTM进程和Postgres进程,并且删除安装文件/home/pgxc/pgxc。修改配置文件后重新初始化和重新启动。

数据库参数配置 (所有主机,可选)

安装完成后的目录信息如下:

    [pgxc@cd1 nodes]$ pwd
    /home/pgxc/pgxc/nodes
    [pgxc@cd1 nodes]$ ls
    coordinator  coordinator_archlog  coordinator_s  datanode  datanode_archlog  datanode_s  gtm_pxy

数据库的参数主要涉及到两个配置文件:postgres.conf
(配置数据库的基本信息)、pg_hba.conf(配置数据库的访问权限信息)。这两个配置文件的路径在对应的节点子目录中。

postgres.conf常用修改项: listen_addresses : 监听地址 port:监听端口 max_connections:支持最大连接数

pg_hba.conf配置项:

    host    all    all             127.0.0.1/32            trust

第一个域host:一般情况下使用host(有local和host两种) 第二个域all:表示数据库 第三个域all:表示用户
第四个域IP地址:将会对ip地址进行过滤,满足过滤规则的可以连接,如:192.168.1.0/24表示192.168.1.0网段的可以进行连接,192.168.1.0/16表示192.168.0.0网段的可以连接。
第五个域trust:表示鉴权方式,此处为完全信任,可以是”trust”, “md5”, “password”等。

LVS配置(可选)

LVS是Linux Virtual
Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统。VS/NAT、VS/TUN、VS/DR技术是LVS集群中实现的三种IP负载均衡技术。本次数据库搭建采用VS/DR模式。

下面的操作,除掉特殊说明外,都是在LVS主备服务器上进行。

  1. 1 搭建准备

确认操作系统已经打好的LVS的补丁,目前的操作系统一般都已经包含了该补丁:

    [root@localhost ~]# modprobe -l |grep ipvs
    kernel/net/netfilter/ipvs/ip_vs.ko
    kernel/net/netfilter/ipvs/ip_vs_rr.ko
    kernel/net/netfilter/ipvs/ip_vs_wrr.ko
    kernel/net/netfilter/ipvs/ip_vs_lc.ko
    kernel/net/netfilter/ipvs/ip_vs_wlc.ko
    kernel/net/netfilter/ipvs/ip_vs_lblc.ko
    kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
    kernel/net/netfilter/ipvs/ip_vs_dh.ko
    kernel/net/netfilter/ipvs/ip_vs_sh.ko
    kernel/net/netfilter/ipvs/ip_vs_sed.ko
    kernel/net/netfilter/ipvs/ip_vs_nq.ko
    kernel/net/netfilter/ipvs/ip_vs_ftp.ko

创建连接:

    [root@localhost ~]# ln -s /usr/src/kernels/2.6.32-279.el6.x86_64/ /usr/src/linux/
  1. 2 安装ipvsadmin

    [root@localhost ~]# tar -zxf ipvsadm-1.24.tar.gz 
    [root@localhost ~]# cd ipvsadm-1.24
    [root@localhost ipvsadm-1.24]# make && make install
    
  2. 3 配置ipvsadmin

在主备LVS服务器上运行lvsdr.sh脚本,以配置VS/DR模式的调度器。在每台coordinator上运行relserver.sh脚本。这两个脚本的配置参数请根据实际的配置情况进行修改。

数据库连接及简单测试

通过coordinator连接数据库:

    $ psql -h 192.168.18.206 -p 5432 -d postgres -U pgxc

格式说明:

    psql  -h hostname/ip  -d database_name  -p port -U username

hostname/ip:为安装有数据库的主机名称或IP地址 database_name:数据库名称 port:端口号,端口号为5432时可省略
username:连接该数据库使用的用户名

    Postgres#create table test(id integer);
    Postgres#insert into test values(1);
    。。。。
    Postgres#insert into test values(9);
    Postgres#execute direct on(datanode1) ‘select * from test’;
    Postgres#execute direct on(datanode2) ‘select * from test’;
    Postgres#execute direct on(datanode3) ‘select * from test’;
    Postgres#execute direct on(datanode4) ‘select * from test’;

可以看出该数据分布到不同的数据节点上。