0%

pgSQL集群工具PLproxy——部署

准备工作

下载安装pgsql-9.6

(可根据需要版本替换命令中的版本号)

yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
yum install postgresql96
yum install postgresql96-server

初始化数据库

/usr/pgsql-9.6/bin/postgresql96-setup initdb
### 使用systemd管理
systemctl enable postgresql-9.6
systemctl start postgresql-9.6

需要安装下列安装包

sudo yum install flex
sudo yum install bison
sudo yum install postgresql96-devel

修改环境变量

# vim /etc/profile

插入
PATH=/usr/pgsql-9.6/bin:$PATH

# source /etc/profile

安装plproxy

pgsql官网的plproxy最新版2.5(只支持pgsql9.4及以前版本)
http://pgfoundry.org/projects/plproxy

github上最新的plproxy已更新至2.8
https://github.com/plproxy/plproxy/tree/plproxy_2_8

tar xvf plproxy-2.5.tar.gz
cd plproxy-2.5
make
make install

部署plproxy

创建proxy代理数据库

使用超级用户postgres进入数据库环境

[root@data-center-zookeeper bin]# sudo su - postgres
-bash-4.2$ psql

创建proxy角色

postgres=# CREATE ROLE proxy NOSUPERUSER LOGIN ENCRYPTED PASSWORD 'proxy';
CREATE ROLE

创建proxy数据库

digoal=# CREATE DATABASE proxy;
CREATE DATABASE

使用超级用户postgres进入到proxy数据库,并创建plproxy扩展

digoal=# \c proxy
You are now connected to database "proxy" as user "postgres".
proxy=# CREATE EXTENSION plproxy;
CREATE EXTENSION

调整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用户连接,调整pg_hba.conf文件的权限设置

创建digoal schema 使用proxy用户

proxy=> CREATE SCHEMA digoal;
CREATE SCHEMA

创建schema后最好加到search_path中,否则执行\dt无法列出来

SHOW search_path;
SET search_path TO myschema,public;

部署节点数据库

创建节点数据库(以两节点为例)

proxy=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".
postgres=# CREATE ROLE digoal NOSUPERUSER LOGIN ENCRYPTED PASSWORD 'digoal';
postgres=# CREATE DATABASE db0;
postgres=# CREATE DATABASE db1;

调整权限

postgres=# GRANT ALL ON DATABASE db0 TO digoal;
postgres=# GRANT ALL ON DATABASE db1 TO digoal;

部署proxy server

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

proxy=> \c proxy postgres  
You are now connected to database "proxy" as user "postgres".
proxy=# 
CREATE SERVER cluster_srv1 FOREIGN DATA WRAPPER plproxy OPTIONS
(connection_lifetime '1800',
p0 'dbname=db0 hostaddr=127.0.0.1 port=5432 application_name=test',
p1 'dbname=db1 hostaddr=127.0.0.1 port=5432');

此处有坑

  • 如果hostaddr相同,即在同一台主机上,dbname应该不同
  • 如果hostaddr不相同,则dbname要相同,否则proxy库函数执行失败,不知道why

将server权限赋予给proxy用户

proxy=# GRANT USAGE ON FOREIGN SERVER cluster_srv1 TO proxy;
GRANT

配置proxy用户的链接cluster_srv1的选项

proxy=# CREATE USER MAPPING FOR proxy SERVER cluster_srv1 OPTIONS (user 'digoal');
CREATE USER MAPPING

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

修改数据节点的pg_hba.conf

vi $PGDATA/pg_hba.conf
host db0 digoal 172.16.3.150/32 trust
host db1 digoal 172.16.3.150/32 trust
-bash-4.2$ pg_ctl reload

在plproxy节点创建代理函数

使用超级用户创建plproxy函数, 然后把函数权限赋予给proxy权限.

proxy=# CREATE OR REPLACE FUNCTION digoal.dy(sql text)
 RETURNS SETOF record
 LANGUAGE plproxy
 STRICT
AS $function$
  cluster 'cluster_srv1';
  run on all;
$function$;
proxy=# GRANT EXECUTE ON FUNCTION digoal.dy(text) TO proxy;
GRANT

在数据节点创建schema digoal,并创建实体函数

proxy=# \c db0 digoal  
db0=# CREATE SCHEMA digoal;
CREATE SCHEMA
db0=# 
CREATE OR REPLACE FUNCTION digoal.dy(sql text)  
 RETURNS SETOF record  
 LANGUAGE plpgsql  
 STRICT  
AS $function$  
  declare  
  rec record;  
  begin  
    for rec in execute sql loop  
      return next rec;  
    end loop;  
    return;  
  end;  
$function$;  
db0=# \c db1 digoal  
...  

在proxy节点中就可以访问数据节点了,例如

proxy=> select * from digoal.dy('select count(*) from pg_class') as t(i int8);  
  i    
-----  
 293  
 293  
 293  
 293  
(4 rows)  
proxy=> select sum(i) from digoal.dy('select count(*) from pg_class') as t(i int8);  
 sum    
------  
 1172  
(1 row)