注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

博客新家:https://francs.top/

 
 
 

日志

 
 

PL/Proxy 之一: 使用外部表 SQL/MED搭建 PL/Proxy  

2014-09-18 15:03:15|  分类: PG性能优化 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
       PL/Proxy 是 PostgreSQL 的 partitioning 解决方案,也能称为集群,据说 skype 公司在用,是成熟,稳定的生产系统解决方案。
    
PL/Proxy 的一些特性
  •     PL/Proxy functions detect remote functions to be called from their own signature.
  •     Function can be run on one, some or all members of the cluster.
  •     If query is executed on several partitions, it will happen in parallel.
  •     Queries are run in auto-commit mode on the remote server.
  •     Query parameters are sent separately from query body, thus avoiding quoting/unquoting overhead on both sides.
  •     Does not contain code connection pooling, works with external pooler if needed, preferably PgBouncer.
    备注:引自 wiki, 不翻译了,接下来准备在笔记本一台虚拟机中搭建  PL/Proxy.


PL/Proxy  架构图
PostgreSQL:  使用外部表 SQL/MED搭建 PL/Proxy - francs - PostgreSQL DBA


一 环境
硬件环境:Vmware 虚拟机:
数据库  : proxy, db0, db1,且都创建在一个实例上,其中 proxy 为代理结点, db0,db1 为数据结点。
备注:环境简单,proxy 结点和数据节点在同一台机器上,纯属实验目的。


二 安装  plproxy
--2.1 下载 plproxy
http://pgfoundry.org/frs/download.php/3392/plproxy-2.5.tar.gz

--2.2 安装

[root@db1 soft_bak]# tar zxvf plproxy-2.5.tar.gz
[root@db1 plproxy-2.5]# source /home/pg93/.bash_profile
[root@db1 plproxy-2.5]# make

[root@db1 plproxy-2.5]# make install
/bin/mkdir -p '/opt/pgsql_9.3.3/lib'
/bin/mkdir -p '/opt/pgsql_9.3.3/share/extension'
/bin/mkdir -p '/opt/pgsql_9.3.3/share/extension'
/usr/bin/install -c -m 755  plproxy.so '/opt/pgsql_9.3.3/lib/plproxy.so'
/usr/bin/install -c -m 644 ./plproxy.control '/opt/pgsql_9.3.3/share/extension/'
/usr/bin/install -c -m 644  sql/plproxy--2.5.0.sql sql/plproxy--2.3.0--2.5.0.sql sql/plproxy--2.4.0--2.5.0.sql sql/plproxy--unpackaged--2.5.0.sql '/opt/pgsql_9.3.3/share/extension/'

备注:plproxy 安装完成 ,在目录 /opt/pgsql_9.3.3/share/extension/ 下会生成一些 plproxy 脚本,如下

--2.3 plproxy 相关脚本

[pg93@db1 extension]$ ll /opt/pgsql_9.3.3/share/extension/plproxy*
-rw-r--r-- 1 root root   0 Sep 18 10:51 /opt/pgsql_9.3.3/share/extension/plproxy--2.3.0--2.5.0.sql
-rw-r--r-- 1 root root   0 Sep 18 10:51 /opt/pgsql_9.3.3/share/extension/plproxy--2.4.0--2.5.0.sql
-rw-r--r-- 1 root root 389 Sep 18 10:51 /opt/pgsql_9.3.3/share/extension/plproxy--2.5.0.sql
-rw-r--r-- 1 root root 210 Sep 18 10:51 /opt/pgsql_9.3.3/share/extension/plproxy.control
-rw-r--r-- 1 root root 239 Sep 18 10:51 /opt/pgsql_9.3.3/share/extension/plproxy--unpackaged--2.5.0.sql


--2.4 make 过程遇到的错误

[pg93@db1 plproxy-2.5]$ make
flex -osrc/scanner.c src/scanner.l
make: flex: Command not found
make: *** [src/scanner.c] Error 127

[root@db1 plproxy-2.5]# make
flex -osrc/scanner.c src/scanner.l
bison -b src/parser -d src/parser.y
make: bison: Command not found
make: *** [src/parser.tab.c] Error 127


--2.5 解决方法

 yum install flex bison


三 使用 SQL/MED 方式配置 Pl/Proxy
--3.1 目标创建以下三个数据库

proxy
db0
db1


--3.2 create role

CREATE ROLE proxy LOGIN  ENCRYPTED PASSWORD 'proxy_user' nosuperuser noinherit nocreatedb nocreaterole ;


--3.3 创建表空间目录

mkdir -p /database/pg93/pg_tbs/tbs_proxy
mkdir -p /database/pg93/pg_tbs/tbs_db0
mkdir -p /database/pg93/pg_tbs/tbs_db1


--3.4 创建表空间

create tablespace tbs_proxy owner proxy LOCATION '/database/pg93/pg_tbs/tbs_proxy';
create tablespace tbs_db0 owner proxy LOCATION '/database/pg93/pg_tbs/tbs_db0';
create tablespace tbs_db1 owner proxy LOCATION '/database/pg93/pg_tbs/tbs_db1';


--3.5 创建数据库

CREATE DATABASE proxy WITH  OWNER = proxy  TEMPLATE = template0  ENCODING = 'UTF8'  TABLESPACE = tbs_proxy;
CREATE DATABASE db0 WITH  OWNER = proxy  TEMPLATE = template0  ENCODING = 'UTF8'  TABLESPACE = tbs_db0;
CREATE DATABASE db1 WITH  OWNER = proxy  TEMPLATE = template0  ENCODING = 'UTF8'  TABLESPACE = tbs_db1;


--3.6 在 db0 db1 创建以下表

CREATE TABLE users (
    username text,
    email text
);


--3.7 创建 proxy 模式,并导入 proxy 模块

[pg93@db1 extension]$ psql proxy proxy
psql (9.3.3)
Type "help" for help.

proxy=> create schema proxy;
CREATE SCHEMA

[pg93@db1 extension]$ psql -d proxy -U postgres -f /opt/pgsql_9.3.3/share/extension/plproxy--2.5.0.sql
CREATE FUNCTION
CREATE LANGUAGE
CREATE FUNCTION
CREATE FOREIGN DATA WRAPPER


--3.8 创建 server

proxy=#
CREATE SERVER proxy_srv FOREIGN DATA WRAPPER plproxy
OPTIONS (connection_lifetime '1800',
         p0 'dbname=db0 host=127.0.0.1',
         p1 'dbname=db1 host=127.0.0.1' );

备注: connection_lifetime 表示连接生存周期,秒为单位,更多参数解释参考手册   PL/Proxy Cluster Configuration
         
--3.9 grant

proxy=# grant usage on foreign server proxy_srv to proxy;


--3.10 create mapping user

proxy=>  CREATE USER MAPPING FOR proxy SERVER proxy_srv  OPTIONS (user 'proxy', password 'proxy_user');


四  创建 Partitioned, remote  函数
--4.1 获取用户 email 函数, 在 proxy 库上执行

CREATE OR REPLACE FUNCTION get_user_email(i_username text)
RETURNS SETOF text AS $$
    CLUSTER 'proxy_srv';
    RUN ON hashtext(i_username) ;
    SELECT email FROM users WHERE username = i_username;
$$ LANGUAGE plproxy;


--4.2 插入函数,在 db0, db1 库上执行

CREATE OR REPLACE FUNCTION insert_user(i_username text, i_emailaddress text)
RETURNS integer AS $$
       INSERT INTO users (username, email) VALUES ($1,$2);
       SELECT 1;
$$ LANGUAGE SQL;


--4.3 分发 insert sql 函数, 在 proxy 库上执行

CREATE OR REPLACE FUNCTION insert_user(i_username text, i_emailaddress text)
RETURNS integer AS $$
    CLUSTER 'proxy_srv';
    RUN ON hashtext(i_username);
$$ LANGUAGE plproxy;



五 测试
--5.1 插入数据:   proxy 库上执行

SELECT insert_user('Sven','sven@somewhere.com');
SELECT insert_user('Marko', 'marko@somewhere.com');
SELECT insert_user('Steve','steve@somewhere.cm');
SELECT insert_user('francs','francs@somewhere.cm');
SELECT insert_user('test','test@somewhere.cm');


--5.2 数据查询: proxy 库上执行

proxy=> SELECT get_user_email('Sven');
   get_user_email   
--------------------
 sven@somewhere.com
(1 row)

proxy=> SELECT get_user_email('francs');
   get_user_email    
---------------------
 francs@somewhere.cm
(1 row)

proxy=> SELECT get_user_email('test');
  get_user_email   
-------------------
 test@somewhere.cm


--5.3 数据分布

[pg93@db1 extension]$ psql
psql (9.3.3)
Type "help" for help.

postgres=# \c db0
You are now connected to database "db0" as user "postgres".

db0=# select * from users ;
 username |        email        
----------+---------------------
 francs   | francs@somewhere.cm
(1 row)

db0=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# select * from users ;
 username |        email        
----------+---------------------
 Sven     | sven@somewhere.com
 Marko    | marko@somewhere.com
 Steve    | steve@somewhere.cm
 test     | test@somewhere.cm
(4 rows)

备注: 以上是最简单的 pl/proxy 搭建方式,手册上提到当查询请求通过 proxy 库分发时,proxy 到数据节点在一定程度上会浪费连接,所以建议使用连接池,如 pgBouncer.

             关于性能目前暂未测试,待续。

六 参考
  评论这张
 
阅读(1145)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018