[PostgreSQL][Slony]如何在Slony環境下實現Partitionting

Slony-I的官方文件內有寫到:

5.3 Partitioning Support:
Slony-I does not directly provide support for the PostgreSQL methodology of partitioning via inheritance, but it does not, by the same token, prevent the Gentle User from using that sort of replication scheme, and then replicating the underlying tables.

那如何完成slony的自動化Table Partition就是本文的課題啦~

1. 環境準備
    a). 準備兩個Linux VM(這裡用CentOS),ip各為192.168.38.25~26。
    b). 先利用這章建立slony的環境,確保slony有正常運作。
    c). 安裝PLSH extension (不知怎裝看這邊喔!!)。

2. 步驟
    a). Create Database 在slony的兩個節點。
        SQL> CREATE DATABASE demo WITH ENCODING='UTF8' OWNER=slony;
    b). 建立所需Function

    c). 建立要做測試的table
    d). 建立Trigger Function for Partition Parent Table
    e). Create Trigger
    f). 在Slony的兩台機器上建立/slony folder,並且建立以下兩個檔案。
    g). 建立連線資訊檔pg_service.conf於/slony下(兩台都要)。
 
    h). 接著把 master的demo DB dump出來直接倒到 Slave的demo DB。
        // master
        # /opt/PostgresPlus/9.2AS/bin/pg_dump -s -U enterprisedb demo > /tmp/demo.dump
        # scp /tmp/demo.dump root@192.168.38.26:/tmp/
     
        // slave
        #/opt/PostgresPlus/9.2AS/bin/psql -U enterprisedb demo < /tmp/demo.dump

    i). 開始Slony的步驟
        // master:
        # export PGSYSCONFDIR=/slony
        # cd /slony
        # ./initcluster.sk
        # ./addnode.sk
        # ./addpaths.sk
        # ./buildset.sk
        # ./addtables.sk
        # /opt/PostgresPlus/9.2AS/bin/slon -f 192.168.38.25.slon > slon.log 2>&1 &

        // slave:
        # export PGSYSCONFDIR=/slony
        # cd /slony
        # /opt/PostgresPlus/9.2AS/bin/slon -f 192.168.38.26.slon > slon.log 2>&1 &
        # ./subscribeset.sk
 
    j). 更改Slony的預設Function add_empty_table_to_replication 因為這個function裡面有一行 raise notice 'add_empty_table_to_replication: table % empty on origin - OK', v_fqname; 會導致PLSH 在收到這個notice時判定shell 是失敗的。所以我們要mark掉它!!注意兩台都要改喔!!
 
    k). 完成後,會得到Slony的環境如下圖

    l). 試著對server_master做insert吧,結果如下!!
// random function
CREATE OR REPLACE FUNCTION get_random_number(INTEGER, INTEGER) RETURNS INTEGER AS $$
DECLARE
    start_int ALIAS FOR $1;
    end_int ALIAS FOR $2;
BEGIN
    RETURN trunc(random() * (end_int-start_int) + start_int);
END;
$$ LANGUAGE 'plpgsql' STRICT;

//查日期區間
select extract(epoch from now() + INTERVAL '5 years');
比方要查今天到及五年後就是
select extract(epoch from now() );   -- 1381284339
select extract(epoch from now() + INTERVAL '5 years');  --1539050759

//產生100筆資料
SQL # insert into server_master1 select generate_series(1,100), 1,'auto gen',get_random_number(1381284339,1539050759);

//直接轉insert 到 parent table,會產出所有的child table,而且都是加入slony的喔!!
SQL # insert into server_master select a.id, a.server_id, a.disk, a."time" from server_master1 a;


沒有留言:

張貼留言