需求: 工作需要
3种集群模式
pgCluster.................全热备集群....都读写....每台节点都保持数据完整
pg Slony-I or II..........主从集群.....从只读....主读写
pg plporxy................分流特性.....负载平衡.....分布到节点上
目的: 在 plproxy 上做查询,从node返回结果.
环境: 3台centos: 1台做plproxy 2台做node
步骤: 如下:
1. 安装pgsql,所有pgsql都要装
版本3.xx........编译源码,rpm 都可以.安装方法看readme或者install文档.
源码安装.............默认都装在/usr/local/pgsql/下.
处理一下环境变量的问题.........export PATH=$PATH:/usr/local/pgsql/bin
初始化数据库目录.................initdb -D /usr/local/pgsql/data
生成一个数据库................createdb 数据库名
添加plpgsql语言支持..................createlang plpgsql 数据库名
修改 pgsql 的配置文件.......vi /usr/local/pgsql/data/postgresql.conf
取消注释.........listen_addresses = '*'
............port = 5432
添加用户认证...............host 数据库名 用户名 ip地址 trust
2 安装plproxy.....只在proxy上安装,node不用安装
解包........make && make install
添加plproxy支持..psql -f /usr/local/pgsql/share/contrib/plproxy.sql 数据库名
在P1上创建schema
psql testproxy ..............用psql客户端连接数据库
create schema plproxy; ........生成schema.
vi MyClusterInit.sql,然后把下面的内容保存:(去掉注释)
################# begin ###################
CREATE OR REPLACE FUNCTION plproxy.get_cluster_partitions(cluster_name text)
RETURNS SETOF text AS $$
BEGIN
IF cluster_name = 'MyCluster' THEN
RETURN NEXT 'dbname=test1 host=192.168.1.190';<----节点ip
RETURN NEXT 'dbname=test2 host=192.168.1.193';<----节点ip
RETURN;
END IF;
RAISE EXCEPTION 'Unknown cluster';
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION plproxy.get_cluster_version(cluster_name text)
RETURNS int4 AS $$
BEGIN
IF cluster_name = 'MyCluster' THEN
RETURN 1;
END IF;
RAISE EXCEPTION 'Unknown cluster';
END;
$$ LANGUAGE plpgsql;
create or replace function plproxy.get_cluster_config(cluster_name text, out key text, out val text)
returns setof record as $$
begin
key := 'statement_timeout';
val := 60;
return next;
return;
end; $$ language plpgsql;
################ end #################
psql -f MyClusterInit.sql -d testproxy...........执行上述sql语句.
以上proxy设置完成..............................................
开始节点的设置:
给每个节点都创建一个函数:方法同上:vi到一个文件中,然后执行这个文件.内容如下:
######################### begin ########################
create or replace function public.dquery(query text) returns setof record as $$
declare
ret record;
begin
for ret in execute query loop
return next ret;
end loop;
return;
end;
$$ language plpgsql;
create or replace function public.ddlExec(query text) returns integer as $$
declare
ret integer;
begin
execute query;
return 1;
end;
$$ language plpgsql;
create or replace function public.dmlExec(query text) returns integer as $$
declare
ret integer;
begin
execute query;
return 1;
end;
$$ language plpgsql;
############################## end ######################
psql -f 这个文件名 -d database name -h ip地址
4. 然后在proxy上建立相同的函数,用于集群检索.建立,执行方法同上:
CREATE OR REPLACE FUNCTION public.dquery(query text) RETURNS setof
record AS $$
CLUSTER 'MyCluster';
RUN ON ALL;
$$ LANGUAGE plproxy;
CREATE OR REPLACE FUNCTION public.ddlexec(query text) RETURNS setof integer
AS $$
CLUSTER 'MyCluster';
RUN ON ALL;
$$ LANGUAGE plproxy;
CREATE OR REPLACE FUNCTION public.dmlexec(query text) RETURNS setof integer
AS $$
CLUSTER 'MyCluster';
RUN ON ANY;
$$ LANGUAGE plproxy;
########################### done ###########################
5. 测试
方法:在proxy,nodes上建立相同的表
用select,insert,del 在proxy执行.然后每个node上都有响应..
代码: select * from public.ddlexec(
'create table usertable(id primary key,
username varchar(20)'
);
.......................在数据节点上生成一个表usertable,
然后可以插入一些数据测试:
select * from public.ddlexec(
'insert into usertable(id,username) values(1,'aaa')');
6. 如果失败请: 参考 pgsql 官方手册