基于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资源分配如下:
安装存储目录:
端口规划:
LVS软件信息:ipvsadm-1.24.tar
数据库软件信息:postgres-xl-v9.2-src.tar
注意: 数据库的环境搭建、安装、维护等均在数据库所在的主机上进行操作,即gtm、gtm_standby、cd1、cd2、cd3。LVS安装、维护均在lvs_master上。
环境准备 (所有主机)
在数据库安装前需要确认如下依赖包已经安装,推荐在安装操作系统时使用完全安装,完全安装将会包含postgres所需的依赖包。需要的依赖包如下:
yum install -y flex bison readline-devel zlib-devel openjade docbook-style-dsssl;
因为分布式数据库是不能再root用户下运行的,所以在每台机器上都新建pgxc用户以及用户组:
#groupadd pgxc ----新建用户组 #useradd -g pgxc pgxc ----新建用户 #passwd pgxc ----修改新用户密码(为了后续方便操作,我将所有密码都设置为pgxc)
因为在使用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
在所有机器上执行如下命令
# 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 --如果不再提示输入密码,表示信任关系建立成功
数据库安装(所有主机)
目前本数据库采用的是编译安装的方式(也可以使用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
在/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
使用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
选择一个主机,以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主备服务器上进行。
确认操作系统已经打好的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/
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
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’;
可以看出该数据分布到不同的数据节点上。