设为首页 收藏本站
查看: 502|回复: 0

[经验分享] PG PLProxy配置说明

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-10-11 09:00:16 | 显示全部楼层 |阅读模式
1.下载plproxy-2.6.tar.gz
网址:https://plproxy.github.io/
root用户上传到 /home/soft目录

# cd /home/
# chown postgres.postgres soft
# cd soft
# chown postgres.postgres plproxy-2.6.tar.gz

2.编译安装

前提:postgresql 9.5.2源码安装,/opt/pgsql/9.5.2

postgres用户PATH环境变量
[postgres@pgtest ~]$ more .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

export LD_LIBRARY_PATH=/usr/local/mysql/lib/mysql:/opt/pgsql/9.5.2/lib
export PATH=/usr/local/mysql/bin:/opt/pgbouncer/1.7.2/bin:/opt/pgsql/9.5.2/bin:$PATH
export MANPATH=/opt/pgsql/9.5.2/share/man:$MANPATH
[postgres@pgtest ~]$

postgres用户执行以下命令

$ tar zxvf plproxy-2.6.tar.gz
$ make
......
......
......
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -O2 -fpic -I/opt/pgsql/9.5.2/include/server -I/opt/pgsql/9.5.2/include -DNO_SELECT=0 -I. -I./ -I/opt/pgsql/9.5.2/include/server -I/opt/pgsql/9.5.2/include/internal -D_GNU_SOURCE   -c -o src/aatree.o src/aatree.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -O2 -fpic -shared -o plproxy.so src/scanner.o src/parser.tab.o src/cluster.o src/execute.o src/function.o src/main.o src/query.o src/result.o src/type.o src/poll_compat.o src/aatree.o -L/opt/pgsql/9.5.2/lib -Wl,--as-needed -Wl,-rpath,'/opt/pgsql/9.5.2/lib',--enable-new-dtags  -L/opt/pgsql/9.5.2/lib -lpq
echo "create extension plproxy;" > sql/plproxy.sql
cat sql/plproxy_lang.sql sql/plproxy_fdw.sql > sql/plproxy--2.6.0.sql
cat sql/ext_update_validator.sql >sql/plproxy--2.3.0--2.6.0.sql
cat sql/ext_update_validator.sql >sql/plproxy--2.4.0--2.6.0.sql
cat sql/ext_update_validator.sql >sql/plproxy--2.5.0--2.6.0.sql
cat sql/ext_unpackaged.sql > sql/plproxy--unpackaged--2.6.0.sql
$
$ make install
/bin/mkdir -p '/opt/pgsql/9.5.2/lib'
/bin/mkdir -p '/opt/pgsql/9.5.2/share/extension'
/bin/mkdir -p '/opt/pgsql/9.5.2/share/extension'
/usr/bin/install -c -m 755  plproxy.so '/opt/pgsql/9.5.2/lib/plproxy.so'
/usr/bin/install -c -m 644 .//plproxy.control '/opt/pgsql/9.5.2/share/extension/'
/usr/bin/install -c -m 644  sql/plproxy--2.6.0.sql sql/plproxy--2.3.0--2.6.0.sql sql/plproxy--2.4.0--2.6.0.sql sql/plproxy--2.5.0--2.6.0.sql sql/plproxy--unpackaged--2.6.0.sql '/opt/pgsql/9.5.2/share/extension/'
$

3.proxy

proxy节点:
ipaddress:192.168.199.201
user: proxy
password: proxy
database:proxy

data节点

ipaddress:192.168.199.201
user: datauser
password: datauser
database:db0、db1、db2、db3


[postgres@pgtest ~]$ psql
psql (9.5.2)
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)
创建role
postgres=# create role proxy nosuperuser login encrypted password 'proxy';
CREATE ROLE
创建proxy数据库
postgres=# create database proxy;
CREATE DATABASE
postgres=# \c proxy
You are now connected to database "proxy" as user "postgres".
加载扩展proxy
proxy=# create extension plproxy;
CREATE EXTENSION
proxy=#
调整proxy库权限
proxy=# grant all on database proxy to proxy;
GRANT
proxy=# \c proxy proxy
You are now connected to database "proxy" as user "proxy".
proxy=>

创建workschema schema, 目的是和数据节点的schema匹配, 这样的话可以省去在代理函数中写target强行指定schema.
数据节点也建立这个schema。
proxy=> create schema workschema;
CREATE SCHEMA
proxy=>

创建data节点数据库
proxy=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".
postgres=# create role datauser nosuperuser login encrypted password 'datauser';
CREATE ROLE
postgres=# create database db0;
CREATE DATABASE
postgres=# create database db1;
CREATE DATABASE
postgres=# create database db2;
CREATE DATABASE
postgres=# create database db3;
CREATE DATABASE
postgres=#


调整权限, 赋予给后面将要给user mapping中配置的option user权限.

postgres=# grant all on database db0 to datauser;
GRANT
postgres=# grant all on database db1 to datauser;
GRANT
postgres=# grant all on database db2 to datauser;
GRANT
postgres=# grant all on database db3 to datauser;
GRANT
postgres=#

每个库创建schema

postgres=# \c db0 datauser
You are now connected to database "db0" as user "datauser".
db0=> create schema workschema;
CREATE SCHEMA
db0=> \c db1 datauser
You are now connected to database "db1" as user "datauser".
db1=> create schema workschema;
CREATE SCHEMA
db1=> \c db2 datauser
You are now connected to database "db2" as user "datauser".
db2=> create schema workschema;
CREATE SCHEMA
db2=> \c db3 datauser
You are now connected to database "db3" as user "datauser".
db3=> create schema workschema;
CREATE SCHEMA
db3=>

使用超级用户在proxy数据库中创建server.

postgres=# \c proxy postgres
proxy=#CREATE SERVER cluster_srv1 FOREIGN DATA WRAPPER plproxy options (connection_lifetime '1800',
p0 'dbname=db0 hostaddr=192.168.199.201 port=1921 application_name=test',
p1 'dbname=db1 hostaddr=192.168.199.201 port=1921',
p2 'dbname=db2 hostaddr=192.168.199.201 port=1921',
p3 'dbname=db3 hostaddr=192.168.199.201 port=1921');
CREATE SERVER
proxy=#

创建server时可以使用libpq中的选项. 例如本例使用了application_name.

将server权限赋予给proxy用户.
proxy=# GRANT usage ON FOREIGN SERVER cluster_srv1 to proxy;
GRANT
proxy=#

配置proxy用户的连接cluster_srv1的选项.
proxy=# GRANT usage ON FOREIGN SERVER cluster_srv1 to proxy;
GRANT
proxy=# CREATE USER MAPPING FOR PROXY SERVER cluster_srv1 options(user 'datauser');
CREATE USER MAPPING
proxy=#


用户proxy连接到cluster_srv1时使用datauser用户连接, 这里不需要配置password, 因为我们将使用trust认证.

修改数据节点的pg_hba.conf

从proxy节点使用datauser用户连接数据库db0, db1, db2,db3使用trust认证.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    db0             datauser        192.168.199.0/24        trust  
host    db1             datauser        192.168.199.0/24        trust
host    db2             datauser        192.168.199.0/24        trust
host    db3             datauser        192.168.199.0/24        trust

$ pg_ctl reload -D /pgdata95/
server signaled
$


在plproxy节点创建代理函数

使用超级用户创建plproxy函数, 然后把函数权限赋予给proxy权限.
postgres=# \c proxy
You are now connected to database "proxy" as user "postgres".
proxy=# CREATE OR REPLACE FUNCTION workschema.dy(sql text)
proxy-# RETURNS SETOF record AS
proxy-# $BODY$
proxy$#    cluster 'cluster_srv1';
proxy$#    run on all;
proxy$# $BODY$
proxy-# LANGUAGE 'plproxy';
CREATE FUNCTION
proxy=# grant execute on function workschema.dy(text) to proxy;
GRANT
proxy=#

在数据节点创建实体函数

db0\db1\db2\db3 数据库 datauser用户

CREATE OR REPLACE FUNCTION workschema.dy(sql text)
RETURNS SETOF record
AS $BODY$
       declare rec record;
       begin
            for rec in execute sql loop
                return next rec;
            end loop;
            return;
       end;
   $BODY$
LANGUAGE 'plpgsql';

在proxy节点中就可以访问数据节点了。
# \c proxy proxy

proxy=> select * from workschema.dy('select count(*) from pg_class') as t(i int8);
  i  
-----
311
311
311
311
(4 rows)

proxy=> select sum(i) from workschema.dy('select count(*) from pg_class') as t(i int8);
sum  
------
1244
(1 row)

proxy=>


plproxy节点测试

在数据节点创建测试表.

db0\db1\db2\db3 数据库 datauser用户

创建表

create table t(id int);

创建实体函数

CREATE OR REPLACE FUNCTION workschema.f_test4()
RETURNS int
AS $$
    declare
    begin
    insert into t(id) values(1);
    return 0;
    end;
   $$
LANGUAGE 'plpgsql';


proxy 创建代理函数

在proxy节点创建代理函数, 并且将执行权限赋予给proxy用户.

proxy=> \c proxy postgres

CREATE OR REPLACE FUNCTION workschema.f_test4()
RETURNS int
AS $$
cluster 'cluster_srv1';
run on 0;
$$
LANGUAGE 'plproxy' strict;

proxy=# grant execute on function workschema.f_test4() to proxy;
GRANT


执行代理函数

proxy=# \c proxy proxy
You are now connected to database "proxy" as user "proxy".
proxy=>
proxy=>
proxy=>
proxy=> select * from workschema.f_test4();
f_test4
---------
       0
(1 row)

proxy=>



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-284305-1-1.html 上篇帖子: DRBD简介 安装、编译报错解决 DRBD的配置、初始化及同步 下篇帖子: 怎样用Netdata监控Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表