pl proxy 集群示例配置过程

看了一下pl/proxy,文档很多,都当参考吧,转载其中两篇,这是其一


参考:

http://plproxy.projects.pgfoundry.org/doc/tutorial.html
http://www.tbdata.org/archives/723
http://bbs.chinaunix.net/thread-1859285-1-1.html
http://blog.chinaunix.net/uid-15145533-id-2775843.html
http://blog.chinaunix.net/uid-15145533-id-2775844.html
http://blog.163.com/digoal@126/blog/static/1638770402010411113114315/
http://blog.163.com/digoal@126/blog/static/163877040201192535630895/
http://bbs.chinaunix.net/thread-1859285-1-1.html
http://blog.chinaunix.net/uid-15145533-id-2775824.html


以下转自:http://www.blogjava.net/Ilovby/archive/2013/01/28/394849.html


零、参考资料
1、http://plproxy.projects.pgfoundry.org/doc/tutorial.html
2、http://www.tbdata.org/archives/723
一、缘起
本来淘宝这篇博客已经说得很清楚了,但是它需要三台虚拟机,呃,自己对虚拟机完全不熟悉,加上硬盘不够,就不想折腾了,然后找单机版的pl proxy方法,到处没有找到,然后就只有看官方文档了,就是第一个参考资料了啦,发现其实可以在一个linux下建立3个数据库就可以模拟了。
二、基本信息
1、linux版本:ubuntu 12.10
2、postgresql版本:9.1
3、pl proxy版本:postgresql-9.1-plproxy
4、postgresql已经能使用了
5、在pgadmin3中执行sql语句的方法如下
(1)打开query tool(按住ctrl+E)就可以打开
(2)在query tool中粘贴sql语句
(3)按F5就可以执行了
(4)执行成功或者失败都会有提醒,挺好使。
三、配置过程
1、emacs /etc/postgresql/9.1/main/pg_hba.conf
—>改变行:host    all             all             127.0.0.1/32            md5
—>修改为:host    all             all             127.0.0.1/32            trust
2、创建三个数据库,分别是proxy,database0,database1,我用的创建工具是pgadmin3,创建数据库的sql代码分别如下(把其中的proxy代替为database0,database1就可以分别使用了)

--  Database: proxy

--  DROP DATABASE proxy;

CREATE DATABASE proxy
  WITH OWNER 
=  postgres
       ENCODING 
=   ' UTF8 '
       TABLESPACE 
=  pg_default
       LC_COLLATE 
=   ' en_US.UTF-8 '
       LC_CTYPE 
=   ' en_US.UTF-8 '
       CONNECTION LIMIT 
=   - 1 ;
3、在bash或zsh等shell中输入如下命令
psql -U postgres -h 127.0.0.1 -f /usr/share/postgresql/9.1/extension/plproxy--2.4.0.sql proxy
4、在pgadmin3中选择proxy数据库,打开query tool,输入如下sql语句并按f5执行
create language plpgsql;
得到的结果是
ERROR:  language "plpgsql" already exists

********** Error **********

ERROR: language "plpgsql" already exists
SQL state: 42710
证明这一步没有必要做,其实已经有了
5、在pgadmin3中选择proxy数据库,打开query tool,输入如下语句并执行
create schema plproxy
6、在pgadmin3中选择proxy数据库的plproxy模式(刚创建的),打开query tool ,输入如下建立3个函数的语句并执行
(1)建立 plproxy.get_cluster_config函数
CREATE   OR   REPLACE   FUNCTION  plproxy.get_cluster_config( IN  cluster_name  text , OUT  key   text , OUT val  text )
  
RETURNS  SETOF record  AS
$BODY$
BEGIN
key  : =   ' statement_timeout ' ; -- 就是给 key 变量赋值,赋的值为’statement_timeout’
val : =   60 ; -- 就是给 val 变量赋值,赋的值为 60
RETURN   NEXT ;
RETURN ;
END ;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 
100
  ROWS 
1000 ;
ALTER   FUNCTION  plproxy.get_cluster_config( text )
  OWNER 
TO  postgres;
(2)建立 plproxy.get_cluster_partitions函数
CREATE OR REPLACE FUNCTION plproxy.get_cluster_partitions(cluster_name text)
  RETURNS SETOF text AS
$BODY$
BEGIN
IF cluster_name = 'testcluster' THEN --cluster_name 是群集的名字
RETURN NEXT 'dbname=database0 host=127.0.0.1'; --数据库节点的数据库名和 IP 地址
RETURN NEXT 'dbname=database1 host=127.0.0.1'; --数据库节点的数据库名和 IP 地址
RETURN;
END IF;
RAISE EXCEPTION 'Unknown cluster'; --如果群集名不存在,抛出异常,这个是在数据库内部处理的,最终会写入日志中。‘Unknown cluster’是报错信息
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION plproxy.get_cluster_partitions(text)
  OWNER TO postgres;
(3)建立 plproxy.get_cluster_version函数
CREATE   OR   REPLACE   FUNCTION  plproxy.get_cluster_version(cluster_name  text )
  
RETURNS   integer   AS
$BODY$
BEGIN
IF  cluster_name  =   ' testcluster '   THEN
RETURN   1 ;
END   IF ;
RAISE EXCEPTION 
' Unknown cluster ' ;
END ;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 
100 ;
ALTER   FUNCTION  plproxy.get_cluster_version( text )
  OWNER 
TO  postgres;

7、在pgadmin3中选择proxy数据库的public模式(默认就有的),打开query tool ,输入如下建立3个函数的语句并执行
(1)建立public.ddlexec(sql_request text)函数
CREATE   OR   REPLACE   FUNCTION  ddlexec(query  text )
  
RETURNS  SETOF  integer   AS
$BODY$
CLUSTER 
' testcluster ' ;
RUN 
ON   ALL ;
$BODY$
  LANGUAGE plproxy VOLATILE
  COST 
100
  ROWS 
1000 ;
ALTER   FUNCTION  ddlexec( text )
  OWNER 
TO  postgres;
(2)建立public.dmlexec(sql_request text)函数
CREATE   OR   REPLACE   FUNCTION  dmlexec(query  text )
  
RETURNS  SETOF  integer   AS
$BODY$
CLUSTER 
' testcluster ' ;
RUN 
ON   ANY ;
$BODY$
  LANGUAGE plproxy VOLATILE
  COST 
100
  ROWS 
1000 ;
ALTER   FUNCTION  dmlexec( text )
  OWNER 
TO  postgres;
(3)建立public.dqlexec(sql_request text)函数
CREATE   OR   REPLACE   FUNCTION  dqlexec(query  text )
  
RETURNS  SETOF record  AS
$BODY$
CLUSTER 
' testcluster ' ;
RUN 
ON   ALL ;
$BODY$
  LANGUAGE plproxy VOLATILE
  COST 
100
  ROWS 
1000 ;
ALTER   FUNCTION  dqlexec( text )
  OWNER 
TO  postgres;
8、在pgadmin3中选择database0 和database1数据库,打开query tool,输入如下sql语句并按f5执行
create language plpgsql;
如果已经有这个语言了,就会和上面第四步一样报错,不管,继续往下走就行了。
9、在pgadmin3中选择database0 和database1数据库的public模式(默认就有的),打开query tool ,输入如下建立3个函数的语句并执行
(1)建立public.ddlexec(sql_request text)函数
CREATE   OR   REPLACE   FUNCTION  ddlexec(query  text )
RETURNS   integer   AS
$BODY$
declare
ret 
integer ;
begin
execute  query;
return   1 ;
end ;
$BODY$
LANGUAGE 
' plpgsql '  VOLATILE
COST 
100 ;
(2)建立public.dmlexec(sql_request text)函数
CREATE   OR   REPLACE   FUNCTION  dmlexec(query  text )
RETURNS   integer   AS
$BODY$
declare
ret 
integer ;
begin
execute  query;
return   1 ;
end ;
$BODY$
LANGUAGE 
' plpgsql '  VOLATILE
COST 
100 ;

(3)建立public.dqlexec(sql_request text)函数
CREATE   OR   REPLACE   FUNCTION  dqlexec(query  text )
RETURNS  SETOF record  AS
$BODY$
declare
ret record;
begin
for  ret  in   execute  query loop
return   next  ret;
end  loop;
return ;
end ;
$BODY$
LANGUAGE 
' plpgsql '  VOLATILE
COST 
100
ROWS 
1000 ;
10、到此为止,集群就创建成功了,现在就可以通过proxy这个节点对database0和database1进行建表、插入数据、查询数据的操作了
(1)创建表usertable
在pgadmin3中选择proxy数据库,打开query tool ,输入如下建立usertable的语句并执行
select  ddlexec( ' create table usertable(id integer) ' );
上述语句执行完,在database0和database1数据库的public模式中就应该有usertable这个表了,如果没有这个表,那就是前面某一步出错了啦。
(2)在usertable表中插入数据
在pgadmin3中选择proxy数据库,打开query tool ,输入如下建立usertable的语句并执行
select  dmlexec( ' insert into usertable values(0) ' );
select  dmlexec( ' insert into usertable values(1) ' );
select  dmlexec( ' insert into usertable values(2) ' );
select  dmlexec( ' insert into usertable values(3) ' );
select  dmlexec( ' insert into usertable values(4) ' );
select  dmlexec( ' insert into usertable values(5) ' );
select  dmlexec( ' insert into usertable values(6) ' );
select  dmlexec( ' insert into usertable values(7) ' );
select  dmlexec( ' insert into usertable values(8) ' );
select  dmlexec( ' insert into usertable values(9) ' );
select  dmlexec( ' insert into usertable values(10) ' );
上述语句执行完之后能看到database0和database1这两个数据库的usertable表中已经有10行数据了啦。
(3)搜索usertable表中数据
在pgadmin3中选择proxy数据库,打开query tool ,输入如下建立usertable的语句并执行
select   *   from  dqlexec( ' select * from usertable  ' as  (id  integer );
获得结果是
3
4
5
6
7
8
10
0
1
2
9
好了,到这就算完成了。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值