• pgSQL 集群过程


    需求: 工作需要
         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
    官方手册

  • 相关阅读:
    Linux中的官方源、镜像源汇总
    提示"libc.so.6: version `GLIBC_2.14' not found"
    win8.1 安装msi软件出现 2503、2502
    平均负载(Load average)
    oracle 导入报错:field in data file exceeds maximum length
    一个命令的输出作为另外一个命令的输入
    Http 状态码
    Linux 命令总结
    ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法
    轻松应对IDC机房带宽突然暴涨问题
  • 原文地址:https://www.cnblogs.com/wangbin/p/1435306.html
Copyright © 2020-2023  润新知