plproxy的調用流程

來源:互聯網
上載者:User
    plproxy能夠在PostgreSQL上啟動並執行一種過程語言,能夠完成對遠端資料庫的調用,並能夠完成資料切片的功能。資料流處理過程如所示:    首先需要明確的是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的關鍵函數

        a. plproxy.get_cluster_version(cluster_name)  舉例如下:

  1. CREATE OR REPLACE FUNCTION plproxy.get_cluster_version(cluster_name text)
  2. RETURNS int4 AS $$
  3. BEGIN
  4.     IF cluster_name = 'a_cluster' THEN
  5.         RETURN 1;
  6.     END IF;
  7.     RAISE EXCEPTION 'Unknown cluster';
  8. END;
  9. $$ LANGUAGE plpgsql;

          該函數返回的是當前plproxy的配置版本號碼,每當有請求時此函數都會調用。如果該函數的傳回值和plproxy的緩衝的配置版本號碼不同,則plproxy會認為配置已經更新,就會調用下面兩個函數重新讀取配置。

       b. plproxy.get_cluster_partitions(cluster_name text) 舉例如下:

  1. CREATE OR REPLACE FUNCTION plproxy.get_cluster_partitions(cluster_name text)
  2. RETURNS SETOF text AS $$
  3. BEGIN
  4.     IF cluster_name = 'a_cluster' THEN
  5.         RETURN NEXT 'dbname=part00 host=127.0.0.1';
  6.         RETURN NEXT 'dbname=part01 host=127.0.0.1';
  7.         RETURN;
  8.     END IF;
  9.     RAISE EXCEPTION 'Unknown cluster';
  10. END;
  11. $$ LANGUAGE plpgsql;

        該函數返回plproxy所設定的內容,當所訪問的cluster名稱為a_cluster時,返回RETURN NEXT所對應的遠程主機配置。

       c. plproxy.get_cluster_config(cluster) 舉例如下:

  1. CREATE OR REPLACE FUNCTION plproxy.get_cluster_config(
  2.     in cluster_name text,
  3.     out key text,
  4.     out val text)
  5. RETURNS SETOF record AS $$
  6. BEGIN
  7.     -- lets use same config for all clusters
  8.     key := 'connection_lifetime';
  9.     val := 30*60; -- 30m
  10.     RETURN NEXT;
  11.     RETURN;
  12. END;
  13. $$ LANGUAGE plpgsql;

        該函數返回plproxy與cluser1和cluster2連結時的一些參數,如生命週期,逾時時間,是否使用binary IO等。

    2. foo()函數的定義:

        在plproxy cluster上定義foo的內容如下:

  1. CREATE OR REPLACE FUNCTION foo(i_username text)
  2.   RETURNS text AS
  3. $BODY$
  4.     CLUSTER 'a_cluster'; RUN ON hashtext(i_username) & 1;
  5. $BODY$
  6.   LANGUAGE 'plproxy' VOLATILE
  7.   COST 100;

       在cluster1和cluster2上定義foo的內容如下:

  1. CREATE OR REPLACE FUNCTION foo(i_username text)
  2.   RETURNS text AS
  3. $BODY$
  4. BEGIN
  5.     RETURN 'user already exists';
  6. END;
  7. $BODY$
  8.   LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
  9.   COST 100;

       可以看到,在plproxy上定義的foo()函數的language是“plproxy”,在cluster1和2上的foo()函數定義的language是“plpgsql”,這是最主要的區別。

   3. 調用過程

      a. 用戶端發送select foo()的請求到plproxy cluster;
      b. plproxy cluster發現foo()是使用者自訂的函數,尋找到該函數定義內容發現該函數是通過plproxy language定義的
      c. plproxy cluster把控制權轉交到plproxy language的handler,
      d. 該handler執行foo()的內容,發現該函數需要使用名為"a_cluster"的配置
      e. handler調用plproxy.get_cluster_version("a_cluster"),發現配置版本號碼相符;
         則繼續調用 plproxy.get_cluster_partitions("a_cluster")獲得四項遠程cluster的連結配置;
         然後繼續調用 plproxy.get_cluster_config(in cluster_name text,out key text,out val text)獲得連結時的配
         置資訊
      f. 最後根據RUN ON hashtext(i_username) & 1 把"select foo()"請求轉寄到cluster1或者2上。 
         hashtext(i_username) & 2 會返回一個0-1之間的值,根據這個值確定應該轉寄請求到哪個具體的cluster上.
      g. 在cluster上執行"select foo()",把結果"user already exists"返回給plproxy cluster
      h. plproxy cluster再把收到的結果返回給client.

   4. plproxy的局限
       plproxy並不能完成無條件的轉寄,只能在自訂的函數上實現此功能。這就要求在實際的應用中,需要把大量的商務邏輯放到PostgreSQL伺服器端來完成,降低了靈活度。

       一點體會:使用PostgreSQL,需要改變思路,需要適應把商務邏輯通過伺服器端編程實現的過程。這是與MySQL的很大不同。

      plproxy官方連結

      例子:PostgreSQL cluster: partitioning with plproxy (part I)
            PostgreSQL cluster: partitioning with plproxy (part II)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.