Chinaunix首页 | 论坛 | 博客
  • 博客访问: 245824
  • 博文数量: 52
  • 博客积分: 2263
  • 博客等级: 大尉
  • 技术积分: 695
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-28 12:00
文章分类

全部博文(52)

文章存档

2010年(2)

2009年(20)

2008年(30)

分类:

2008-11-26 21:31:49

需求: 工作需要
     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

阅读(1972) | 评论(0) | 转发(0) |
0

上一篇:网络监控 mrtg

下一篇:freebsd提示符的颜色

给主人留下些什么吧!~~