pl proxy 集群示例配置过程

默认分类 · 2013-01-28

零、参考资料

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

好了,到这就算完成了。。。。

postgresql
Theme Jasmine by Kent Liao