CentOS plproxy查詢安裝pgsql編譯源碼
CentOS plproxy經過長時間的發展,這里我發表一下個人理解,下面就這就來講術CentOS plproxy。CentOS plproxy需求: 工作需要3種集群模式.
- pgCluster全熱備集群都讀寫每臺節點都保持數據完整
- pg Slony-I or II主從集群從只讀主讀寫
- pg plporxy分流特性負載平衡分布到節點上
目的: 在 CentOS plproxy 上做查詢,從node返回結果環境: 3臺centos: 1臺做CentOS plproxy 2臺做node步驟: 如下:
1 安裝pgsql,所有pgsql都要裝版本3xx編譯源碼,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/postgresqlconf取消注釋listen_addresses = '*'port = 5432添加用戶認證host 數據庫名 用戶名 ip地址 trust
2 安裝CentOS plproxy只在proxy上安裝,node不用安裝解包make && make install添加CentOS plproxy支持psql -f /usr/local/pgsql/share/contrib/plproxysql 數據庫名在P1上創建schema psql testproxy 用psql客戶端連接數據庫create schema plproxy; 生成schemavi MyClusterInitsql,然后把下面的內容保存:(去掉注釋)begin
- CREATE OR REPLACE FUNCTION plproxyget_cluster_partitions(cluster_name text)
- RETURNS SETOF text AS $$
- BEGIN
- IF cluster_name = 'MyCluster' THEN
- RETURN NEXT 'dbname=test1 host=1921681190';<----節點ip
- RETURN NEXT 'dbname=test2 host=1921681193';<----節點ip
- RETURN;
- END IF;
- RAISE EXCEPTION 'Unknown cluster';
- END;
- $$ LANGUAGE plpgsql;
- CREATE OR REPLACE FUNCTION plproxyget_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 plproxyget_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 MyClusterInitsql -d testproxy執行上述sql語句以上CentOS plproxy設置完成開始節點的設置:給每個節點都創建一個函數:方法同上:
vi到一個文件中,然后執行這個文件內容如下:
begin create or replace function publicdquery(query text) returns setof record as $$declare ret record;beginfor ret in execute query loopreturn next ret;end loop;return;end;$$ language plpgsql;create or replace function publicddlExec(query text) returns integer as $$declare ret integer;begin execute query; return 1;end;$$ language plpgsql;create or replace function publicdmlExec(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 publicdquery(query text) RETURNS setofrecord AS $$CLUSTER 'MyCluster';RUN ON ALL;$$ LANGUAGE CentOS plproxy;CREATE OR REPLACE FUNCTION publicddlexec(query text) RETURNS setof integerAS $$CLUSTER 'MyCluster';RUN ON ALL;$$ LANGUAGE CentOS plproxy;CREATE OR REPLACE FUNCTION publicdmlexec(query text) RETURNS setof integerAS $$CLUSTER 'MyCluster';RUN ON ANY;$$ LANGUAGE plproxy; done
5 CentOS plproxy測試 方法:在proxy,nodes上建立相同的表 用select,insert,del 在proxy執行然后每個node上都有響應 代碼: select * from publicddlexec( 'create table usertable(id primary key,username varchar(20)' );在數據節點上生成一個表usertable,然后可以插入一些數據測試:
select * from publicddlexec(
'insert into usertable(id,username) values(1,'aaa')');
6 CentOS plproxy如果失敗請: 參考 pgsql 官方手冊
【編輯推薦】