首页
Linux教程
MongoDB教程
FTP教程
Apache教程
Nginx
jQuery
Redis
MySQL
PostgreSQL教程
PHP教程
Elasticsearch

PostgreSQL教程

目录
PostgreSQL教程

pgpool-II的使用


一、pgpool-II的概念

    pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:

  1. 连接池
    pgpool-II 保持已经连接到 PostgreSQL 服务器的连接, 并在使用相同参数(例如:用户名,数据库,协议版本) 连接进来时重用它们。 它减少了连接开销,并增加了系统的总体吞吐量。
  2. 复制
    pgpool-II 可以管理多个 PostgreSQL 服务器。 激活复制功能并使在2台或者更多 PostgreSQL 节点中建立一个实时备份成为可能, 这样,如果其中一台节点失效,服务可以不被中断继续运行。
  3. 负载均衡
    如果数据库进行了复制(可能运行在复制模式或者主备模式下), 则在任何一台服务器中执行一个 SELECT 查询将返回相同的结果。 pgpool-II 利用了复制的功能以降低每台 PostgreSQL 服务器的负载。 它通过分发 SELECT 查询到所有可用的服务器中,增强了系统的整体吞吐量。 在理想的情况下,读性能应该和 PostgreSQL 服务器的数量成正比。 负载均很功能在有大量用户同时执行很多只读查询的场景中工作的效果最好。
  4. 限制超过限度的连接
    PostgreSQL 会限制当前的最大连接数,当到达这个数量时,新的连接将被拒绝。 增加这个最大连接数会增加资源消耗并且对系统的全局性能有一定的负面影响。 pgpoo-II 也支持限制最大连接数,但它的做法是将连接放入队列,而不是立即返回一个错误。
  5. 并行查询
    使用并行查询时,数据可以被分割到多台服务器上, 所以一个查询可以在多台服务器上同时执行,以减少总体执行时间。 并行查询在查询大规模数据的时候非常有效。
  6. pgpool-II 使用 PostgreSQL 的前后台程序之间的协议,并且在前后台之间传递消息。 因此,一个(前端的)数据库应用程序认为 pgpool-II 就是实际的 PostgreSQL 数据库, 而后端的服务进程则认为 pgpool-II 是它的一个客户端。 因为 pgpool-II 对于服务器和客户端来说是透明的, 现有的数据库应用程序基本上可以不需要修改就可以使用 pgpool-II 了。

二、pgpool-II的安装

    pgpool-II 可以在 pgpool 开发页面下载到。 而且也提供包括 CentOS,RedHat Enterprise Linux,Fedora 和 Debian 在内的大量平台的二进制包。 请检查相关的软件库。可以在以下位置下载 pgpool-II 的源码:
    官网地址:http://www.pgpool.net/mediawiki/index.php/Downloads
    喆为大学:http://src.12cc.com/pgpool-II-4.1.0.tar.gz

    从源码安装 pgpool-II 需要 2.9 甚至或更高版本的 gcc,以及 GNU make。 而且,pgpool-II 需要链接到 libpq 库,所以在构建 pgpool-II 的机器上必须安装 libpq 库和它的开发头文件。 另外,还需要 OpenSSL 库和它的头文件以便在 pgpool-II 中提供 OpenSSL 支持。在解压源码包后,执行以下配置脚本

  1. 源码安装

    由于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

  2. 安装pgpool_regclass

    如果你在使用 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

  3. 建立insert_lock表【可选】

    如果你在复制模式中使用了 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. 配置服务器环境

    (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服务器就可以了,拷贝的操作跟上面的一样。

  2. 搭建流复制

    在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;



  3. 配置pgpool-II

    在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'