pgSQL 集群过程z

    技术2022-05-11  6

    需求: 工作需要     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 setofrecord AS $$CLUSTER 'MyCluster';RUN ON ALL;$$ LANGUAGE plproxy;CREATE OR REPLACE FUNCTION public.ddlexec(query text) RETURNS setof integerAS $$CLUSTER 'MyCluster';RUN ON ALL;$$ LANGUAGE plproxy;CREATE OR REPLACE FUNCTION public.dmlexec(query text) RETURNS setof integerAS $$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 官方手册 <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

    最新回复(0)