PL/Proxy安装配置

来源:互联网 发布:图片编辑软件photoshop 编辑:程序博客网 时间:2024/06/04 23:28
下载安装包
http://pgfoundry.org/projects/plproxy


tar -zxvf plproxy-2.5.tar.gz
[root@node2 upload]# chown highgo:highgo plproxy-2.5 -R
yum install flex bison -y
[highgo@node2 plproxy-2.5]$ make
[highgo@node2 plproxy-2.5]$ make install


highgo=# create extension plproxy;
CREATE EXTENSION


192.168.7.11 node1 代理数据库 proxydb
192.168.7.12 node2 后端数据节点 datadb
192.168.7.13 node3 后端数据节点 datadb

data目录:/usr/local/cluster/hgdb/data

node1:
highgo=# create database proxydb;
CREATE DATABASE
highgo=# create user plpro with superuser;
CREATE ROLE
highgo=# alter database proxydb owner to plpro;
ALTER DATABAS
highgo=# alter user plpro with password 'postgres';
ALTER ROLE
highgo=# \c proxydb plpro
You are now connected to database "proxydb" as user "plpro".
highgo=# create schema plproxy;
CREATE SCHEMA
proxydb=# \dn
List of schemas
Name | Owner
----------------+--------
hgdb_catalog | highgo
oracle_catalog | highgo
plproxy | plpro
public | highgo
(4 rows)

node2、node3:
highgo=# create database datadb;
CREATE DATABASE
或者:
[highgo@node3 hgdb]$ createdb datadb;





#plproxy的配置是通过三个函数(过程)实现的,这三个函数的标准模版如下:
node1:
1.函数是让plproxy可以找到对应的集群,将三个函数建立在proxydb中
proxydb=# CREATE OR REPLACE FUNCTION plproxy.get_cluster_partitions(cluster_name text)
proxydb-# RETURNS SETOF text AS $$
proxydb$# BEGIN
proxydb$# IF cluster_name ='Clusters01' THEN
proxydb$# RETURN NEXT 'dbname=datadb host=192.168.7.12';
proxydb$# RETURN NEXT 'dbname=datadb host=192.168.7.13';
proxydb$# RETURN;
proxydb$# END IF;
proxydb$# RAISE EXCEPTION 'Unknown cluster';
proxydb$# END;
proxydb$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
2.#这个函数是plproxy用于判断是否给前端返回已经cache过的结果用的
proxydb=# CREATE OR REPLACE FUNCTION plproxy.get_cluster_version(cluster_name text)
proxydb-# RETURNS int4 AS $$
proxydb$# BEGIN
proxydb$# IF cluster_name = 'Clusters01' THEN
proxydb$# RETURN 1;
proxydb$# END IF;
proxydb$# RAISE EXCEPTION 'Unknown cluster';
proxydb$# END;
proxydb$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
3.#这个函数是获取不同的集群的配置
proxydb=# create or replace function plproxy.get_cluster_config(cluster_name text, out key text, out val text)
proxydb-# returns setof record as $$
proxydb$# begin
proxydb$# key := 'statement_timeout';
proxydb$# val := 60;
proxydb$# return next;
proxydb$# return;
proxydb$# end;
proxydb$# $$ language plpgsql;
CREATE FUNCTION


在1、2节点上设置 :
#给每个数据库节点都创建一张表users
CREATE TABLE users (
username text,
email text
);


在proxydb上创建PL/Proxy语言的函数insert_user:
【使用表的字段“username”为分布键,对此字段进行hash计算之后让数据分布到底层的2个数据节点上,然后建一个名为“insert_user”函数来完成数据的插入】
create or replace function insert_user(i_username text,i_emailaddress text)
returns integer as $$
cluster 'Clusters01';
run on hashtext(i_username);
$$ LANGUAGE plproxy;

#给node2(节点1)、node3(节点2)都创建一个插入函数
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;


为了能用用户名称(username)查询email的地址(emailaddress),需要在proxydb上建一个函数:
CREATE OR REPLACE FUNCTION get_user_email(i_username text)
RETURNS text AS $$
CLUSTER 'Clusters01';
RUN ON hashtext(i_username) ;
SELECT email FROM users WHERE username = i_username;
$$ LANGUAGE plproxy;


测试:
在proxydb调用“insert_user"函数插入一些数据:
select insert_user('赵一水','yishui@qq.com');
select insert_user('李二黑','erhei@qq.com');
select insert_user('王三马','sanma@qq.com');
select insert_user('周五六','yishui@qq.com');
select insert_user('赵一水','yishui@qq.com');
select insert_user('张三','yishui@qq.com');
select insert_user('李四','erhei@qq.com');
select insert_user('王五','wangwu@qq.com');

一节点:
datadb=# select * from users;
username | email
----------+---------------
李二黑 | erhei@qq.com
王三马 | sanma@qq.com
周五六 | yishui@qq.com
张三 | yishui@qq.com
李四 | erhei@qq.com
(5 rows)
二节点:
datadb=# select * from users;
username | email
----------+---------------
赵一水 | yishui@qq.com
赵一水 | yishui@qq.com
王五 | wangwu@qq.com
(3 rows)

验证1:被hash到 partition 0
proxydb=# select hashtext('张三') & 1;
?column?
----------
0
(1 row)
验证2:被hash到 partition 1
proxydb=# select hashtext('赵一水') & 1;
?column?
----------
1
(1 row)

select get_user_email()函数查看用户邮箱:
proxydb=# select get_user_email('张三');
get_user_email
----------------
yishui@qq.com
(1 row)

proxydb=# select get_user_email('王五');
get_user_email
----------------
wangwu@qq.com
(1 row)
如果是函数调用出现:HINT: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
不一定是插入的函数有问题,有时也可能是没有成功创建该函数
如果出现:
错误: PL/Proxy function public.insert_user(2): [datadb] PQconnectPoll: 致命错误: 角色 "plpro" 不存在
则证明节点没有plpro用户


0 0
原创粉丝点击