pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:
pgpool-II 使用 PostgreSQL 的前后台程序之间的协议,并且在前后台之间传递消息。 因此,一个(前端的)数据库应用程序认为 pgpool-II 就是实际的 PostgreSQL 数据库, 而后端的服务进程则认为 pgpool-II 是它的一个客户端。 因为 pgpool-II 对于服务器和客户端来说是透明的, 现有的数据库应用程序基本上可以不需要修改就可以使用 pgpool-II 了。
从源码安装 pgpool-II 需要 2.9 甚至或更高版本的 gcc,以及 GNU make。 而且,pgpool-II 需要链接到 libpq 库,所以在构建 pgpool-II 的机器上必须安装 libpq 库和它的开发头文件。 另外,还需要 OpenSSL 库和它的头文件以便在 pgpool-II 中提供 OpenSSL 支持。在解压源码包后,执行以下配置脚本
由于pgpool是基于PostgreSQL数据库的中间件,所以需要先安装PostgreSQL数据库服务后,才能使用pgpool。
如何安装PostgreSQL数据库服务器,可以参考以下链接:https://u.12cc.com/postgresql/postgresql23_1.html
我们以pgpool-II4.1.0为例,说明如何安装pgpool。
下载软件包。
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/src]#wget http://src.12cc.com/pgpool-II-4.1.0.tar.gz
解压软件包。
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/src]#tar -zxvf pgpool-II-4.1.0.tar.gz
编译安装。
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/src]#cd pgpool-II-4.1.0
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/src/pgpool-II-4.1.0]#./configure --prefix=/usr/local/pgpool --with-pgsql=/usr/local/postgresql
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/src/pgpool-II-4.1.0]#make
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/src/pgpool-II-4.1.0]#make install
如果你在使用 PostgreSQL 8.0 或之后的版本,强烈推荐在需要访问的 PostgreSQL 中安装 pgpool_regclass 函数,因为它被 pgpool-II 内部使用。 如果不这样做,在不同的 schema 中处理相同的表名会出现问题(临时表不会出问题)。
cd pgpool-II-×.×.0/src/sql
make
make install
因为这个模板数据库将被克隆成新建的数据库。
postgres=# CREATE EXTENSION pgpool_regclass;
CREATE EXTENSION
postgres=# CREATE EXTENSION pgpool_recovery;
CREATE EXTENSION
postgres=# \dx
如果你在复制模式中使用了 insert_lock ,强烈推荐建立 pgpool_catalog.insert_lock 表,用于互斥。 到现在为止,insert_lock 还能够工作。但是,在这种情况下,pgpool-II 需要锁定插入的目标表。 这种行为和 pgpool-II 2.2 和 2.3 系列类似。由于表锁与 VACUUM 冲突,所以 INSERT 操作可能因而等待很长时间。
cd pgpool-II-x.x.x/sql
psql -f insert_lock.sql template1
应在在每台通过 pgpool-II 访问的数据库中执行 insert_lock.sql。 你不需要在你执行"psql -f insert_lock.sql template1"后建立的数据库中这么做, 因为这个模板数据库将被克隆成新建的数据库
系统环境:
操作系统:Centos7
数据库版本:PostgreSQL 12.1
pg服务器:pgpool 10.30.108.145
数据库主服务器:master 10.29.81.105
数据库从服务器:slave 10.30.176.213
系统总架构设计模型:
(1)各台服务器配置以下hosts文件内容。
[root@iZm5e4blwrqoe0dh9gcyluZ /root]#vim /etc/hosts
以上配置了服务器pgpool 10.30.108.145的host文件,其它二台同理配置。
(2)主机免密码访问配置配置pgpool服务器到master和slave服务器的免密访问。在pgpool服务器上操作,记得切换到用户postgres。
[root@iZm5e4blwrqoe0dh9gcyluZ /root]#su postgres
[postgres@iZm5e4blwrqoe0dh9gcyluZ /root]$cd ~
[postgres@iZm5e4blwrqoe0dh9gcyluZ /home/postgres]$ll -a
用命令ssh-keygen -t rsa生成公私两个密匙文件。
[postgres@iZm5e4blwrqoe0dh9gcyluZ /home/postgres]$ssh-keygen -t rsa
命令过程按下3次回车,完成命令过程。
用命令ll -a看看公私密匙的生成情况。
文件夹".ssh"就是公私密匙的文件夹,进去看看。
[postgres@iZm5e4blwrqoe0 /home/postgres]$cd .ssh
[postgres@iZm5e4blwrqoe0dh9gcyluZdh9gcyluZ /home/postgres]$ll -a
把密匙文件"id_rsa"拷贝到master服务器去。
[postgres@iZm5e4blwrqoe0 /home/postgres]$ssh-copy-id -i /home/postgres/.ssh/id_rsa 10.29.81.105
命令执行过程中输入yes和master服务器用户postgres的密码。
用命令ssh 10.29.81.105(master服务器IP)测试能不能无密码访问master服务器。
上图显示,无密码访问master服务器成功。用exit命令退出master服务器连接。
slave服务器的无密码连接就是把pgpool服务器的私密匙文件id_rsa拷贝到slave服务器就可以了,拷贝的操作跟上面的一样。
在master服务器PostgreSQL数据库上创建监控角色,后面配置pool.conf需要用到这些设置。
以下操作在master服务器进行。
[root@iZ28lcmnq9qZ /root]#su postgres
[root@iZ28lcmnq9qZ /root]#cd ~
[postgres@iZ28lcmnq9qZ /home/postgresql]$cd /usr/local/pgsql/bin
[postgres@iZ28lcmnq9qZ /usr/local/pgsql/bin]$./psql
postgres=# create user srcheck PASSWORD '*****';
postgres=# alter user postgres password '*****';
postgres=# select rolname,rolpassword from pg_authid;
在pgpool服务器操作。
配置pgpool-II其实就是配置以下三个文件:pool_hba.conf、pgpool.conf和pcp.conf
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/pgpool]#cd /usr/local/pgpool/etc
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/pgpool/etc]#
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/pgpool/etc]#cp pool_hba.conf.sample pool_hba.conf
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/pgpool/etc]#cp pgpool.conf.sample-stream pgpool.conf
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/pgpool/etc]#cp pcp.conf.sample pcp.conf
配置pgpool.conf文件。
[root@iZm5e4blwrqoe0dh9gcyluZ /usr/local/pgpool/etc]#vim pgpool.conf
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898
# - Backend Connection Settings -
backend_hostname0 = 'master' #Host name or IP address to connect to for backend 0
backend_port0 = 5432 #Port number for backend 0
backend_weight0 = 1 #Weight for backend 0 (only in load balancing mode)
backend_data_directory0 = '/usr/local/pgsql/data' #Data directory for backend 0
backend_flag0 = 'ALLOW_TO_FAILOVER' #Controls various backend behavior.ALLOW_TO_FAILOVER or DISALLOW_TO_FAILOVER
-------------------------------------------------------------------------------
backend_hostname1 = 'slave'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/usr/local/pgsql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
# FILE LOCATIONS
pid_file_name = '/usr/local/postgresql/pgpool/pgpool.pid' #PID file name. (change requires restart)
logdir = '/usr/local/postgresql/log' # Directory of pgPool status file. (change requires restart)
# LOAD BALANCING MODE
load_balance_mode = on
# MASTER/SLAVE MODE
master_slave_mode = on #Activate master/slave mode. (change requires restart)
master_slave_sub_mode = 'stream' #Master/slave sub mode. Valid values are combinations slony or. stream. Default is slony. (change requires restart)
# - Streaming -
sr_check_period = 10 #Streaming replication check period. Disabled (0) by default
sr_check_user = 'srcheck'
sr_check_password = 'jlcherry'
sr_check_database = 'postgres'
# HEALTH CHECK
health_check_period = 10
health_check_timeout = 20
health_check_user = 'postgres'
health_check_password = 'jlcherry'
health_check_database = 'postgres'