您的位置:首页 > 数据库

利用Slony进行Postgresql集群的研究

2011-01-05 00:37 260 查看

摘要:Postgresql是非常优秀的开源数据库系统软件,postgresql已被广泛应用于各种管理信息系统及网站中。本文将探讨如何利用slony开源软件对postgresql进行主-从式集群的配置及管理,从而使得postgresql能更强大的处理各种查询请求。

关键词: open source; postgresql; slony; cluster; configuration
    PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户。PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备,比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。
    在许多情况下,postgresql单服务的处理各种查询请求已经不能满足用户的需要。因此为了使得postgresql支持集群功能,开发者们在开源项目中建立了slony项目,slony1是基于postgresql的异步通知机制做的复制技术,其同步速度非常快。Slony1是所有因海量查询导致服务器负荷过载的解决方案,本文将对其配置及管理进行研究和分析。
 

一、          Slony原理分析及应用

(一)Slony原理分析

主从式集群的优点在于数据的变更都集中在一台服务器上,其他的从机的数据基本不能变更,完全接受主机的数据变更的异步通知。如图1所示:

主结点

子结点1

2级主结点

2级子结点1
 

子结点2

2级子结点2

互联网

图1
Slony1通过数据库数据的变更通知,及时更新子结点的数据。Slony1在局域网的复制速度相当的快,经过笔者实验,数据几乎达到同步变更。
(二)Slony的管理及配置
    Slony1、postgresql可以从http://www.postgresql.org/download/ 上获得。
    首先安装配置postgresql
    ./configure  --prefix=/usr/local/pgsql –localstatedir=/home/postgres/data
    gmake
    gmake install
    修改postgresql的配置。
    vi /home/postgre/data/postgresql.conf //修改 postgresql.conf 做相应配置
    修改 /test/spescso/data/pg_hba.conf,修改双机相互认证问题,否则不能相互访问
    # TYPE DATABASE USER CIDR-ADDRESS METHOD
    # "local" is for Unix domain socket connections only
    local all all trust
    # IPv4 local connections:
    host all all 127.0.0.1/32 trust
    host all all 192.168.0.0/24 trust
    # IPv6 local connections:
    host all all ::1/128 trust
 
    安装 slony1 数据同步软件(主从都安装)
    ./configure  --with-pgsourcetree=<postgresql   源代码目录>
    gmake
    gmake install
    然后用postgresql的createdb命令建立相应的试验数据库,从主服务器安装数据库系统及slony1软件的方式相同。主从服务器上分别建立结构相同的数据,以备后面使用。
    在主机方面建立相应的shell控制脚本程序slonystart.sh,见下例:
#!/bin/sh
    SLONIK=/home/mytest
    SLON=/home/mytest
    CLUSTER_NAME=newdean
 
    MASTER="host=192.168.0.16 dbname=testdb port=5432 user=slony password=12345"
    SLAVE="host=192.168.0.17 dbname= testdb port=5432 user=slony password=12345"
    LOG=/tmp
    uninstall()
    {
        $SLONIK << _EOF_
        cluster name = $CLUSTER_NAME;
 
        node 1 admin conninfo = '$MASTER';
           node 2 admin conninfo = '$SLAVE';
      
        uninstall node (id = 2);
        uninstall node (id = 1);
    _EOF_
    }
 
    install()
    {
      $SLONIK << _EOF_
           # 定义集群名字
           cluster name = $CLUSTER_NAME;
 
          # 定义两个节点
           node 1 admin conninfo = '$MASTER';
           node 2 admin conninfo = '$SLAVE';
           try
        {
            # 初始化主节点
                init cluster (id=1, comment = 'Master Node');
                # 创建一个复制集合
                create set (id=1, origin=1, comment = 'All tables');
              # 在复制集合中添加一个需要复制的序列
                include </home/mytest/mytest.slonik>;
              # 创建从节点
              store node (id = 2, comment = 'Slave node');
              # 定义节点之间的访问路径
              store path (server = 1, client = 2, conninfo = '$MASTER');
              store path (server = 2, client = 1, conninfo = '$SLAVE');
              # 定义事件监听
              store listen (origin = 1, provider = 1, receiver = 2);
               store listen (origin = 2, provider = 2, receiver = 1);
               # 订阅复制集合
                subscribe set (id = 1, provider = 1, receiver = 2, forward = no);
        }
        on success{
            echo 'Install OK!';
        }
          on error{
              echo 'Install FAIL!';
          }
    _EOF_
    }
    start()
    {
       # 启动复制守护进程
       $SLON $CLUSTER_NAME "$MASTER" >> /tmp/master.log &
       #$SLON $CLUSTER_NAME "$SLAVE" >> /tmp/slave.log &
    }
    stop()
    {
       killall slon
    }
    case $1 in
       'install')
           install
        ;;
      'uninstall')
        uninstall
          ;;
      'start')
          start
          ;;
      'stop')
          stop
          ;;
      *)
          echo "usage: $0 {install|uninstall|start|stop} "
           ;;
    esac
    并在mytest.slonik例表文件中罗列需要同步的表名。如下示:
    SET ADD TABLE (SET ID = 1,ORIGIN = 1,ID = 1,FULLY QUALIFIED NAME = testtable1',COMMENT = 'systemtable');
    SET ADD TABLE (SET ID = 1,ORIGIN = 1,ID = 2,FULLY QUALIFIED NAME = '    testtable12',COMMENT = 'systemtable');
    SET ADD TABLE (SET ID = 1,ORIGIN = 1,ID = 3,FULLY QUALIFIED NAME = '    testtable13',COMMENT = 'systemtable');
 
    在子结点上建立shell程序slonyup.sh,如下例
    #!/bin/sh
    killall -9 slon
    slon newdean "host=192.168.0.17 dbname=testdb port=5432 user=slony password=12345" >>/tmp/s
    lave.log&
    然后在主服务器上执行:
    pg_dump -O -s -x -n public testdb|psql -h 192.168.0.17 testdb
    slonystart.sh install
    slonystart.sh start
    在从服务器上执行
    slonyup.sh
    到此,主服务器节点和从服务器节点都已配置完毕,读者可以试着增加数据或修改数据以验证主从集群服务器的工作状态。笔者通过开发相应的主服务器和从服务器的查询程序,使的数据变更主要发生在主服务器上,查询要求全部集中在从服务器上,从而大大提高数据库的响应速度及处理能力。在增加多个节点服务器的条件下,数据库服务器的处理能力和服务能力呈级数增加。
    二、结束语
    利用slony开源软件对postgresql数据进行集中,大大提高了数据库服务器的服务能力,解决了单个postgresql在处理海量查询语句出现瓶颈的问题。由于这种集群形式可以经由internet进行,从而提高了postgresql在分散分布情况下的数据服务和处理能力。使得postgresql的实际生产利用率大大增强。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息