zoukankan      html  css  js  c++  java
  • 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
    官方手册

  • 相关阅读:
    angular2怎么使用第三方的库(jquery等)
    线性代数:方程组的几何解释
    2016新的计划
    ES+Hbase对接方案概述
    sparkR操作HDFS上面的CSV文件
    spark1.6配置sparksql 的元数据存储到postgresql中
    spark读写Sequoiadb
    Spring Boot与Docker部署
    Docker中使用Tomcat并部署war工程
    CentOS7安装使用Docker
  • 原文地址:https://www.cnblogs.com/wangbin/p/1435306.html
Copyright © 2011-2022 走看看