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

这篇文章主要介绍了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 plproxy
OPTIONS (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 function
CREATE FUNCTION plproxy_call_handler ()
RETURNS language_handler AS ‘plproxy’ LANGUAGE C;
— validator function
CREATE FUNCTION plproxy_validator (oid)
RETURNS void AS ‘plproxy’ LANGUAGE C;
— language
CREATE LANGUAGE plproxy HANDLER plproxy_call_handler VALIDATOR plproxy_validator;
— validator function
CREATE FUNCTION plproxy_fdw_validator (text[], oid)
RETURNS boolean AS ‘plproxy’ LANGUAGE C;
— foreign data wrapper
CREATE FOREIGN DATA WRAPPER plproxy VALIDATOR plproxy_fdw_validator;

 

补充:PostgreSQL 水平分库——plproxy

1、PL/Proxy安装

1、1 编译安装

tar -zxvf plproxy-2.7.tar.gz
cd plproxy-2.7
source /home/postgres/.bashrc
make
make install

 

1、2 创建pl/proxy扩展

itm_pg@pgs-> psql
psql (10.3)
Type “help” for help.
postgres=# create database proxy;
CREATE DATABASE
postgres=# \c proxy
You are now connected to database “proxy” as user “postgres”.
proxy=# create extension plproxy;
CREATE EXTENSION
proxy=# \dx
                List of installed extensions
 Name  | Version |  Schema  |            Description      
     
———+———+————+———————————————–
———–
 plpgsql | 1.0   | pg_catalog | PL/pgSQL procedural language
 plproxy | 2.8.0  | public   | Database partitioning implemented as procedura
l language
(2 rows)

 

2、pl/proxy配置

修改数据库节点pg_hba.conf:

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

# TYPE DATABASE    USER      ADDRESS         METHOD
 host all       all       192.168.7.177/32     trust

 

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

# TYPE DATABASE    USER      ADDRESS         METHOD
 host all       all       192.168.7.177/32     trust

 

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

3、pl/proxy测试

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

postgres=# create database pl_db1;
CREATE DATABASE
postgres=# create user bill superuser;
CREATE ROLE
postgres=# \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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:SEO优化专员,转转请注明出处:https://www.chuangxiangniao.com/p/892054.html

(0)
上一篇 2025年1月3日 23:32:07
下一篇 2025年1月3日 23:32:33

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • SQLite 中文指南之FAQ第1/6页

    sqllite使用过程中碰到的一些问题解决,中文版 1. 如何创建自增字段? 2. SQLite 支持哪些数据类型? 3. 为什么能向 SQLite 数据库的整型字段中插入字符串? 4. 为什么 SQLite 认为表达式 ‘0&…

    数据库 2025年1月4日
    100
  • Access创建一个简单MIS管理系统

    所谓MIS管理系统,是一个由人、计算机及其他外围设备等组成的能进行信息的收集、传递、存贮、加工、维护和使用的系统。MIS管理系统是一种新兴的技术,那么下文中就给大家介绍Access这个有历史的数据库系统如何创建一个简单的MIS管理系统。 M…

    数据库 2025年1月4日
    100
  • 读取注册表根据Office版本获取数据库连接字段

    本节主要介绍了如何根据Office版本获取数据库连接字段,以读取注册表获取Office版本,实现代码如下,感兴趣的朋友不要错过 /// /// 读取注册表,根据Office版本获取数据库连接字段 /// /// 数据库连接字段 privat…

    数据库 2025年1月4日
    100
  • PostgreSQL操作符实践技巧分享

    这篇文章主要给大家介绍了关于PostgreSQL基础知识之SQL操作符实践的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 操作符是数据库具有的…

    2025年1月4日
    100
  • SQL Server如何通过创建临时表遍历更新数据详解

    这篇文章主要给大家介绍了关于SQL Server如何通过创建临时表遍历更新数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 前言: 前段时间新项目上线为了赶…

    2025年1月4日
    100
  • Mac系统重置PostgreSQL密码技巧及代码展示

    PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。这篇文章主要介绍了Mac系统重置PostgreSQL密码的方法示例代码,需要的朋友可以参考下 PostgreSQL是一种特性非常齐全的自由…

    数据库 2025年1月4日
    100
  • PostgreSQL技巧分享:图(graph)的递归查询实例

    这篇文章主要给大家介绍了关于PostgreSQL图(graph)的递归查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 背景 在树形递归查询这篇文…

    2025年1月4日
    100
  • PostgreSQL技巧 如何获取当前日期时间

    这篇文章主要介绍了PostgreSQL 如何获取当前日期时间及注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 在开发数据库应用或者调试代码时,经常需要获取系统的…

    数据库 2025年1月4日
    100
  • postgresql中的ltree类型使用技巧

    这篇文章主要给大家介绍了关于postgresql中ltree类型使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用postgresql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 postgresql有很多比较妖…

    2025年1月4日
    100
  • MongoDB通配符索引的用法实例

    这篇文章主要给大家介绍了关于MongoDB通配符索引的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 指南 MongoDB在4.2 版本推出了Wildcard …

    数据库 2025年1月4日
    100

发表回复

登录后才能评论

联系我们

156-6553-5169

在线咨询: QQ交谈

邮件:253000106@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

联系微信