2011年12月6日 星期二

Ubuntu下PostgreSQL資料庫集群(PL/Proxy)配置方法


首先解釋一下資料庫集群N個資料庫堆到一起,找一個當個頭頭,管理所有的資料庫並讓它們協同工作。當然了,要不要找個頭頭,找幾個頭頭,如何協作等等問題這些都可以商量和約定,因此,也就形成了不同的資料庫集群。
如果資料庫系統是PostgreSQL,這個集群就是PostgreSQL資料庫集群
PostgreSQL
資料庫管理集群的方法有很多,有人提出了PL/Proxy方式的集群(這才是本文的重點)。這個PL/Proxy方式的集群是這樣的:有很多安裝了PostgreSQl資料庫的電腦,有台電腦是頭頭,我們把這個頭頭叫做proxy,其他的叫做database0database1……。當然名字叫什麼是無所謂的,關鍵是有個是頭頭,其他的受頭頭指揮。
看個例子吧:以三台機器的集群為例子,看看PostgreSQL集群的架構是什麼。
proxy節點proxy節點實際上也是一個PostgreSQL資料庫 節點,但是所有資料均不存放到proxy節點上,主要做三件事情:
1.
接受用戶的sql查詢;
2.
分析用戶的sql查詢並轉換成集群上執行的SQL語句;
3.
合併集群執行sql的結果,然後返回給用戶。
說白了,就是把用戶的sql語句交給database0database1去執行,然後合併執行結果返回給用戶。
database1節點和 database2節點:
就是普通的資料庫節點,接收proxy節點的sql查詢請求並返回結果給proxy節點,是真正存放資料的節點。
沒圖沒真相,還是來張集群結構圖,結構更清晰一些:
看了原理圖,是不是覺得很簡單,稍微瞭解技術的人都能想到這種架構。既然這麼簡單,那就開始創建一個資料庫集群吧,需求如下
1.創建一個如集群結構圖所示的集群,資料庫集群中均操作同一個資料庫“JiwanCluster”
2.
用戶通過用戶端操作proxy節點在集群中創建一個表user(說白了就是要通過集群的方法在Database0Database1JiwanCluster中創建一個叫做user的表);
3.
用戶通過用戶端操作proxy節點在集群上插入多個記錄資訊到集群的user表上(需要把插入操作分佈到兩個Database節點上);
4.
用戶通過用戶端操作proxy節點在集群上查詢集群上的所有user記錄
需求不算難吧,不過很不幸,如果你對PostgreSQL不熟悉的話,你仍然搭建不了資料庫(反正我看了原理後,還是搭建不了)。原理嘛,這東西太官方了,來點操作性較強的步驟(版本號需要留意一下,版本不同的話,可能會導致情況大不相同):
第一步:創建三個空的虛擬機器器並把這三台虛擬機器的網卡設置搞定(比如,是否橋接,是否NAT之類)(有錢的話,自己買三台電腦,3條網線和一個集線器)。
可以創建虛擬機器的軟體如VMWare VirtualPC Xen等等,本文的實驗用的是VMWare,原因是我對VMWare比較熟悉;
第二步:三個虛擬機器全部安裝Ubuntu-10.04
這個嘛,沒有什麼說的,但是對於新人,這個到西還要再說一下。你可以到Ubuntu的官方網站http://www.ubuntu.com/上找到下載地址,我當時的下載的地址是http://ubuntu.positive-internet.com/releases/lucid/ubuntu-10.04-desktop-i386.iso
第三步:三個虛擬機器全部安裝PostgreSQL資料庫系統
如何安裝和配置請參見Ubuntu Postgresql-8.4安裝及配置
第四步:做個額外的動作,將每台伺服器的設定成允許任何機器使用任何帳號訪問任何資料庫(實驗嘛,沒關係的,照做就行了):
root@ubuntuserver:~# vi /etc/postgresql/8.4/main/pg_hba.conf
—>
改變行:host all all 0.0.0.0 0.0.0.0 md5
—>修改為:host all all 0.0.0.0 0.0.0.0 trust
如果沒有此行則添加此行,具體說明參見Ubuntu Postgresql-8.4安裝及配置
第五步:三個虛擬機器全部創建資料庫JiwanCluster
root@ubuntuserver:~# psql –U postgres -h 127.0.0.1
postgres=#
 create database “JiwanCluster”;
創建資料庫的詳細方法請參見Ubuntu Postgresql-8.4安裝及配置
——–章節淩亂,先來個完美分割線”——–
PS
:現在的三台機器都能提供資料庫服務了,而且在任何一台機器使用用戶端都可以自由的訪問其他資料庫伺服器中的”JiwanCluster”資料庫,不過他們還不是集群,僅僅是可以相互訪問的資料庫伺服器而已,他們之間沒有任何協作關係。下面創建PL/Proxy方式的協作關係(嫌這個詞太土?!那就換一個:創建PostgreSQL 資料庫集群)。
——–
章節淩亂,先來個完美分割線”——–
第六步:在 proxy 節點上安裝過程語言plproxy(安裝 plproxy 必須使用 root 用戶,否則不能正常安裝,我安裝後的plproxy版本是plproxy-2.0.4):
sudo apt-get install postgresql-8.4-plproxy
下面是解釋,不想瞭解的話,可以直接跳過。
這一步的目的是:使proxy節點知道怎樣指揮集群(實驗中,就是指揮database0database1),換句話就是說,讓prxoy知道三件事情:
怎樣把用戶的SQL請求發送給集群的節點;
怎樣接受集群的處理結果;
怎樣將處理後的結果返回給用戶。
這一步的實質是:複製plproxy.so檔到目錄”/user/lib/postgresql/8.5/lib”的下麵;複製plproxy.sql檔到目錄”/usr/share/postgresql-8.4-plproxy”下面(這個目錄是安裝程式創建的,plproxy.sql檔是給下一步創建plproxy語言使用的,不是必須的,完全可以在需要的時候自己寫相應的SQL語句)。這兩個檔的存在是這一步安裝成功的一個標誌。
需要注意的是:安裝過程語言是對資料庫系統而言的,可以認為僅僅是複製了一些需要的檔而已,之後使用這個過程語言的之前,還要分別為每一個需要使用此過 程語言的資料庫創建這個語言(說白了,就是還要告訴每個資料庫到那裡找相應的檔plproxy.so檔,下一步有解釋)。
執行後在檔流覽器中的效果是:
第七步:為proxy節點上的資料庫”JiwanCluster創建plproxy過程語言(前提是你之前安裝過這個語言):
root@ubuntuserver:~# psql -U postgres -h 127.0.0.1 -f /usr/share/postgresql-8.4-plproxy/plproxy.sql JiwanCluster
這條語句的實質是:在資料庫系統表pg_language中添加一行記錄。
執行後在pgAdmin3用戶端觀看到的效果是:
當然要是你嫌每次都要創建語言麻煩,你可以將過程語言創建到template1資料庫中,這樣每次創建資料庫的時候,所的語言都自動創建好了(創建資料庫 的過程實際上就是複製templated1範本資料苦的過程)。
下面是解釋,不想瞭解的話,可以直接跳過。
這一步的目的是告訴資料庫”JiwanCluster”遇到plproxy的過程函數時候怎麼處理。
文件plproxy.sql的內容如下:
– handler function
CREATE FUNCTION plproxy_call_handler () RETURNS language_handler
AS ‘$libdir/plproxy’ LANGUAGE C;
– language
CREATE LANGUAGE plproxy HANDLER plproxy_call_handler;
解釋一下:
–handler function
之下的代碼的作用是創建一個函數,名字叫做plproxy_call_handler,返回類型是language_handler,他的定義在資料夾”$libdir”之下的plproxy.so文件中plproxy.so是一個由C語言編譯而成的.so文件;
– language
之下的代碼的作用是創建一個過程語言,過程語言的名稱是plproxy,處理這個過程語言的函數是plproxy_call_handler,過程語言的原始程式碼就是這個函數的參數。
可見,實際過程語言就是一個“C”語言函數的字串參數
這裡有必要提及一下過程語言的前世今生過程語言的官方解釋見http://www.pgsqldb.org/pgsqldoc-cvs/xplang.html 。:
PostgresSQL資料庫系統裡,除了使用系統自帶的函數(count(), max())外,還可以使用你自己編寫的函數。編寫函數的語言可以是sqlC語言,也可以是指定的過程語言(比如plproxy過程語言,plpgsql過程語言,你也可以自己寫一個過程語言)。編寫sql語言/C語言/plproxy過程語言的函數的例子如下:
CREATE OR REPLACE FUNCTION fun_sql_test()
RETURNS INTEGER AS
$BODY$
SELECT 1;
$BODY$
LANGUAGE ‘sql VOLATILE
—————————–
CREATE OR REPLACE FUNCTION fun_c_test()
RETURNS INTEGER AS
‘$libdir/c_test’, ‘fun_c_test’
LANGUAGE ‘c VOLATILE
—————————–
CREATE OR REPLACE FUNCTION fun_plproxy_test()
RETURNS integer AS
$BODY$
CLUSTER ‘jiwan’;
RUN ON ALL;
$BODY$
LANGUAGE ‘plproxy VOLATILE
—————————–
這樣就創建了三個函數fun_sql_test()fun_c_test()fun_plproxy_test()
對於fun_sql_test(),執行很簡單:
0.
使用者執行fun_sql_test()函數;
1.
執行$BODY$語句包圍的sql語句;
2.
返回一個整形的數值1
對於fun_c_test(),執行的順序是:
0.
使用者執行fun_c_test()函數;
1.
$libdir目錄(這段文字會被PostgreSQL替換成PostgreSQL的庫目錄:“/user/lib/postgresql/8.5/lib“)載入c_test.so文件(.so檔是linux系統的共用檔,相當於windows下的.dll文件)
2.
執行c_test.so中的fun_c_test()函數。
3.
返回一個整形的數值。
對於fun_plproxy_test(),執行的順序是(第1步載入.so檔的執行時間不一定正確,僅僅是為了說明過程語言的執行原理,下同):
0.
使用者執行fun_plproxy_test()函數;
1.
根據plproxy過程語言的配置載入plproxy.so檔( 根據之前“create language”語句中的參數’$libdir/plproxy’);
2.
提取$BODY$語句包圍的語句 (這個就是所謂的過程語言原始程式碼):CLUSTER ‘jiwan’; RUN ON ALL
3.
根據plproxy過程語言的配置調用過程語言的語言控制碼函數plproxy_call_handler並把上一步中提取的過程語句作為它的參數;
4.
返回一個整形的數值。
可見,實際上過程語言就是一個“C”語言函數的字串參數。不管是誰寫的過程語言, PostgreSQL中的函數的處理方式大致都是這樣的:
0.
使用者執行某種過程語言的函數;
1.
根據過程語言的配置載入相應的.so文件;
2.
函數體中的原始程式碼(簡單的說,就是一段文本)抽取出來(函數體中的文本需要根據相應的.so檔的約定去書寫,你不按照它的約定,它就會狀告你說:編譯錯誤);
3.
根據過程語言的配置調用語言控制碼函數並把之前提取的過程語句作為它的參數。
目前在標準的 PostgreSQL 發佈裡有四種過程語言可用: PL/pgSQL PL/Tcl PL/Perl PL/Python等等過程函數。
當然,你也可以自己寫一個模組用於解析函數體中的原始程式碼,簡單的說,就是你自己寫一個.so檔,把這個.so檔複製到目錄“/user/lib/postgresql/8.5/lib“的下面(這個不是必須的,不過呢,plpgsql.so在這個目錄下面,plproxy.so檔也在這個目錄下面,就跟一下風吧!)。我們把複製.so檔的 這一步操作叫做安裝過程語言(多玄乎啊,嚇唬小白必須學會這個詞!)這個.so檔中應該包含語言控制碼函數和驗證器函數(這個可選)。
第八步:為proxy節點的”JiwanCluster”資料庫創建plpgsql過程語言:
sudo -u postgres psql JiwanCluster
JiwanCluster=# create language plpgsql;
或者:sudo -u postgres createlang plpgsql “JiwanCluster”
下面是解釋,不想瞭解的話,可以直接跳過。
關於過程語言plpgsqlplproxy之間的關係:
之所以創建plpgsql語言,是因為plproxy過程語言本身需要調用plproxy目錄下的三個由plpgsql過程語言定義的三個函數。
plpgsql postgresql自帶過程語言(含義是,安裝 postgresql資料庫的時候plpgsq.so檔就會被安裝到postggresqllib資料夾下,對於apt-get install postgresql方式安裝的8.4版本資料庫系統的lib資料夾是/usr/lib/postgresql/8.4)
自帶的含義就是“HANDLER plpgsql_call_handler”; “VALIDATOR plpgsql_validator;” 這兩個函數應該是資料庫系統為plpgsql過程語言預設設置的handler函數和validator函數(這個是我的猜測,還沒有證實),所以創建plpgsql的時候不需要指定handler函數和validator函數( 然,validator函數本省就是可選的)。有圖有真相:

如果資料庫系統中的範本資料template1沒有創建plpgsql過程語言的話,每一個資料庫要使用plpgsql語言之前,都需要創建該語言,以資料庫JjiwanCluster為例的語句是:
sudo -u postgres createlang plpgsql “JiwanCluster”
plproxy 是用於集群的過程語言,定義了RUN ON ALL/ANY/0/1/2/3…. 等等函數,安裝該語言的語句:
CREATE PROCEDURAL LANGUAGE ‘plproxy’ HANDLER plproxy_call_handler;
當然了,plproxy不是系統自帶的過程語言,是通過apt-get install postgresql-8.4-plproxy安裝的過程語言(實際上主要就是下載了plproxy.so檔),為了告訴資料庫過程語言的情況,所以需 要編寫plproxy_call_handler
CREATE OR REPLACE FUNCTION plproxy_call_handler() RETURNS language_handler AS
‘$libdir/plproxy’, ‘plproxy_call_handler’
LANGUAGE ‘c’ VOLATILE
plproxy 過程語言在定義plproxy.get_cluster_config plproxy.get_cluster_partitions plproxy.get_cluster_version三個函數的時候使用的也是plpgsql過程語言。
第九步:在proxy節點上創建名字為plproxyschema:
root@ubuntuserver:~# sudo -u postgres psql -d “JiwanCluster”
JiwanCluster=# create schema plproxy;
下面是解釋,不想瞭解的話,可以直接跳過。
關於schemaschema的中文含義就是一個目錄(可能不準確),是用來組織資料庫中的各個物件的(PostgreSQLORDBMSO就是物件的意思,比如資料表,函數等等),系統預設有一個publicschema,所有物件預設創建的位置都是public下,使用public下的物件也不需要首碼(比如public下有一個user的表,那麼public.user等價於user)plproxy這個schemaproxy過程語言所需要的schemaproxy語言需要調用這個schema下的三函數,具體原因下面會說到)。其實創建schema的實質是:在系統的schemata資料表中添加一行資料。
執行後在pgAdmin3用戶端觀看到的效果是:
第十步:在proxy節點上的plproxy目錄下創建三個函數
get_cluster_config
get_cluster_partitions
get_cluster_version
root@ubuntuserver:~# sudo -u postgres psql JiwanCluster
創建函數的SQL代碼如下:
CREATE OR REPLACE FUNCTION
 plproxy.get_cluster_config(IN cluster_name text, OUT “key” text, OUT val text)
RETURNS SETOF record AS
$BODY$
BEGIN
key := ‘statement_timeout’;–
就是給 key 變數賦值,賦的值為’statement_timeout’
val := 60;–
就是給 val 變數賦值,賦的值為 60
RETURN NEXT;
RETURN;
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE
COST 100
ROWS 1000;
CREATE OR REPLACE FUNCTION plproxy.get_cluster_partitions(cluster_name text)
RETURNS SETOF text AS
$BODY$
BEGIN
IF cluster_name = ‘jiwan’ THEN–cluster_name
是群集的名字
RETURN NEXT ‘dbname=JiwanCluster host=
10.13.19.55‘; –資料庫節點的資料庫名和 IP 位址
RETURN NEXT ‘dbname=JiwanCluster host=
10.13.19.70‘; –資料庫節點的資料庫名和 IP 位址
RETURN;
END IF;
RAISE EXCEPTION ‘Unknown cluster’; –
如果群集名不存在,拋出異常,這個是在資料庫內部處理的,最終會寫入日誌中。‘Unknown cluster’是報錯信息
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE
COST 100
ROWS 1000;
CREATE OR REPLACE FUNCTION plproxy.get_cluster_version(cluster_name text)
RETURNS integer AS
$BODY$
BEGIN
IF cluster_name = ‘jiwan’ THEN
RETURN 1;
END IF;
RAISE EXCEPTION ‘Unknown cluster’;
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE
COST 100;
執行後在pgAdmin3用戶端觀看到的效果是:
下面是解釋,不想瞭解的話,可以直接跳過。
三個函數的作用:
plproxy.get_cluster_config:
 這個函數其實是獲取不同的集群的配置,我們這裡可以給不同的集群(比如JiwanCluster等)不同的類似超時時間、長短連接等的設置。
plproxy.get_cluster_partitions:
這個函數是讓plproxy可以找到對應的集群,“JiwanCluster ”是集群的名稱,根據自己的需要指定,這個名稱在後面查詢的時候要用到;”dbname, host 等參數就是PostgreSQL標準的資料庫連接串的配置方法,本試驗中就是database0節點和database1節點的資訊告訴proxy節點。
plproxy.get_cluster_version: 這個函數其實是plproxy用於判斷是否給前端返回已經cache過的結果用的,這樣,因為函數本身可以動態更新(無需down機),那麼我們可以通過重新創建函數,返回不同RETURN的值,實現cache的失效控制。
plproxy過程語言設計的目的是實現資料庫集群,集群受proxy節點管理,proxy獲取集群的資訊(比如節點的IP位址等等資訊)的方法就 是調用上面創建的三個函數,所以配置集群資訊的方法就是創建/修改這三個函數
使用plproxy過程語言的使用者不需要顯式的調用這三個函數,但是在調用plproxy過程語言定義的函數的時候,plproxy過程自己會在內部調用目錄plproxy下的這三個函數:
I.
對於plproxy.get_cluster_configplproxy.get_cluster_partitions函數,內部調用一次後就 不再調用
plproxy.get_cluster_partitions為例子的實驗是:
a.
執行plproxy 過程語言定義的函數–>成功;
b.
刪除plproxy.get_cluster_partitions 數,調用plproxy過程語言定義的函數,執行成功。
一個特殊情況:如果刪除plproxy.get_cluster_partitions函數之前,資料庫系統從未執行過任何plproxy過程語言定義的 函數,執行plproxy過程語言定義的函數將會失敗).
另外一個實驗是:
a.
執行plproxy 過程語言定義的函數–>成功;(集群信息為“dbname=JiwanCluster host=10.13.19.55”dbname=JiwanCluster host=10.13.19.70)
b.
修改plproxy.get_cluster_partitions (集群資訊為“dbname=JiwanCluster host=10.13.19.55”dbname=JiwanCluster host=10.13.19.71 調用plproxy過程語言定義的函數,執行成功。但是使用的集群資訊仍然是:“dbname=JiwanCluster host=10.13.19.55”dbname=JiwanCluster host=10.13.19.70)
II.對於plproxy.get_cluster_version函數,執行plproxy過程語言定義的函數的時候,內部每次都會調用plproxy.get_cluster_version函數 實驗的方法可與參考前面的方法。
總結一下:如果修改了plproxy.get_cluster_configplproxy.get_cluster_partitions ,想立即生效 的話,就需要重啟postgresql服務(其他方法還沒有深究過):/etc/init.d/postgresql-8.4 restart
從網上參考的資料,以及相關pdf中參看的代碼會有一些問題:字元不對 ,同樣為單引號,但是pdf中的單引號是(看清楚:不是正確的,等等之類很難發現的錯誤,嚴重影響了工作進度。
再補充一下:下面的實驗表明 postgresql下的函式定義/修改/刪除是及時生效
創建一個函數:
CREATE OR REPLACE FUNCTION fun_test() RETURNS integer AS
$BODY$ SELECT 33; $BODY$
LANGUAGE ‘sql’ VOLATILE COST 100;
執行這個函數:
select fun_test();———>
正常執行
刪除這個函數:
DROP FUNCTION fun_test;
執行這個函數:
select fun_test(); ——–>
執行失敗:找不到函數fun_test();
——–章節淩亂,先來個完美分割線”——–
PS
:做了這麼多的操作,好累,不過離完成任務還有很遠,不是吧???@@!!!。到現在,我們才僅僅為集群找了個頭頭並告訴這個頭頭一些集群的資訊。接下來要做什麼呢?看看需求吧,有個需求說要能夠通過proxy創建一個叫做user的表格,還有什麼需求來著,還真快忘了
——–
章節淩亂,先來個完美分割線”——–
第十一步:在proxy節點上創建三個函數:
public.ddlexec(sql_request text)
public.dmlexec(sql_request text)
public.dqlexec(sql_request text)
root@ubuntuserver:~# sudo -u postgres psql JiwanCluster
創建的sql代碼是:
CREATE OR REPLACE FUNCTION
 ddlexec(query text)
RETURNS SETOF integer AS
$BODY$
CLUSTER ‘jiwan’;
RUN ON ALL;
$BODY$
LANGUAGE ‘plproxy’ VOLATILE
COST 100
ROWS 1000;
CREATE OR REPLACE FUNCTION dmlexec(query text)
RETURNS SETOF integer AS
$BODY$
CLUSTER ‘jiwan’;
RUN ON ANY;
$BODY$
LANGUAGE ‘plproxy’ VOLATILE
COST 100
ROWS 1000;
CREATE OR REPLACE FUNCTION dqlexec(query text)
RETURNS SETOF record AS
$BODY$
CLUSTER ‘jiwan’;
RUN ON ALL;
$BODY$
LANGUAGE ‘plproxy’ VOLATILE
COST 100
ROWS 1000;
執行後在pgAdmin3用戶端觀看到的效果是:
下面是解釋,不想瞭解的話,可以直接跳過。
這三個函數的作用就是:使用者通過調用者三個函數操縱集群(比如select ddlexec(‘create table usertable’)就會在集群的database0database1上同時創建一個表usertable)。
這三個函數都是plproxy過程語言的函數,函數中的RUN指令會調用集群節點上的同名函數,所以還需為集群上的資料庫節點database0database1創建同名的函數(只要同名,不需要也是plproxy過程語言定義)。
RUN ON
指令之後的的ALL表示在集群上的所有資料庫節點上運行(本試驗就是database0databse1都要執行)
RUN ON
指令之後的的ANY表示在集群上的任取一個資料庫節點上運行(本試驗就是database0databse1中任意取一個執行)
RUN ON
之後也可以是一個數字: 表示在幾號節點上運行,比如 RUN ON 0/RUN ON 1。也可以自己寫一個演算法決定如何分配任務: 比如RUN ON hashtext(表的主鍵值)&1。表示將表的主鍵(文本類型)計算出一個hash值,然和1做與運算。就可以根據主鍵分配資料庫節點。
第十二步:為database0database1節點的”JiwanCluster”資料庫創建plpgsql過程語言
root@ubuntuserver:~# sudo -u postgres psql JiwanCluster
JiwanCluster=# create language plpgsql;
或者:sudo -u postgres createlang plpgsql  “JiwanCluster”
創建的原因是:database0database1節點需要創建一些函數,這些函數是plpgsql過程語言定義的。
第十三步:在database0database1節點上創建下面三個函數
public.ddlexec(sql_request text)
public.dmlexec(sql_request text)
public.dqlexec(sql_request text)
root@ubuntuserver:~# sudo -u postgres psql JiwanCluster
創建的SQL語句如下:
CREATE OR REPLACE FUNCTION ddlexec(query text)
RETURNS integer AS
$BODY$
declare
ret integer;
begin
execute query;
return 1;
end;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE
COST 100;
CREATE OR REPLACE FUNCTION dmlexec(query text)
RETURNS integer AS
$BODY$
declare
ret integer;
begin
execute query;
return 1;
end;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE
COST 100;
CREATE OR REPLACE FUNCTION dqlexec(query text)
RETURNS SETOF record AS
$BODY$
declare
ret record;
begin
for ret in execute query loop
return next ret;
end loop;
return;
end;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE
COST 100
ROWS 1000;
執行後在pgAdmin3用戶端觀看到的效果是:
——–章節淩亂,先來個完美分割線”——–
PS
:到現在,集群才算是搭建完成了,下面還要完成創建/插入/查詢user表的任務。其實,集群搭建完成之後,這些需求都是很容易的。
——–
章節淩亂,先來個完美分割線”——–
第十四步:集群創建user表,在proxy上執行:
root@ubuntuserver:~# sudo -u postgres psql JiwanCluster
JiwanCluster=#
 select ddlexec(‘create table usertable(id integer)’);
可以通過pgAdmin3看到創建的結果:
第十五步:向集群的user表中插入一些資料,在proxy上執行:
root@ubuntuserver:~# sudo -u postgres psql JiwanCluster
select dmlexec(‘insert into usertable values(0)’);
select dmlexec(‘insert into usertable values(1)’);
select dmlexec(‘insert into usertable values(2)’);
select dmlexec(‘insert into usertable values(3)’);
select dmlexec(‘insert into usertable values(4)’);
select dmlexec(‘insert into usertable values(5)’);
select dmlexec(‘insert into usertable values(6)’);
select dmlexec(‘insert into usertable values(7)’);
select dmlexec(‘insert into usertable values(8)’);
select dmlexec(‘insert into usertable values(9)’);
select dmlexec(‘insert into usertable values(10)’);
可以通過pgAdmin3看到創建的結果(資料存到那個節點取決於分配演算法):
第十六步:查詢集群的user表的記錄,在proxy上執行:
select * from dqlexec(‘select * from usertable’) as (id integer);
注意:必須要有as之後的內容,原因是, plpgsql過程語言的record返回類型需要有列定義。
可以通過pgAdmin3看到創建的結果:

沒有留言: