小程序制作平台网站设计平台 互联网品牌制作专家
关于A5客户收购GoogleAdsense带有搜索账户的相关事宜更多

软文发布平台资讯中心

Postgresql分布式插件plproxy的使用详解

Postgresql分布式插件plproxy的使用详解

  项目招商找A5 快速获取精准代理名单

这篇文章主要介绍了Postgresql分布式插件plproxy的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。

Simple remote function call

节点61/62(datanode)

CREATE TABLE users (username text, email text);insert into users values ('user0', 'user0@gmail.com');insert into users values ('user1', 'user1@gmail.com');insert into users values ('user2', 'user2@gmail.com');

节点60(proxy)

create or replace extension plproxy;CREATE FUNCTION get_user_email(i_username text)RETURNS SETOF text AS $$CONNECT 'host=localhost port=9461 dbname=postgres connect_timeout=10';SELECT email FROM users WHERE username = $1;$$ LANGUAGE plproxy;SELECT * from get_user_email('user0');

Configuring Pl/Proxy clusters with SQL/MED

节点60(proxy)

CREATE FOREIGN DATA WRAPPER plproxy;CREATE SERVER usercluster FOREIGN DATA WRAPPER plproxyOPTIONS (connection_lifetime '1800', p0 'host=localhost port=9461 dbname=postgres connect_timeout=10', p1 'host=localhost port=9462 dbname=postgres connect_timeout=10' );CREATE USER MAPPING FOR PUBLIC SERVER usercluster;

Partitioned remote call

节点60(proxy)

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

节点61/62(datanode)

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;

Putting it all together

节点60(proxy)

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

plproxy–2.7.0.sql

-- handler functionCREATE FUNCTION plproxy_call_handler ()RETURNS language_handler AS 'plproxy' LANGUAGE C;-- validator functionCREATE FUNCTION plproxy_validator (oid)RETURNS void AS 'plproxy' LANGUAGE C;-- languageCREATE LANGUAGE plproxy HANDLER plproxy_call_handler VALIDATOR plproxy_validator;-- validator functionCREATE FUNCTION plproxy_fdw_validator (text[], oid)RETURNS boolean AS 'plproxy' LANGUAGE C;-- foreign data wrapperCREATE FOREIGN DATA WRAPPER plproxy VALIDATOR plproxy_fdw_validator;

补充:PostgreSQL 水平分库——plproxy

1、PL/Proxy安装

1、1 编译安装

tar -zxvf plproxy-2.7.tar.gzcd plproxy-2.7source /home/postgres/.bashrcmakemake install

1、2 创建pl/proxy扩展

itm_pg@pgs-> psqlpsql (10.3)Type "help" for help.postgres=# create database proxy;CREATE DATABASEpostgres=# \c proxy You are now connected to database "proxy" as user "postgres".proxy=# create extension plproxy;CREATE EXTENSIONproxy=# \dx List of installed extensionsName | Version | Schema | Description ---------+---------+------------+----------------------------------------------------------plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural languageplproxy | 2.8.0 | public | Database partitioning implemented as procedural language(2 rows)

2、pl/proxy配置

修改数据库节点pg_hba.conf:

修改两个数据节点的pg_hba.conf,保证代理节点可以访问。

# TYPE DATABASE USER ADDRESS METHODhost all all 192.168.7.177/32 trust

在SQL/MED方法在pl/proxy节点进行集群配置:

# TYPE DATABASE USER ADDRESS METHODhost all all 192.168.7.177/32 trust

配置完成!在"CLUSTER"模式中;才需要上述配置;在"CONNECT"模式中是不需要的。

3、pl/proxy测试

在两个数据节点创建测试表:

postgres=# create database pl_db1;CREATE DATABASEpostgres=# create user bill superuser;CREATE ROLEpostgres=# \c pl_db1 bill You are now connected to database "pl_db1" as user "bill".pl_db1=# create table users(userid int, name text);CREATE TABLE

3、1数据水平拆分测试

在每个数据节点创建insert函数接口

pl_db1=# CREATE OR REPLACE FUNCTION insert_user(i_id int, i_name text)pl_db1-# RETURNS integer AS $$pl_db1$# INSERT INTO users (userid, name) VALUES ($1,$2);pl_db1$# SELECT 1;pl_db1$# $$ LANGUAGE SQL;CREATE FUNCTION

–pl_db0节点一样

2、在PL/Proxy数据库创建同名的insert函数接口

proxy=# CREATE OR REPLACE FUNCTION insert_user(i_id int, i_name text)proxy-# RETURNS integer AS $$proxy$# CLUSTER 'cluster_srv1';proxy$# RUN ON ANY;proxy$# $$ LANGUAGE plproxy;CREATE FUNCTION

3、在PL/Proxy数据库创建读的函数get_user_name()

proxy=# CREATE OR REPLACE FUNCTION get_user_name()proxy-# RETURNS TABLE(userid int, name text) AS $$proxy$# CLUSTER 'cluster_srv1';proxy$# RUN ON ALL ;proxy$# SELECT userid,name FROM users;proxy$# $$ LANGUAGE plproxy;CREATE FUNCTION

4、在pl/proxy节点插入数据进行测试

SELECT insert_user(1001, 'Sven');SELECT insert_user(1002, 'Marko');SELECT insert_user(1003, 'Steve');SELECT insert_user(1004, 'bill');SELECT insert_user(1005, 'rax');SELECT insert_user(1006, 'ak');SELECT insert_user(1007, 'jack');SELECT insert_user(1008, 'molica');SELECT insert_user(1009, 'pg');SELECT insert_user(1010, 'oracle');

5、在节点数据库查看数据分布情况

pl_db1=# select * from users;userid | name --------+------- 1001 | Sven 1003 | Steve 1004 | bill(3 rows)

我们在proxy节点查询下:

proxy=# SELECT USERID,NAME FROM GET_USER_NAME();userid | name --------+-------- 1005 | rax 1006 | ak 1008 | molica 1009 | pg 1002 | Marko 1004 | bill 1007 | jack 1010 | oracle 1001 | Sven 1003 | Steve(10 rows)

因为创建insert_user函数时使用的是ROW ON ANY,表示随机再一台机器上进行执行,因此实现了数据在不同节点的随机分布,接下来改成ROW ON ALL,实验在不同节点进行数据的复制。

run on , 是数字常量, 范围是0 到 nodes-1; 例如有4个节点 run on 0; (run on 4则报错).

run on ANY,

run on function(…), 这里用到的函数返回结果必须是int2, int4 或 int8.

run on ALL, 这种的plproxy函数必须是returns setof…, 实体函数没有setof的要求.

3、2数据复制测试

选择users表作为实验对象;我们先清理表users数据;在数据节点创建truncatet函数接口

pl_db1=# CREATE OR REPLACE FUNCTION trunc_user()pl_db1-# RETURNS integer AS $$pl_db1$# truncate table users;pl_db1$# SELECT 1;pl_db1$# $$ LANGUAGE SQL;CREATE FUNCTION

2、在PL/Proxy数据库创建同名的truncate函数接口

proxy=# CREATE OR REPLACE FUNCTION trunc_user()proxy-# RETURNS SETOF integer AS $$proxy$# CLUSTER 'cluster_srv1';proxy$# RUN ON ALL;proxy$# $$ LANGUAGE plproxy;CREATE FUNCTION

–检查发现数据已经清理掉了

proxy=# SELECT TRUNC_USER();trunc_user ------------ 1 1(2 rows)

3、在PL/Proxy数据库创建函数接口 insert_user_2

proxy=# CREATE OR REPLACE FUNCTION insert_user_2(i_id int, i_name text)proxy-# RETURNS SETOF integer AS $$proxy$# CLUSTER 'cluster_srv1';proxy$# RUN ON ALL;proxy$# TARGET insert_user;proxy$# $$ LANGUAGE plproxy;CREATE FUNCTION

4、插入几条数据

proxy=# SELECT insert_user_2(1004, 'bill');insert_user_2 --------------- 1 1(2 rows)proxy=# SELECT insert_user_2(1005, 'rax');insert_user_2 --------------- 1 1(2 rows)proxy=# SELECT insert_user_2(1006, 'ak');insert_user_2 --------------- 1 1(2 rows)proxy=# SELECT insert_user_2(1007, 'jack');insert_user_2 --------------- 1 1(2 rows)

5、查看每个节点数据情况

pl_db1=# select * from users;userid | name --------+------- 1004 | bill 1005 | rax 1006 | ak 1007 | jack(4 rows)pl_db0=# select * from users;userid | name --------+------- 1004 | bill 1005 | rax 1006 | ak 1007 | jack(4 rows)

两个数据节点的数据一样,实现了数据的复制。

文章来源:脚本之家

来源地址:https://www.jb51.net/article/204402.htm

尊敬的看官您对Postgresql分布式插件plproxy的使用详解有什么看法呢?互联网品牌制作专家愿与您共同探讨!版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请加微信号oem365 举报,一经查实,本站将立刻删除。

上一篇: PostgreSQL中的postgres_fdw扩展详解   返 回   下一篇:在PostgreSQL中设置表中某列值自增或循环方式

相关资讯

小程序应用场景 | 小程序解决方案 | 小程序案例 | 小程序应功能 | 软文发布资源 | 网站设计

酒店预约解决方案
酒店预约小程序走红网络,也是传统转型的重要变化
详情
投票解决方案
强大功能,傻瓜式管理,有效防止作弊刷票
详情
新零售解决方案
小程序是现在新零售的新方式,深度结合线上线下
详情
预约服务解决方案
预约到店小程序通过用户在线预约到店等
详情
企业官网解决方案
企业展示小程序主要展示企业信息、产品案例等
详情
教育培训解决方案
主要展示教育机构的课程、可在线预约与购买课程
详情
推广解决方案
可以让企业通过推广模式全面展示自己的产品
详情
到店解决方案
到店服务解决方案,主要是面向实体餐饮门店
详情

我们的服务是否能满足您的需求?

如果不能,请联系我们或给我们留言,我们收到后会第一时间联系您!感谢您对我们的关注!

粤公网安备 44200002005005号