PL/Proxy 介紹
-
一、概述
-
1.PL/Proxy 是一個采用PL Language語言的數據庫分區系統。
-
目的:輕松訪問分區數據庫
- 它的理念是代理遠程函數體內指定。函數調用同樣標簽創建的函數,所以,代理的目標信息需要在代理函數體內指定。
- plproxy是skype開發的一個數據庫組件
- plproxy能夠在PostgreSQL上運行的一種過程語言,能夠完成對遠程數據庫的調用,並能夠完成數據切片的功能。
-
概念圖
-
- 一個實例描述:Thinking PostgreSQL PL/Proxy Used in weibo(微博) Case
- 以三台機器的集群為例子,PostgreSQL集群的架構
- proxy節點:proxy節點實際上也是一個PostgreSQL數據庫 節點,但是所有數據均不存放到proxy節點上,主要做三件事情:
- 1).接受用戶的sql查詢;
- 2).分析用戶的sql查詢並轉換成集群上執行的SQL語句;
- 3).合並集群執行sql的結果,然后返回給用戶。
- 說白了,就是把用戶的sql語句交給database0,database1去執行,然后合並執行結果返回給用戶。
- database1節點和 database2節點:就是普通的數據庫節點,接收proxy節點的sql查詢請求並返回結果給proxy節點,是真正存放數據的節點。
-
- 體系結構如上所示,案例實際配置和過程參考
- 以三台機器的集群為例子,PostgreSQL集群的架構
-
-
2.特性
- 1)PL/Proxy 函數從自己的標簽中檢測遠程函數調用
- 2)函數可以是一個,也可以是集群中的某一個
- 3)如果查詢被分割, 它將並發執行
- 4)查詢在遠程服務器上運行在自動提交模式下
- 5)查詢參數與查詢體分開傳送,因此避免了在兩端的quoting/unquoting 開銷
- 6)不包含代碼連接池,如果需要,可采用外部池程序。
-
3.個人理解:pl/proxy不是一個軟件,與pgbouncer和pgpool不同。只是個在PostgreSQL數據庫基礎之上添加一些.sql文件,通過數據庫執行這些文件最后實現集群的功能,而且能實現數據插入的負載均衡,這與pgxc插入數據時有點相似,它使用一種隨機算法或者輪循方式將數據插入到數據節點當中。
-
通俗的介紹:PL/Proxy方式的集群是這樣的:有很多安裝了PostgreSQl數據庫的計算機,有台計算機是頭頭,我們把這個頭頭叫做proxy,其他的叫做database0,database1……。當然名字叫什么是無所謂的,關鍵是有個是頭頭,其他的受頭頭指揮。
-
-
二、數據流的處理過程
-
流程敘述:首先需要明確的是plproxy只能對用戶自定的方法才有效,如果想達到對sql語句的無條件轉發,plproxy是做不到的,比如希望所有的select * from tablename 都轉發到cluster1上,所有的update語句都轉發到cluster2上,是不能通過plproxy做到的。plproxy能做到的是:在plproxy cluster上定義foo()函數,在cluster1和cluster2上也定義foo()函數,cluster1和cluster2上的foo()函數的定義是完全相同的,包括函數參數都是相同的;二者和plproxy cluster上的foo()定義均不同。
-
- 三、安裝經驗和實驗體會
- 1.plproxy實現集群的功能主要是通過對代理節點和數據庫節點定義函數來實現的
- 2.代理節點和各個數據庫節點都需要安裝PostgreSQL數據庫服務器並在各個服務器中新建一個同名的數據庫如:URTCluster
- 3.在代理節點上在創建的數據庫中初始化$pgdata/share/contrib/plproxy.sql模板
-
4.在代理節點和各個數據庫節點中安裝plpgsql---createlang plpgsql <數據庫名稱>
- 5.然后在代理節點中創建schema: create schema plproxy
- 6.在代理節點上初始化一些函數模板,將一些目標放到一個.sql文件里(如URTClusterInit.sql),然后在代理節點中psql -f URTClusterInit.sql -d URTCluster -h 10.0.0.1(代理節點的IP)
- 7.在各個數據庫節點中創建一張表,而且是一模一樣的表
- 8.然后給每個數據庫節點創建一個插入數據的函數
- 9.把函數保存在 URTClusterNodesInit_1.sql文件里,並執行
- psql -f URTClusterNodesInit_1.sql -h 10.0.0.2(數據庫節點1IP) -d URTCluster
- psql -f URTClusterNodesInit_1.sql -h 10.0.0.3 (數據庫節點1IP)-d URTCluster
- 10.在代理節點上創建上面同樣的插入數據函數,並創建一個查詢函數,用於進行集群檢索,將這些都保存在一個URTClusterProxyExec.sql文件里,並執行psql -f URTClusterProxyExec_1.sql -h 10.0.0.1(代理節點IP) -d URTCluster
- 11.測試
- 1)在代理節點上通過psql客戶端登陸psql -d URTCluster 數據庫
- 2)然后可以通過調用插入數據函數和查詢數據函數對集群進行操作
- 四、一些配置文檔: