当前位置:文档之家› postgresql群集

postgresql群集

注意事项:由于wordpress会自动将半角单引号转换为全角单引号,引用代码时需要手动修改为单引号原理只是一个概念,可操作性不强,看了N多的半原理半细节的相关文章,却总是被各种各样的细节困惑住。

为了自己下次能够快速的使用PostgreSQL,以流水帐的方式记录配置PostgreSQL集群的步骤,有些结论是自己猜想的或者引用的,以后发现错误再修正吧。

顺便发些感想(跳过下面一段,都是题外话,其实就是废话):其实很多东西,从原理上说都很简单,几乎我们每个人都能说上一点。

但是实际上,原理性的文章一般可操作性都不是很强。

我个人觉得,如果目标是给自己看或者目标是让团队的人能够读懂并可以操作的文章,还是应该多一些细节描述,用文学的观点来说,就是表现手法要细腻一些。

Over,转入正题:首先解释一下数据库集群:N个数据库堆到一起,找一个当个头头,管理所有的数据库并让它们协同工作。

当然了,要不要找个头头,找几个头头,如何协作等等问题这些都可以商量和约定,因此,也就形成了不同的数据库集群。

如果数据库系统是PostgreSQL,这个集群就是PostgreSQL数据库集群。

PostgreSQL数据库管理集群的方法有很多,有人提出了PL/Proxy方式的集群(这才是本文的重点)。

这个PL/Proxy方式的集群是这样的:有很多安装了PostgreSQl数据库的计算机,有台计算机是头头,我们把这个头头叫做proxy,其他的叫做database0,database1……。

当然名字叫什么是无所谓的,关键是有个是头头,其他的受头头指挥。

看个例子吧:以三台机器的集群为例子,看看PostgreSQL集群的架构是什么。

proxy节点:proxy节点实际上也是一个PostgreSQL数据库节点,但是所有数据均不存放到proxy节点上,主要做三件事情:1.接受用户的sql查询;2.分析用户的sql查询并转换成集群上执行的SQL语句;3.合并集群执行sql的结果,然后返回给用户。

说白了,就是把用户的sql语句交给database0,database1去执行,然后合并执行结果返回给用户。

database1节点和 database2节点:就是普通的数据库节点,接收proxy节点的sql查询请求并返回结果给proxy节点,是真正存放数据的节点。

没图没真相,还是来张集群结构图,结构更清晰一些:看了原理图,是不是觉得很简单,稍微了解技术的人都能想到这种架构。

既然这么简单,那就开始创建一个数据库集群吧,需求如下:1.创建一个如集群结构图所示的集群,数据库集群中均操作同一个数据库“JiwanCluster”;2.用户通过客户端操作proxy节点在集群中创建一个表user(说白了就是要通过集群的方法在Database0和Database1的JiwanCluster中创建一个叫做user 的表);3.用户通过客户端操作proxy节点在集群上插入多个记录信息到集群的user表上(需要把插入操作分布到两个Database节点上);4.用户通过客户端操作proxy节点在集群上查询集群上的所有user记录;需求不算难吧,不过很不幸,如果你对PostgreSQL不熟悉的话,你仍然搭建不了数据库(反正我看了原理后,还是搭建不了)。

原理嘛,这东西太官方了,来点操作性较强的步骤(版本号需要留意一下,版本不同的话,可能会导致情况大不相同):第一步:创建三个空的虚拟机器并把这三台虚拟机的网卡设置搞定(比如,是否桥接,是否NAT之类)(有钱的话,自己买三台电脑,3条网线和一个集线器)。

可以创建虚拟机的软件如VMWare, VirtualPC, Xen等等,本文的实验用的是VMWare,原因是我对VMWare比较熟悉;第二步:三个虚拟机全部安装Ubuntu-10.04这个嘛,没有什么说的,但是对于新人,这个到西还要再说一下。

你可以到Ubuntu 的官方网站/上找到下载地址,我当时的下载的地址是/releases/lucid/ubuntu-10.04-deskt op-i386.iso第三步:三个虚拟机全部安装PostgreSQL数据库系统如何安装和配置请参见Ubuntu下 Postgresql-8.4安装及配置第四步:做个额外的动作,将每台服务器的设定成允许任何机器使用任何账号访问任何数据库(实验嘛,没关系的,照做就行了):root@ubuntuserver:~# vi /etc/postgresql/8.4/main/pg_hba.conf—>改变行:host all all 0.0.0.0 0.0.0.0 md5—>修改为:host all all 0.0.0.0 0.0.0.0 trust如果没有此行则添加此行,具体说明参见Ubuntu下 Postgresql-8.4安装及配置。

第五步:三个虚拟机全部创建数据库JiwanCluster:root@ubuntuserver:~# psql –U postgres -h 127.0.0.1postgres=# create database “JiwanCluster”;创建数据库的详细方法请参见Ubuntu下 Postgresql-8.4安装及配置——–章节凌乱,先来个“完美分割线”——–PS:现在的三台机器都能提供数据库服务了,而且在任何一台机器使用客户端都可以自由的访问其他数据库服务器中的”JiwanCluster”数据库,不过他们还不是集群,仅仅是可以相互访问的数据库服务器而已,他们之间没有任何协作关系。

下面创建PL/Proxy方式的协作关系(嫌这个词太土?!那就换一个:创建PostgreSQL 数据库集群)。

——–章节凌乱,先来个“完美分割线”——–第六步:在 proxy 节点上安装过程语言plproxy(安装 plproxy 必须使用 root 用户,否则不能正常安装,我安装后的plproxy版本是plproxy-2.0.4):sudo apt-get install postgresql-8.4-plproxy下面是解释,不想了解的话,可以直接跳过。

这一步的目的是:使proxy节点知道怎样指挥集群(实验中,就是指挥database0和database1),换句话就是说,让prxoy知道三件事情:怎样把用户的SQL请求发送给集群的节点;怎样接受集群的处理结果;怎样将处理后的结果返回给用户。

这一步的实质是:复制plproxy.so文件到目录”/user/lib/postgresql/8.5/lib”的下面;复制plproxy.sql文件到目录”/usr/share/postgresql-8.4-plproxy”下面(这个目录是安装程序创建的,plproxy.sql文件是给下一步创建plproxy语言使用的,不是必须的,完全可以在需要的时候自己写相应的SQL语句)。

这两个文件的存在是这一步安装成功的一个标志。

需要注意的是:安装过程语言是对数据库系统而言的,可以认为仅仅是复制了一些需要的文件而已,之后使用这个过程语言的之前,还要分别为每一个需要使用此过程语言的数据库创建这个语言(说白了,就是还要告诉每个数据库到那里找相应的文件plproxy.so文件,下一步有解释)。

执行后在文件浏览器中的效果是:第七步:为proxy节点上的数据库”JiwanCluster“创建plproxy过程语言(前提是你之前安装过这个语言):root@ubuntuserver:~# psql -U postgres -h 127.0.0.1 -f/usr/share/postgresql-8.4-plproxy/plproxy.sql JiwanCluster这条语句的实质是:在数据库系统表pg_language中添加一行记录。

执行后在pgAdmin3客户端观看到的效果是:当然要是你嫌每次都要创建语言麻烦,你可以将过程语言创建到template1数据库中,这样每次创建数据库的时候,所的语言都自动创建好了(创建数据库的过程实际上就是复制templated1模板数据苦的过程)。

下面是解释,不想了解的话,可以直接跳过。

这一步的目的是告诉数据库”JiwanCluster”遇到plproxy的过程函数时候怎么处理。

文件plproxy.sql的内容如下:– handler functionCREATE FUNCTION plproxy_call_handler () RETURNS language_handlerAS ‘$libdir/plproxy’ LANGUAGE C;– languageCREATE LANGUAGE plproxy HANDLER plproxy_call_handler;解释一下:–handler function之下的代码的作用是创建一个函数,名字叫做plproxy_call_handler,返回类型是language_handler,他的定义在文件夹”$libdir”之下的plproxy.so文件中plproxy.so是一个由C语言编译而成的.so 文件;– language之下的代码的作用是创建一个过程语言,过程语言的名称是plproxy,处理这个过程语言的函数是plproxy_call_handler,过程语言的源代码就是这个函数的参数。

可见,实际上过程语言就是一个“C”语言函数的字符串参数。

这里有必要提及一下过程语言的前世今生(过程语言的官方解释见/pgsqldoc-cvs/xplang.html。

:在PostgresSQL数据库系统里,除了使用系统自带的函数(如count(), max()等)外,还可以使用你自己编写的函数。

编写函数的语言可以是sql或C语言,也可以是指定的过程语言(比如plproxy过程语言,plpgsql过程语言,你也可以自己写一个过程语言)。

编写sql语言/C语言/plproxy过程语言的函数的例子如下:CREATE OR REPLACE FUNCTION fun_sql_test()RETURNS INTEGER AS$BODY$SELECT 1;$BODY$LANGUAGE ‘sql‘ VOLATILE—————————–CREATE OR REPLACE FUNCTION fun_c_test()RETURNS INTEGER AS‘$libdir/c_test’, ‘fun_c_test’LANGUAGE ‘c‘ VOLATILE—————————–CREATE OR REPLACE FUNCTION fun_plproxy_test()RETURNS integer AS$BODY$CLUSTER ‘jiwan’;RUN ON ALL;$BODY$LANGUAGE ‘plproxy‘ VOLATILE—————————–这样就创建了三个函数fun_sql_test(),fun_c_test()和fun_plproxy_test()。

相关主题