数据库架构之【PostgreSQL12+PGPool-II4】RDBMS 集群方案

PostgreSQL12 是一款功能强大且开源(遵循BSD协议)的关系型数据库管理系统(RDBMS)。PostgreSQL12兼具NoSQL特性,支持两种JSON数据类型:json和jsonb,并自带流复制的实时备份和读写分离功能。

PGPool-II 是一款位于多个PostgreSQL数据库服务器和客户端之间,主要实现连接池、限制超过度连接、故障转移、在线恢复、数据复制、负载均衡、集群监听(看门狗)等功能的集群中间件。主要解决在业务系统存在大量的读并发时,通过负载均衡提高查询请求吞吐量,并将多个数据库节点集群化管理,在单点数据库故障时自动转移恢复,实现数据库高可用性。

本方案基于CentOS8系统设计,建议在RedHat/CentOS系统中使用。部署数据库集群使用服务器及网络资源较多,建议在实施前做好规划工作,有利于部署工作顺利、有序进行。

目录

1.前言

2.数据库集群部署拓扑图

3.PGPool-II的功能和模式

4.PostgreSQL数据库的安装和配置

5.主从库集群安装和配置

-- 5.1.在"数据库集群"上部署 PostgreSQL12 主从库

-- 5.2.在"数据库集群"上配置 SSH 互信

-- 5.3.在"中间件集群"节点上安装 PGPool-II-12 中间件

-- 5.4."数据库集群"节点故障恢复方案

6.复制集群安装和配置

-- 6.1.在"中间件集群"节点上安装 PGPool-II-12 中间件

-- 6.2."数据库集群"节点故障恢复方案

7.基于内存的查询缓存

8.集群管理和控制

9.后记:PGPool-II 中间件主配置文件详解(PGPool-II v4.1.1版官方文档中文翻译)


1.前言

数据库集群部署主要实现多个数据库服务器之间的负载均衡,故障转移,实时热备和读写分离。

1、方案使用的PostgreSQL12、PGPool-II-12(v4.1.1)和PGAdmin4软件的安装包,建议从PostgreSQL官方网站【https://www.postgresql.org】中使用yum源获取。建议将官方yum源进行本地化或私有化后再使用。有关如何进行yum源的本地化/私有化,请阅读文章《RedHat/CentOS8 【国内/本地/私有 YUM 源】制作和使用》,文章地址【https://www.jianshu.com/p/68db74388600】。

2、核心组件简介

1)PGPool-II:一款位于多个 PostgreSQL数据库服务器和客户端之间,主要实现连接池、限制超过度连接、故障转移、在线恢复、数据复制、负载均衡、集群监听(看门狗)等功能的集群中间件。PGPool-II主要解决在业务系统存在大量的读并发时,通过负载均衡提高查询请求吞吐量,并将多个数据库节点集群化管理,在单点数据库故障时自动转移恢复,实现数据库高可用性。官方网站:https://www.pgpool.net/

2)PostgreSQL:一款功能强大且开源的关系型数据库管理系统(RDBMS)。PostgreSQL12兼具NoSQL特性,支持两种JSON数据类型:json和jsonb,并自带流复制的实时备份和读写分离功能。

3)PGAdmin4:一款PostgreSQL数据库的官方客户端(PostgreSQL数据库专用图形化管理工具)。采用B/S架构设计,服务器端模式可以实现集中部署,用户通过浏览器即可实现管理个人建立的数据库,即安全又便于使用;功能强大且支持中文、英文等多种语言。


2.数据库集群部署拓扑图

数据库集群部署最少需要两个节点,建议至少部署三个节点,性能不足时可以扩充多个"数据库集群"节点。集群部署拓扑图如下:

数据库部署拓扑图

网络资源规划:

1、PostgreSQL 数据库集群

节点名 主机名 IP:PORT 程序 操作系统
主库 DB-1 192.168.216.28:5432 PostgreSQL12 CentOS8
从库-1 DB-2 192.168.216.29:5432 PostgreSQL12 CentOS8
从库≥2 DB-3 192.168.216.30:5432 PostgreSQL12 CentOS8

2、PGPool-II 中间件集群

节点名 主机名 IP:PORT 程序 操作系统
活动节点 DBC-1 192.168.216.128:9999 PGPool-II-12 CentOS8
备节点-1 DBC-2 192.168.216.129:9999 PGPool-II-12 CentOS8
备节点≥2 DBC-3 192.168.216.130:9999 PGPool-II-12 CentOS8

3、PGPool-II Virtual IP:192.168.216.200。

当存在≥2个以上集群节点时,通过配置PGPool-II的Watchdog组件建立高可用集群,客户端通过虚拟IP访问集群中间件。但是需要注意,当只有1个集群节点有效时,虚拟IP自动失效。

4、客户端

同一网段计算机,部署PGAdmin4或应用系统的调用程序模块。


3.PGPool-II的功能模式

1、PGPool-II的功能。

1)连接池

保持已经连接到数据库的连接,并在使用相同参数(例如:用户名,数据库,协议版本)连接访问数据库时重用。实现减少连接开销,增加系统的总体吞吐量。

2)限制过度连接

限制当前的最大连接数,当到达这个数量上限是,新的连接将被放入队列保持等待。

3)故障转移

在主备模式下,当主要数据库节点发生故障时,自动转到从属数据库节点继续运行。

4)在线恢复

在主备模式下,当从属从离线状态转为在线状态时,将主要数据库中的数据还原到从属数据库。

5)数据复制

在复制模式下,在2个或更多数据库节点的物理磁盘上创建一个实时数据备份,这样服务不会因其中一台数据库服务器的磁盘故障而中断。

6)负载均衡

如果数据库进行了复制, 则在任何一台服务器中执行一个 SELECT 查询将返回相同的结果。通过分发多个查询请求到所有可用的服务器中,增强了系统的整体吞吐量,在理想的情况下,读性能应该和 PostgreSQL 服务器的数量成正比。

7)内存查询缓存

基于内存的缓存保存 SELECT 语句(以及它绑定的参数,如果 SELECT 是一个扩展的查询)以及对应的数据,如果是相同的 SELECT 语句,则直接返回缓存的值;通过监视 UPDATE,INSERT,ALTER TABLE一类的查询语句自动删除缓存的数据。但无法发现通过触发器、外键和 DROP TABLE CASCADE 产生的非显式的更新。

8)集群高可用性(看门狗)

“看门狗”是一个 PGPool-II 的子进程,用于实现集群高可用性功能。通过多个 PGPool-II 的合作解决单点故障的问题。

2、PGPool-II的主要集群模式

1)主从库模式

主从库模式下支持连接池、限制过度连接、故障转移、在线恢复、负载均衡、内存查询缓存功能,由≥2个数据库节点组成。主要特点:

A)多个数据库节点并行工作。

B)主要数据库节点失效后,由从属数据库节点接管。

C)数据写入时,只写入到主要数据库节点,主要数据库节点将通过内置的流复制系统,将数据复制到从属数据库节点;数据查询时,多个查询请求分发到各个数据库节点,增强整体吞吐量。

2)复制模式

复制模式下支持连接池、限制过度连接、故障转移、在线恢复、负载均衡、数据复制、内存查询缓存功能,由≥2个数据库节点组成。主要特点:

A)多个数据库节点并行工作。

B)主要数据库节点失效后,由从属数据库节点接管。

C)数据写入时,分发写入请求到各个数据库节点,同时写入数据;数据查询时,多个查询请求分发到各个数据库节点,增强整体吞吐量。

3、PGPool-II的高可用性模式。

集群支持Watchdog(看门狗)功能,在≥2个集群节点时实现高可用性模式,通过虚拟IP地址访问集群中间件。主要特点:

A)同时只有1个集群节点工作。

B)主要集群节点失效后,由备用集群节点接管。


4.PostgreSQL 数据库的安装和配置

在"数据库集群"节点上安装 PostgreSQL12 数据库。有关如何安装 PostgreSQL12 数据库,请阅读文章《RedHat/CentOS8【PostgreSQL12】安装、配置和管理》,文章地址【https://www.jianshu.com/p/bb1675988568】。


5.主从库集群安装和配置

5.1.在"数据库集群"上部署 PostgreSQL12 主从库

有关如何部署 PostgreSQL12 主从库,请阅读文章《数据库架构之【PostgreSQL12+Replication】RDBMS 主从库读写分离方案》,文章地址【https://www.jianshu.com/p/73e8357f31ad】。


5.2.在"数据库集群"上创建集群管理用户并配置 SSH 互信

1)生成本地节点秘钥文件:

[centos@DB-1 ~]$ su postgres
-bash-4.4$ ssh-keygen -t rsa
Enter file in which to save the key (/var/lib/pgsql/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/pgsql/.ssh/id_rsa.
Your public key has been saved in /var/lib/pgsq/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:5DKsm0w7qC7mso1LWTkhEWFPQLQ5uvgFHhUk6D+S+hQ postgres@DB-1
......

2)创建本地及远程节点登录信息加密文件。注意所有节点都需要创建本地及远程节点登录信息加密文件:

-bash-4.4$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@192.168.216.28
-bash-4.4$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@192.168.216.29
-bash-4.4$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@192.168.216.30

注意: "数据库集群" 中的所有数据库节点上全部需要按照以上步骤配置。


5.3.在"中间件集群"节点上安装 PGPool-II-12 中间件

以"中间件集群活动节点"为例:

1、通过 PostgreSQL 官方 Yum 源安装 PGPool-II 中间件程序。PostgreSQL 官方 Yum 源中已提供了与PostgreSQL 配套的 PGPool-II 中间件。

[centos@DBC-1 ~]$ sudo dnf install pgpool-II-12
[centos@DBC-1 ~]$ sudo dnf install pgpool-II-12-extensions
[centos@DBC-1 ~]$ sudo dnf install pgpool-II-12-devel

注意:程序安装目录是"/usr/pgpool-12",程序配置目录是"/etc/pgpool-II-12",程序运行目录是"/var/run/pgpool-II-12"。

创建PGPool-II管理用户和组:

[centos@DBC-1 ~ ]$ sudo id postgres
id: “postgres”:无此用户
[centos@DBC-1 ~ ]$ sudo groupadd postgres
[centos@DBC-1 ~ ]$ sudo useradd -g postgres -s /bin/false postgres

2、配置 PGPool-II 中间件的控制接口认证文件。

PGPool-II 有一个控制接口,管理员可以通过它远程收集 PGPool-II 的状态信息或者终止 PGPool-II 进程。位于程序配置目录"/etc/pgpool-II-12"下的"pcp.conf"文件是用于这个接口认证的用户/密码配置文件,所有的模式都需要先设置"pcp.conf"文件。模板"pcp.conf.sample"文件在 PGPool-II 安装时已经被创建。拷贝并重命名这个文件为"pcp.conf"并添加用户名和密码。

1)拷贝并重命名配置文件。拷贝并重命名"/etc/pgpool-II-12/pcp.conf.sample"到"/etc/pgpool-II-12/pcp.conf"。

[centos@DBC-1 ~]$ sudo cp  /etc/pgpool-II-12/pcp.conf.sample  /etc/pgpool-II-12/pcp.conf

2)获取密码明文的MD5编码。"pcp.conf"文件中的密码信息采用MD5编码存储,在修改这个文件之前,需要把预设的密码转化为MD5编码,使用"pg_md5"命令将明文转化为MD5编码的功能。假设密码明文是"123456a?",则生成的MD5编码是"42857cfddb33f3fddb27fff9773683f3"。

[centos@DBC-1 ~]$ pg_md5 123456a?
42857cfddb33f3fddb27fff9773683f3

3)使用文本编辑器打开"/etc/pgpool-II-12/pcp.conf"文件:

[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pcp.conf

在文件中追加一组用户/密码信息后保存:

# List one UserID and password on a single line. They must
# be concatenated together using ':' (colon) between them.
# No spaces or tabs are allowed anywhere in the line.
# Example:
# postgres:e8a48653851e28c69d0506508fb27fc5

postgres:42857cfddb33f3fddb27fff9773683f

3、配置 PGPool-II 中间件的主从库集群参数。

位于程序配置目录"/etc/pgpool-II-12"下的"pgpool.conf"是PGPool-II的主配置文件。PGPool-II 安装时就创建了主从库集群的配置模板。拷贝并重命名主从库集群的模板文件为"pgpool.conf"。

1)拷贝并重命名主从库集群配置文件。拷贝并重命名"/etc/pgpool-II-12/pgpool.conf.sample-stream"到"/etc/pgpool-II-12/pgpool.conf"。

[centos@DBC-1 ~]$ sudo cp /etc/pgpool-II-12/pgpool.conf.sample-stream  /etc/pgpool-II-12/pgpool.conf

2)根据集群实际情况,编辑配置文件参数。

使用文本编辑器程序配置目录下的"pgpool.conf"文件:

[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pgpool.conf

设置或确认配置文件中关于主从库集群下的必要参数:

# CONNECTIONS

# - pgpool Connection Settings -
listen_addresses = '*'
port = 9999
socket_dir='/var/run/pgpool-II-12'

# - pgpool Communication Manager Connection Settings -
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/var/run/pgpool-II-12'

# - Backend Connection Settings -
backend_hostname0 = '192.168.216.28'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data/pgsql12-data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'DB-1'

backend_hostname1 = '192.168.216.29'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data/pgsql12-data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'DB-2'

backend_hostname2 = '192.168.216.30'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/data/pgsql12-data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name2 = 'DB-3'

# - Authentication -
enable_pool_hba = on
pool_passwd = 'pool_passwd'

# FILE LOCATIONS
pid_file_name = '/var/run/pgpool-II-12/pgpool.pid'

# REPLICATION MODE
replication_mode = off

# LOAD BALANCING MODE
load_balance_mode = on

#  MASTER/SLAVE MODE
master_slave_mode = on
master_slave_sub_mode = 'stream'
sr_check_user = 'postgres'
sr_check_password = 'password'
sr_check_database = 'postgres'

# ONLINE RECOVERY
recovery_user = 'postgres'
recovery_password = 'password'

# HEALTH CHECK GLOBAL PARAMETERS
health_check_period = 1
health_check_timeout = 20
health_check_user = 'postgres'
health_check_password = 'password'
health_check_database = 'postgres'

# FAILOVER AND FAILBACK
failover_command = '/etc/pgpool-II-12/failover_stream.sh  %h %H '

# WATCHDOG(如果只有一个PGPool-II数据库集群节点则不需配置此项)
use_watchdog = on
trusted_servers = ''
wd_hostname = '192.168.216.128'
wd_port = 9000
wd_ipc_socket_dir = '/var/run/pgpool-II-12'
delegate_IP = '192.168.216.200'
if_cmd_path = '/sbin'
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens33 label ens33:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens33'
arping_path = '/usr/sbin'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens33'

heartbeat_destination0 = '192.168.216.129'
heartbeat_destination_port0 = 9694
heartbeat_device0 = 'ens33'

heartbeat_destination1 = '192.168.216.130'
heartbeat_destination_port1 = 9694
heartbeat_device1 = 'ens33'

other_pgpool_hostname0 = '192.168.216.129'
other_pgpool_port0 = 9999
other_wd_port0 = 9000

other_pgpool_hostname1 = '192.168.216.130'
other_pgpool_port1 = 9999
other_wd_port1 = 9000

4、生成 PGPool-II 中间件的前端连接认证文件。

[centos@DBC-1 ~]$ sudo pg_md5 -m -p -u postgres /etc/pgpool-II-12/pool_passwd

5、为程序运行用户"postgres"增加"/sbin/ip"和"/usr/sbin/arping"两个指令的管理员免密运行权限。

使用文本编辑器打开"/etc/sudoers"文件:

[centos@DBC-1 ~]$ sudo gedit /etc/sudoers

在文件尾部追加以下内容并保存:

postgres  ALL=NOPASSWD: /sbin/ip,NOPASSWD:/usr/sbin/arping

6、从配置模板文件中生成故障恢复脚本。拷贝并重命名"/etc/pgpool-II-12/failover.sh.sample"到"/etc/pgpool-II-12/failover_stream.sh",并增加可执行权限:

[centos@DBC-1 ~]$ sudo cp /etc/pgpool-II-12/failover.sh.sample  /etc/pgpool-II-12/failover_stream.sh
[centos@DBC-1 ~]$ sudo chmod 755  /etc/pgpool-II-12/failover_stream.sh

编辑内容如下并保存:

#!/bin/bash

FAILED_NODE_HOST="$1"
NEW_MASTER_NODE_HOST="$2"
CLUSTER_NODE_HOST=("192.168.216.28" "192.168.216.29" "192.168.216.30")
PGPORT=5432
PGHOME=/usr/pgsql-12
PGDATA=/data/pgsql12-data
if [ -f "/tmp/pgsql_failover_stream.log" ]; then
  rm -rf /tmp/pgsql_failover_stream.log
fi

touch /tmp/pgsql_failover_stream.log
echo "当前故障的主要数据库节点:"$FAILED_NODE_HOST >> /tmp/pgsql_failover_stream.log
echo "计划提升的主要数据库节点:"$NEW_MASTER_NODE_HOST >> /tmp/pgsql_failover_stream.log
echo "主从一致的数据库程序目录:"$PGHOME >> /tmp/pgsql_failover_stream.log
echo "主从一致的数据库数据实例目录:"$PGDATA >> /tmp/pgsql_failover_stream.log
if [ -n $NEW_MASTER_NODE_HOST ]; then
  echo "新的主要节点配置信息验证通过..." >> /tmp/pgsql_failover_stream.log
  ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null postgres@$NEW_MASTER_NODE_HOST -i ~/.ssh/id_rsa $PGHOME/bin/pg_ctl -D $PGDATA -w promote
  echo "已升级新的主要节点..." >> /tmp/pgsql_failover_stream.log
  echo "本次故障切换完成.新的主要节点是:"$NEW_MASTER_NODE_HOST"时间:"$(date +"%Y-%m-%d %T") >> /tmp/pgsql_failover_stream.log
  echo "请登录到从属节点服务器,将从属节点关联到新的主要节点。登录后执行以下操作步骤:" >> /tmp/pgsql_failover_stream.log
  echo "1.停止数据库服务:$ sudo systemctl stop postgresql-12.service" >> /tmp/pgsql_failover_stream.log
  echo "2.切入postgres用户:[centos@host ~]$ su postgres" >> /tmp/pgsql_failover_stream.log
  echo "3.清空从属节点的数据实例目录:$ rm -rf "$PGDATA"/*" >> /tmp/pgsql_failover_stream.log
  echo "4.关联新的主要节点,如:$ pg_basebackup -h "$NEW_MASTER_NODE_HOST" -U postgres -p "$PGPORT" -D "$PGDATA" -Fp -Xs -P -R" >> /tmp/pgsql_failover_stream.log
  echo "5.切出postgres用户:$ exit" >> /tmp/pgsql_failover_stream.log
  echo "6.启动数据库服务,如:[centos@host ~]$ sudo systemctl start postgresql-12.service" >> /tmp/pgsql_failover_stream.log
else
  echo "本次故障切换失败.原因:找不到新的主要数据库节点.时间:"$(date +"%Y-%m-%d %T") >> /tmp/pgsql_failover_stream.log
  exit 1
fi

for HOST in ${CLUSTER_NODE_HOST[@]}
do
   if [ $HOST != $NEW_MASTER_NODE_HOST -a $HOST != $FAILED_NODE_HOST ]; then
     ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null postgres@$HOST -i ~/.ssh/id_rsa $PGHOME/bin/pg_ctl -D $PGDATA -w -m fast stop
     echo "停止已失效的从属节点:"$HOST >> /tmp/pgsql_failover_stream.log
   fi
done
exit 0

7、配置 PGPool-II 中间件的远程访问策略。PGPool-II 安装完成后默认只允许本地访问。

1)拷贝并重命名配置文件。拷贝并重命名"/etc/pgpool-II-12/pool_hba.conf.sample"到"/etc/pgpool-II-12/pool_hba.conf":

[centos@DBC-1 ~]$ sudo cp  /etc/pgpool-II-12/pool_hba.conf.sample  /etc/pgpool-II-12/pool_hba.conf

2)设置PGPool-II访问策略,可以设置多个由主机类型、数据库、用户、IP地址组成的策略。

使用文本编辑器程序配置目录下的"pool_hba.conf"文件:

[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pool_hba.conf

在文件的"# IPv4 local connections"策略中追加一条“允许全部用户,通过全部网络地址访问全部数据库”的策略并保存,策略定义如下:

# IPv4 local connections:
# 默认只有一条"允许全部用户,通过本地网络地址访问全部数据库"的策略
host      all            all    127.0.0.1/32            trust
# 追加一条“允许全部用户,通过全部网络地址访问全部数据库”的策略
host      all              all    0.0.0.0/0    md5

3)设置防火墙端口(CentOS8 默认安装 firewall 防火墙),允许"9999","9898","9000","9694"端口(PGPool-II 各功能默认端口)访问服务器。

[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=9999/tcp --permanent
[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=9898/tcp --permanent
[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=9694/tcp --permanent
[centos@DBC-1 ~]$ sudo firewall-cmd --reload

8、验证 PGPool-II 服务管理配置,但不要设置为开机启动。

1)修改服务管理配置信息。

使用文本编辑器打开配置文件:

[centos@DBC-1 ~]$ sudo gedit /usr/lib/systemd/system/pgpool-II-12.service

修改文件内容如下:

[Unit]
Description=PGPool-II Middleware Between PostgreSQL Servers And PostgreSQL Database Clients
After=syslog.target network.target

[Service]
User=postgres
Group=postgres
EnvironmentFile=/etc/sysconfig/pgpool-II-12
ExecStart=/usr/pgpool-12/bin/pgpool -f /etc/pgpool-II-12/pgpool.conf $OPTS
ExecStop=/usr/pgpool-12/bin/pgpool -f /etc/pgpool-II-12/pgpool.conf -m fast stop
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

2)修改服务启动参数信息。

使用文本编辑器打开配置文件:

[centos@DBC-1 ~]$ sudo gedit /etc/sysconfig/pgpool-II-12

修改文件内容如下:

OPTS=" -n -D -C"

3)禁用开机启动,PGPool-II服务不宜使用开机自动启动的模式,建议人工操作。

[centos@DBC-1 ~]$ sudo systemctl disable pgpool-II-12.service

注意:其他"中间件集群"节点上全部需要按照以上步骤配置。

9、启动 PGPool-II。

启动 PGPool-II 服务之前,应确保已正确启动了各数据库集群节点的 PostgreSQL 服务。

各节点的启动或重启的顺序为:

① 依次关闭全部节点的 PGPool-II 服务;

② 启动活动节点上的 PGPool-II 服务;

③ 依次备用节点上的 PGPool-II 服务。

假设DBC1为数据库主要节点,DBC2和DBC3为备用节点。

[centos@DBC-3 ~]$ sudo systemctl stop pgpool-II-12.service
[centos@DBC-2 ~]$ sudo systemctl stop pgpool-II-12.service
[centos@DBC-1 ~]$ sudo systemctl stop pgpool-II-12.service


[centos@DBC-1 ~]$ sudo systemctl start pgpool-II-12.service
[centos@DBC-2 ~]$ sudo systemctl start pgpool-II-12.service
[centos@DBC-3 ~]$ sudo systemctl start pgpool-II-12.service

10、查看集群主从节点。

[centos@DBC-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -h 192.168.216.200 -p 9999 -c 'show pool_nodes'

5.4."数据库集群"节点故障恢复方案

当主要节点发生故障后,会提升一个从属节点作为新的主要节点,并停止其他的从属节点的数据库服务,整体来看就是将集群数据库降级成为单点数据库。故障恢复策略在"/etc/pgpool-II-12/failover_stream.sh"文件中定义,详见"5.3.在"中间件集群"节点上安装 PGPool-II-12 中间件"第 6 个步骤

故障节点恢复的思路是:重新配置故障节点(原主要节点)以及已经停止的从属节点(原主要节点的从属节点)的流复制,使它们作为新主要节点的从属节点。

1、禁止新主要节点的对外请求响应。

通过关闭防火墙策略、关闭集群或定义数据库实例目录中"pg_hba.conf"文件的策略,使新的主要节点受限访问,固定数据库快照。

2、 在"数据库集群"上重新配置 PostgreSQL12 主从库。

假设故障主库节点是"DB-1",IP地址是"192.168.216.28";新的主库节点是"DB-2",IP地址是"192.168.216.29",作步骤如下:

1)停止数据库服务(默认已经停止)。

[centos@DB-1 ~]$ sudo systemctl stop postgresql-12.service

2)清空数据库实例目录中的数据(注意删除隐藏文件)。

[centos@DB-1 ~]$ su postgres
-bash-4.4$ rm -rf /data/pgsql12-data/*
-bash-4.4$ exit

3)从主要数据库执行备份并还原到本地。

[centos@DB-1 ~]$ sudo -u postgres  /usr/pgsql-12/bin/pg_basebackup -h 192.168.216.29 -U postgres -p 5432 -D /data/pgsql12-data -Fp -Xs -P -R
Password:
426401/9113562 kB (4%), 0/1 tablespace

其中:-Fp表示以plain格式数据,-Xs表示以stream方式包含所需的WAL文件,-P表示显示进度,-R表示为replication写配置信息。备份完成,在数据库实例目录下自动生成standby.signal“信号”文件,并在"postgresql.auto.conf"文件写入了主要数据库的连接信息。

4)重新启动数据库。

[centos@DB-1 ~]$ sudo systemctl start postgresql-12.service

5)验证当前数据库节点是否为从属节点,查询结果为"t"表示当前数据库节点为从属节点。

[centos@DB-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -c "select pg_is_in_recovery()"
查询结果为"t"表示当前数据库节点为从属节点

注意:其他"已停止的从属数据库"节点上全部需要按照以上步骤配置。

3、恢复新主要节点的对外请求响应。

通过开启防火墙策略、开启集群或定期数据库实例目录中"pg_hba.conf"文件的策略,恢复新主要节点的对外请求响应。


6.复制集群安装和配置

6.1.在"中间件集群"节点上安装 PGPool-II-12 中间件

以"中间件集群活动节点"为例:

1、通过 PostgreSQL 官方 Yum 源安装 PGPool-II 中间件程序。PostgreSQL 官方 Yum 源中已提供了与PostgreSQL 配套的 PGPool-II 中间件。

[centos@DBC-1 ~]$ sudo dnf install pgpool-II-12
[centos@DBC-1 ~]$ sudo dnf install pgpool-II-12-extensions
[centos@DBC-1 ~]$ sudo dnf install pgpool-II-12-devel

注意:程序安装目录是"/usr/pgpool-12",程序配置目录是"/etc/pgpool-II-12",程序运行目录是"/var/run/pgpool-II-12"。

创建PGPool-II管理用户和组:

[centos@DBC-1 ~ ]$ sudo id postgres
id: “postgres”:无此用户
[centos@DBC-1 ~ ]$ sudo groupadd postgres
[centos@DBC-1 ~ ]$ sudo useradd -g postgres -s /bin/false postgres

2、配置 PGPool-II 中间件的控制接口认证文件。

PGPool-II 有一个控制接口,管理员可以通过它远程收集 PGPool-II 的状态信息或者终止 PGPool-II 进程。位于程序配置目录"/etc/pgpool-II-12"下的"pcp.conf"文件是用于这个接口认证的用户/密码配置文件,所有的模式都需要先设置"pcp.conf"文件。模板"pcp.conf.sample"文件在 PGPool-II 安装时已经被创建。拷贝并重命名这个文件为"pcp.conf"并添加用户名和密码。

1)拷贝并重命名配置文件。拷贝并重命名"/etc/pgpool-II-12/pcp.conf.sample"到"/etc/pgpool-II-12/pcp.conf"。

[centos@DBC-1 ~]$ sudo cp  /etc/pgpool-II-12/pcp.conf.sample  /etc/pgpool-II-12/pcp.conf

2)获取密码明文的MD5编码。"pcp.conf"文件中的密码信息采用MD5编码存储,在修改这个文件之前,需要把预设的密码转化为MD5编码,使用"pg_md5"命令将明文转化为MD5编码的功能。假设密码明文是"123456a?",则生成的MD5编码是"42857cfddb33f3fddb27fff9773683f3"。

[centos@DBC-1 ~]$ pg_md5 123456a?
42857cfddb33f3fddb27fff9773683f3

3)使用文本编辑器打开"/etc/pgpool-II-12/pcp.conf"文件:

[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pcp.conf

在文件中追加一组用户/密码信息后保存:

# List one UserID and password on a single line. They must
# be concatenated together using ':' (colon) between them.
# No spaces or tabs are allowed anywhere in the line.
# Example:
# postgres:e8a48653851e28c69d0506508fb27fc5

postgres:42857cfddb33f3fddb27fff9773683f

3、配置 PGPool-II 中间件的复制集群参数。

位于程序配置目录"/etc/pgpool-II-12"下的"pgpool.conf"是PGPool-II的主配置文件。PGPool-II 安装时就创建了复制集群的配置模板。拷贝并重命名复制集群的模板文件为"pgpool.conf"。

1)拷贝并重命名复制集群配置文件。拷贝并重命名"/etc/pgpool-II-12/pgpool.conf.sample-replication"到"/etc/pgpool-II-12/pgpool.conf"。

[centos@DBC-1 ~]$ sudo cp /etc/pgpool-II-12/pgpool.conf.sample-replication  /etc/pgpool-II-12/pgpool.conf

2)根据集群实际情况,编辑配置文件参数。

使用文本编辑器程序配置目录下的"pgpool.conf"文件:

[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pgpool.conf

设置或确认配置文件中关于复制模式下的必要参数:

# CONNECTIONS

# - pgpool Connection Settings -
listen_addresses = '*'
port = 9999
socket_dir='/var/run/pgpool-II-12'

# - pgpool Communication Manager Connection Settings -
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/var/run/pgpool-II-12'

# - Backend Connection Settings -
backend_hostname0 = '192.168.216.28'

backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data/pgsql12-data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'DB-1'

backend_hostname1 = '192.168.216.29'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data/pgsql12-data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'DB-2'

backend_hostname2 = '192.168.216.130'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/data/pgsql12-data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name2 = 'DB-3'

# - Authentication -
enable_pool_hba = on
pool_passwd = 'pool_passwd'

# FILE LOCATIONS
pid_file_name = '/var/run/pgpool-II-12/pgpool.pid'

# REPLICATION MODE
replication_mode = on

# LOAD BALANCING MODE
load_balance_mode = on

#  MASTER/SLAVE MODE
master_slave_mode = off

# ONLINE RECOVERY
recovery_user = 'postgres'
recovery_password = 'password'

# HEALTH CHECK GLOBAL PARAMETERS
health_check_period = 1
health_check_timeout = 20
health_check_user = 'postgres'
health_check_password = 'password'
health_check_database = 'postgres'

# WATCHDOG(如果只有一个PGPool-II数据库集群节点则不需配置此项)
use_watchdog = on
trusted_servers = ''
wd_hostname = '192.168.216.128'
wd_port = 9000
wd_ipc_socket_dir = '/var/run/pgpool-II-12'
delegate_IP = '192.168.216.200'
if_cmd_path = '/sbin'
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens33 label ens33:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens33'
arping_path = '/usr/sbin'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens33'

heartbeat_destination0 = '192.168.216.129'
heartbeat_destination_port0 = 9694
heartbeat_device0 = 'ens33'

heartbeat_destination1 = '192.168.216.130'
heartbeat_destination_port1 = 9694
heartbeat_device1 = 'ens33'

other_pgpool_hostname0 = '192.168.216.129'
other_pgpool_port0 = 9999
other_wd_port0 = 9000

other_pgpool_hostname1 = '192.168.216.130'
other_pgpool_port1 = 9999
other_wd_port1 = 9000

4、生成 PGPool-II 中间件的前端连接认证文件。

[centos@DBC-1 ~]$ sudo pg_md5 -m -p -u postgres /etc/pgpool-II-12/pool_passwd

5、为程序运行用户"postgres"增加"/sbin/ip"和"/usr/sbin/arping"两个指令的管理员免密运行权限。

使用文本编辑器打开"/etc/sudoers"文件:

[centos@DBC-1 ~]$ sudo gedit /etc/sudoers

在文件尾部追加以下内容并保存:

postgres  ALL=NOPASSWD: /sbin/ip,NOPASSWD:/usr/sbin/arping

6、配置 PGPool-II 中间件的远程访问策略。PGPool-II 安装完成后默认只允许本地访问。

1)拷贝并重命名配置文件。拷贝并重命名"/etc/pgpool-II-12/pool_hba.conf.sample"到"/etc/pgpool-II-12/pool_hba.conf":

[centos@DBC-1 ~]$ sudo cp  /etc/pgpool-II-12/pool_hba.conf.sample  /etc/pgpool-II-12/pool_hba.conf

2)设置PGPool-II访问策略,可以设置多个由主机类型、数据库、用户、IP地址组成的策略。

使用文本编辑器程序配置目录下的"pool_hba.conf"文件:

[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pool_hba.conf

在文件的"# IPv4 local connections"策略中追加一条“允许全部用户,通过全部网络地址访问全部数据库”的策略并保存,策略定义如下:

# IPv4 local connections:
# 默认只有一条"允许全部用户,通过本地网络地址访问全部数据库"的策略
host      all            all    127.0.0.1/32            trust
# 追加一条“允许全部用户,通过全部网络地址访问全部数据库”的策略
host      all              all    0.0.0.0/0    md5

3)设置防火墙端口(CentOS8 默认安装 firewall 防火墙),允许"9999","9898","9000","9694"端口(PGPool-II 各功能默认端口)访问服务器。

[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=9999/tcp --permanent
[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=9898/tcp --permanent
[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
[centos@DBC-1 ~]$ sudo firewall-cmd --zone=public --add-port=9694/tcp --permanent
[centos@DBC-1 ~]$ sudo firewall-cmd --reload

7、验证 PGPool-II 服务管理配置,但不要设置为开机启动。

1)修改服务管理配置信息。

使用文本编辑器打开配置文件:

[centos@DBC-1 ~]$ sudo gedit /usr/lib/systemd/system/pgpool-II-12.service

修改文件内容如下:

[Unit]
Description=PGPool-II Middleware Between PostgreSQL Servers And PostgreSQL Database Clients
After=syslog.target network.target

[Service]
User=postgres
Group=postgres
EnvironmentFile=/etc/sysconfig/pgpool-II-12
ExecStart=/usr/pgpool-12/bin/pgpool -f /etc/pgpool-II-12/pgpool.conf $OPTS
ExecStop=/usr/pgpool-12/bin/pgpool -f /etc/pgpool-II-12/pgpool.conf -m fast stop
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

2)修改服务启动参数信息。

使用文本编辑器打开配置文件:

[centos@DBC-1 ~]$ sudo gedit /etc/sysconfig/pgpool-II-12

修改文件内容如下:

OPTS=" -n -D -C"

3)禁用开机启动,PGPool-II服务不宜使用开机自动启动的模式,建议人工操作。

[centos@DBC-1 ~]$ sudo systemctl disable pgpool-II-12.service

注意:其他"中间件集群"节点上全部需要按照以上步骤配置。

8、启动 PGPool-II。

启动 PGPool-II 服务之前,应确保已正确启动了各数据库集群节点的 PostgreSQL 服务。

各节点的启动或重启的顺序为:

① 依次关闭全部节点的 PGPool-II 服务;

② 启动活动节点上的 PGPool-II 服务;

③ 依次备用节点上的 PGPool-II 服务。

假设DBC1为数据库主要节点,DBC2和DBC3为备用节点。

[centos@DBC-3 ~]$ sudo systemctl stop pgpool-II-12.service
[centos@DBC-2 ~]$ sudo systemctl stop pgpool-II-12.service
[centos@DBC-1 ~]$ sudo systemctl stop pgpool-II-12.service


[centos@DBC-1 ~]$ sudo systemctl start pgpool-II-12.service
[centos@DBC-2 ~]$ sudo systemctl start pgpool-II-12.service
[centos@DBC-3 ~]$ sudo systemctl start pgpool-II-12.service

9、查看集群主从节点。

[centos@DBC-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -h 192.168.216.200 -p 9999 -c 'show pool_nodes'

6.2."数据库集群"节点故障恢复方案

在复制模式中,数据库的任一节点发生故障后会自动离线,离线之后的数据库不论是否仍然可用,都会脱离集群成为单点数据库,只有重新启动集群后,才会恢复成在线数据库。

故障节点恢复的思路是:将已离线的节点通过流复制的方式从在线节点中同步最新数据后,重启集群服务,将离线节点重新恢复在线。

1、禁止所有节点的对外请求响应。

关闭集群,通过关闭防火墙策略或定义数据库实例目录中"pg_hba.conf"文件的策略,使所有节点受限访问,固定数据库快照。

2、开启任一在线节点的 Replication 访问策略,作为故障节点恢复的数据库参照节点。

假设故障主库节点是"DB-1",IP地址是"192.168.216.28";数据库参照节点是"DB-2",IP地址是"192.168.216.29",作步骤如下:

1)设置数据库流复制访问策略。使用文本编辑器打开数据存储目录下的"pg_hba.conf"文件:

[centos@DB-2 ~]$ sudo gedit /data/pgsql12-data/pg_hba.conf

在文件的"# IPv4 local connections"策略中追加一条“允许postgres用户,通过全部网络地址使用 Replication 的策略并保存,策略定义如下:

# replication privilege.
# 追加一条“允许postgres用户,通过全部网络地址使用流复制”的策略
host      replication              postgres    0.0.0.0/0    trust

2)重新加载配置参数。

[centos@DB-2 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -c "select pg_reload_conf()"

3、故障(离线)节点通过 Replication 同步最新数据。

1)停止数据库服务(默认已经停止)。

[centos@DB-1 ~]$ sudo systemctl stop postgresql-12.service

2)清空数据库实例目录中的数据(注意删除隐藏文件)。

[centos@DB-1 ~]$ su postgres
-bash-4.4$  rm -rf /data/pgsql12-data/*
-bash-4.4$  exit

3)从主要数据库执行备份并还原到本地。

[centos@DB-1 ~]$ sudo -u postgres  /usr/pgsql-12/bin/pg_basebackup -h 192.168.216.29 -U postgres -p 5432 -D /data/pgsql12-data -Fp -Xs -P -R
Password:
426401/9113562 kB (4%), 0/1 tablespace

其中:-Fp表示以plain格式数据,-Xs表示以stream方式包含所需的WAL文件,-P表示显示进度,-R表示为replication写配置信息。备份完成,在数据库实例目录下自动生成standby.signal“信号”文件,并在"postgresql.auto.conf"文件写入了主要数据库的连接信息。

4)重新启动数据库。

[centos@DB-1 ~]$ sudo systemctl start postgresql-12.service

5)验证当前数据库节点是否为从属节点,查询结果为"t"表示当前数据库节点为从属节点。

[centos@DB-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -c "select pg_is_in_recovery()"
查询结果为"t"表示当前数据库节点为从属节点

注意:其他"已停止的从属数据库"节点上全部需要按照以上步骤配置。

3、恢复新主要节点的对外请求响应。

通过开启防火墙策略、开启集群或定期数据库实例目录中"pg_hba.conf"文件的策略,恢复新主要节点的对外请求响应。


7.基于内存的查询缓存

在各集群节点的"pgpool.conf"文件中开启内存缓存库功能。以"中间件集群"活动节点为例:

使用文本编辑器程序配置目录下的"pgpool.conf"文件。

[centos@DB-1 ~]$ sudo gedit /etc/pgpool-II-12/pgpool.conf

设置或确认配置文件中关于内存缓存库的必要参数,使用默认设置开启内置的内存缓存库。

# IN MEMORY QUERY MEMORY CACHE
memory_cache_enabled = on
memqcache_method = 'shmem'
memqcache_oiddir = '/var/log/pgpool-II-12/oiddir'

详细配置参见"9.后记:PGPool-II中间件主配置文件详解(PGPool-II v4.1.1版官方文档中文翻译)"章节。


8.集群管理和控制

1、启动集群

[centos@DBC-1 ~]$ sudo systemctl start pgpool-II-12.service
[centos@DBC-1 ~]$ sudo -u postgres /usr/pgpool-12/bin/pgpool -n -d -C > /tmp/pgpool.log 2>&1 &
[centos@DBC-1 ~]$ sudo -u postgres cat /tmp/pgpool.log

2、停止集群

[centos@DBC-1 ~]$ sudo systemctl stop pgpool-II-12.service
[centos@DBC-1 ~]$ sudo -u postgres /usr/pgpool-12/bin/pgpool -m fast stop

3、查看集群配置信息

[centos@DBC-1 ~]$  /usr/pgpool-12/bin/pcp_pool_status -h 192.168.216.200 -p 9898 -U postgres

其中:-h 表示集群IP,-p 表示PCP管道端口(默认是9898),-U 表示 PCP管道用户。

4、查看集群节点详情

[centos@DBC-1 ~]$  /usr/pgpool-12/bin/pcp_watchdog_info  -h 192.168.216.200 -p 9898 -U postgres -v

其中:-h 表示集群IP,-p 表示PCP管道端口(默认是9898),-U 表示 PCP管道用户,-v表示查看详细内容(不使用本参数时显示摘要内容)。

5、查看集群节点数量

[centos@DBC-1 ~]$  /usr/pgpool-12/bin/pcp_node_count -h 192.168.216.200 -p 9898 -U postgres

其中:-h 表示集群IP,-p 表示PCP管道端口(默认是9898),-U 表示 PCP管道用户。

6、查看指定的集群节点信息

[centos@DBC-1 ~]$  /usr/pgpool-12/bin/pcp_node_info  -h 192.168.216.200 -p 9898 -U postgres -n 0 -v

其中:-h 表示集群IP,-p 表示PCP管道端口(默认是9898),-U 表示 PCP管道用户,-n 表示节点序号(从0开始),-v表示查看详细内容(不使用本参数时显示摘要内容)。

7、增加一个集群节点

[centos@DBC-1 ~]$  /usr/pgpool-12/bin/pcp_attach_node  -h 192.168.216.200 -p 9898 -U postgres -n 0 -v

其中:-h 表示集群IP,-p 表示PCP管道端口(默认是9898),-U 表示 PCP管道用户,-n 表示节点序号(从0开始),-v表示查看详细内容(不使用本参数时显示摘要内容)。

8、脱离一个集群节点

[centos@DBC-1 ~]$  /usr/pgpool-12/bin/pcp_detach_node -h 192.168.216.200 -p 9898 -U postgres -n 0 -v

其中:-h 表示集群IP,-p 表示PCP管道端口(默认是9898),-U 表示 PCP管道用户,-n 表示节点序号(从0开始),-v表示查看详细内容(不使用本参数时显示摘要内容)。

9、提升一个集群备用节点为活动节点

[centos@DBC-1 ~]$  /usr/pgpool-12/bin/pcp_promote_node -h 192.168.216.200 -p 9898 -U postgres -n 0 -v

其中:-h 表示集群IP,-p 表示PCP管道端口(默认是9898),-U 表示 PCP管道用户,-n 表示节点序号(从0开始),-v表示查看详细内容(不使用本参数时显示摘要内容)。

10、恢复一个离线节点为集群节点

[centos@DBC-1 ~]$  /usr/pgpool-12/bin/pcp_recovery_node -h 192.168.216.200 -p 9898 -U postgres -n 0 -v

其中:-h 表示集群IP,-p 表示PCP管道端口(默认是9898),-U 表示 PCP管道用户,-n 表示节点序号(从0开始),-v表示查看详细内容(不使用本参数时显示摘要内容)。

11、连接集群数据库

[centos@DBC-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -h 192.168.216.200 -p 9999

12、查看集群数据库状态

[centos@DBC-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -h 192.168.216.200 -p 9999 -c 'show pool_nodes'

9.后记:PGPool-II 中间件主配置文件详解(PGPool-II v4.1.1版官方文档中文翻译)

位于程序配置目录"/etc/pgpool-II-12"下的"pgpool.conf"是PGPool-II的主配置文件,这个文件中定义了PGPool-II不同运行模式和参数。主配置文件的参数包括:

1、连接(CONNECTIONS)

1)前端连接(pgpool Connection Settings)

A)listen_addresses:设置 pgpool-II 监听的主机名或者IP地址。'*'将监听所有连接,''将不监听任何连接,默认为'localhost'。
B)port:设置 pgpool-II 监听连接的端口号。默认为 9999。
C)socket_dir:设置 pgpool-II 监听套接字连接的目录。 默认为'/tmp'。建议设置这个值为'/var/run'或类似目录。
D)listen_backlog_multiplier:设置 pgpool-II 监听连接队列的长度。默认值为 2。
E)serialize_accept:设置 pgpool-II 是否针对客户端的连接串行化的调用过程。默认为 off,即不进行串行化。
F)reserved_connections:设置 pgpool-II 保留连接数,如果超过该值则不再接受连接。默认值为0,即不限制连接数。

2)PCP连接(pgpool Communication Manager Connection Settings)

A)pcp_listen_addresses: 设置pcp 进程TCP/IP接受连接的主机名或IP地址。 '*' 接收所有的连接,'' 禁用 TCP/IP 连接,默认为 '*'。
B)pcp_port: 设置pcp进程接受连接的端口号。默认为 9898。
C)pcp_socket_dir:设置pcp进程用于建立接受套接字连接的目录。 默认为 '/tmp'。建议设置这个值为 '/var/run' 或类似目录。

3)后端数据库节点连接(Backend Connection Settings)

B)backend_port0:设置PostgreSQL 数据库的端口号。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为 5432。
C)backend_weight0:设置PostgreSQL数据库的负载均衡权重。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。 默认为1。
D)backend_data_directory0:设置PostgreSQL数据库实例的目录。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为'/var/lib/pgsql/12/data'。
E)backend_flag0:设置PostgreSQL数据库的行为标志。'ALLOW_TO_FAILOVER'表示允许故障切换或者从后台程序断开;'DISALLOW_TO_FAILOVER'表示不允许故障切换或者从后台程序断开。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为'ALLOW_TO_FAILOVER'。
F)backend_application_name0:设置PostgreSQL数据库的应用别名(仅用于管理时显示)。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为'server0'。

4)认证(Authentication)

A)enable_pool_hba:设置 pgpool-II 是否使用 'pgpool_hba.conf'配置文件来进行客户端认证。默认为off。
B)pool_passwd:设置用于 MD5 认证的文件名。默认为'pool_passwd','' 表示禁用。
C)authentication_timeout:设置认证超时的时长。0 表示禁用超时,默认为 60 。
D)allow_clear_text_frontend_auth:设置是否允许对客户端使用明文密码身份验证。默认为off。

5)SSL连接(SSL Connections)

A)ssl:设置 pgpool-II 是否启用前后端程序的 SSL 支持。开启后必须设置ssl_key和ssl_cert,默认为off。
B)ssl_key :设置SSL连接私钥文件路径。默认为'./server.key',注释不启用。
C)ssl_cert:设置SSL连接公钥证书文件路径。默认为'./server.cert',注释不启用。
D)ssl_ca_cert:设置一个 PEM 格式的证书文件路径,包含一个或多个 CA 根证书, 用于校验后端的服务器证书。默认为'',注释不启用。
E)ssl_ca_cert_dir:设置一个包含 PEM 格式的 CA 证书的目录的路径,用于校验后端的服务器证书。默认为'',注释不启用。
F)ssl_ciphers:设置允许的SSL秘钥。默认为'HIGH:MEDIUM:+3DES:!aNULL'。
G)ssl_prefer_server_ciphers:设置使用服务器的SSL密码,而不是客户端的。默认为off。
H)ssl_ecdh_curve:设置用于ECDH密钥交换的曲线算法名称。默认为'prime256v1'。
I)ssl_dh_params_file:设置包含Diffie-Hellman参数的文件路径。默认为''。

2、池(POOLS)

A)num_init_children:设置 pgpool-II  预生成的服务子进程数, 也是支持从客户端发起的最大并发连接数,超出数量的客户端尝试连接将被阻塞(而不是拒绝连接),直到已有连接被关闭释放。默认为 32。
B)max_pool:设置 pgpool-II  缓存的最大连接数。当有新的连接使用相同的用户名连接到相同的数据库将重用缓存的连接,如果不是则建立一个新的连接到 PostgreSQL。如果缓存的连接数超出设置值,则最老的连接将被抛弃,并使用这个槽位来保存新的连接。默认为 4。
C)child_life_time:设置 pgpool-II 子进程的生命周期,单位为秒, 如果子进程空闲时间达到设置值将被终止,一个新的子进程将被创建。可用于应对内存泄露和其他不可预料错误的一个措施。默认为 300 (5分钟),设置为0 将禁用本功能。
D)child_max_connections:设置当 pgpool-II 子进程处理客户端连接数量达到设置值后,它将被终止。默认值为 0,表示客户端连接不被终止。
E)connection_life_time:设置 pgpool-II 缓存的连接的过期时长,单位为秒,过期的缓存连接将被关闭。默认值为 0,表示缓存的连接将不被关闭。
F)client_idle_limit:设置当一个客户端在执行最后一条查询后如果空闲时间,单位为秒,当这个客户端的空间时间达到设置值后,与 pgpool-II 的连接将被断开,可用于避免 pgpool-II 子进程被懒客户端占用或者探测断开客户端的TCP/IP 连接。默认值为 0,表示客户端连接不被断开。

3、日志(LOGS)

A)log_destination:pgpool-II 支持多种记录服务器消息的方式,包括'stderr'和'syslog'。默认为'stderr'。
B)log_line_prefix:设置输出到每行日志开头的打印样式字符串。'%'字符开始的转义序列将被下表的内容替换。所有不支持的转义将被忽略。其他的字符串将直接拷贝到日志行中。默认值为 '%t: pid %p: ',即打印时间戳和进程号。
C)log_connections:设置是否记录连接请求的日志消息。默认为off。
D)log_hostname:设置是否记录连接客户端的主机名而不是 IP 地址。默认为off。
E)log_statement:设置是否记录生成 SQL 的日志消息。默认为off。
F)log_per_node_statement:设置是否记录数据库节点的日志消息。默认为off。
G)log_client_messages:设置是否记录客户端的日志消息。默认为off。
H)log_standby_delay:设置记录复制延迟的方式。如果设置为 'none',则不写入日志; 如果设置为 'always',则在每次执行复制延迟检查时记录延迟;如果设置为 'if_over_threshold' ,则只有当延迟到达 delay_threshold 时记录日志。 默认值为 'none'。
I)syslog_facility:设置当记录日志到 syslog (log_destination参数设置值)时,被使用的 syslog设备。 你可以使用 'LOCAL(0-7)'。默认为 'LOCAL0'。
J)syslog_ident:设置当记录日志到 syslog (log_destination参数设置值)时,用于标记 syslog 中 pgpool-II 消息的程序名。默认为'pgpool'。
K)log_error_verbosity:设置记录的日支消息的详细程度。有效的取值包括 'terse'、'default'和 'verbose',每个都会增加显示的消息内容。默认为'default'。
L)client_min_messages:设置发送到客户端的最小消息级别。可用的值为 'DEBUG5'、'DEBUG4'、'DEBUG3'、'DEBUG2'、'DEBUG1'、'LOG'、'NOTICE'、'WARNING' 以及 'ERROR'。每个级别包含它后面的级别。默认为 'NOTICE'。
M)log_min_messages:设置发送到日志的最小消息级别。可用的值为 'DEBUG5'、'DEBUG4'、'DEBUG3'、'DEBUG2'、'DEBUG1'、'LOG'、'NOTICE'、'WARNING' 以及 'ERROR'。每个级别包含它后面的级别。默认为 'NOTICE'。
B)log_line_prefix 转义字符

4、运行时文件位置(FILE LOCATIONS)

A)pid_file_name:设置 pgpool-II 进程 ID 的文件完整路径名,建议使用绝对路径,指定目录应有程序管理用户的写权限。    默认为'/var/run/pgpool-II-12/pgpool.pid'。
B)logdir:设置 pgpool-II 保存日志文件的目录。建议使用绝对路径,指定目录应有程序管理用户的写权限。    默认为'/var/log/pgpool-II-12'。

5、连接池(CONNECTION POOLING)

A)connection_cache:设置 pgpool-II 是否激活连接器,缓存 PostgreSQL 的连接。默认为on。
B)reset_query_list:设置 pgpool-II 在推出一个会话时发送到后台程序的SQL命令,多个命令可以通过“;”隔开。默认为以下的设置为'ABORT; DISCARD ALL'。

6、健康检查全局配置(HEALTH CHECK GLOBAL PARAMETERS)

A)health_check_period:设置 数据库节点健康检查的频率间隔,单位为秒。默认为 0 ,表示禁用健康检查。
B)health_check_timeout:设置 数据库节点健康检查在例如网线断开等情况下等待时长。超时值的单位为秒。默认值为 20 。0表示一直等待到超时。
C)health_check_user:设置数据库节点执行健康检查的用户。用户必须存在于 PostgreSQL 后台中。默认为 'nobody'。
D)health_check_password:设置数据库节点执行健康检查的用户的密码,与health_check_user配套使用。默认为 ''。
E)health_check_database:设置数据库节点健康检查的数据库名。默认为 '',即首先尝试使用“postgres”数据库,之后尝试“template1”数据库,直到成功。
F)health_check_max_retries:设置数据库节点执行失效故障切换前尝试的最大失效健康检查次数。这个参数对于网络不稳定的时,健康检查失败但主节点依旧正常的情况下非常有效。 默认为0,表示不重试。如果启用 health_check_max_retries, 建议禁用 fail_over_on_backend_error。
G)health_check_retry_delay:设置数据库节点失效健康检查重试的间隔时间(单位为秒)( health_check_max_retries > 0 时有效 )。默认为1, 如果为 0 ,表示立即重试(不延迟)。
H)connect_timeout :设置数据库节点使用健康检查连接超时毫秒值。默认为 10000 毫秒(10秒)。网络不稳地的用户可能需要增加这个值。0 表示不允许超时。注意本参数不仅仅用于健康检查,也用于普通连接池的连接。

健康检查也可以单独为每各个数据库节点进行配置,参数名后面的数字表示“目标序号”,从 0 开始。如下:
health_check_period0 = 0
health_check_timeout0 = 20
health_check_user0 = 'nobody'
health_check_password0 = ''
health_check_database0 = ''
health_check_max_retries0 = 0
health_check_retry_delay0 = 1
connect_timeout0 = 10000

7、故障切换和恢复(FAILOVER AND FAILBACK)

A)failover_command:设置当一个数据库节点断开连接时执行的命令。当进行故障切换时杀掉所有 pgpool-II 子进程,顺序终止所有会话,调用命令并等待它完成。然后启动新的子进程并再次开始从客户端接受连接。
B)failback_command:设置当一个数据库节点连接时执行的命令。
C)failover_on_backend_error :设置数据库节点是否在读取/写入数据库节点发生错误时启动故障切换,设置为off表示不切换,仅提示错误并断开会后。默认为on。
D)detach_false_primary :设置数据库节点是否分离失效的主要数据库节点,仅在PostgreSQL9.6及以上版本的流复制模式中有效。默认为off。
E)search_primary_node_timeout :设置数据库节点在故障切换的时查找一个主要数据库节点的最长时间,单位为秒。在发生故障切换的时候尝试搜索主节点,如果到达设置时间未搜索到则放弃搜索。本参数只适用于流复制模式。默认为 10,0 表示一直尝试。
F)auto_failback :设置数据库节点是否自动恢复已分离的数据库节点。本参数只适用于流复制模式。默认为off。
G)auto_failback_interval :设置数据库节点执行自动故障恢复的最小间隔,单位为秒。默认为60。
A)failover_command 和 B)failback_command 系统变量表

8、在线恢复(ONLINE RECOVERY)

A)recovery_user:设置数据库节点用于在线恢复的 用户的账号。默认为'nobody'。
B)recovery_password:设置数据库节点用于在线恢复的用户口令。默认为''。
C)recovery_1st_stage_command:设置数据库节点在线恢复第一阶段在主要(Master)节点上运行的命令。处于安全原因,本命令必须被放置在数据库实例目录中,例如:如果 recovery_1st_stage_command = 'sync-command',那么将执行 $PGDATA/sync-command。本命令在执行时接收连接和查询。在本阶段中,你可以查询和更新数据。默认为''。recovery_1st_stage_command 将接收 3 个参数:到主要(Master)数据库实例的路径、需要恢复的 PostgreSQL 主机名、需要恢复的数据库实例路径。
D)recovery_2nd_stage_command:设置数据库节点在线恢复第二阶段在主要(Master)节点上运行的命令。处于安全原因,本命令必须被放置在数据库实例目录中,例如:如果 recovery_2st_stage_command = 'sync-command',那么将执行 $PGDATA/sync-command。在执行时不接收连接和查询,因此如果一个客户端长时间持有一个连接,则恢复命令不会被执行,等待所有的客户端关闭它们的连接,只在没有任何客户端连接才执行。recovery_2nd_stage_command 将接收 3 个参数:到主要(Master)数据库实例的路径、需要恢复的 PostgreSQL 主机名、需要恢复的数据库实例路径。
E)recovery_timeout:设置数据库节点恢复超时的时间,单位为秒。如果到达设置值,则取消在线恢复并接受连接。0 表示不等待。
F)client_idle_limit_in_recovery:设置数据库节点在恢复的第二个阶段,从执行最后一个查询后空闲到设置值时长的客户端将被断开连接,时长单位为妙。 避免恢复被懒客户端扰乱或者TCP/IP 连接被意外断开(例如网线断开)。如果设置为 -1,则立即断开客户端连接。 默认为 0,表示不启用。

9、高可用性集群-看门狗(WATCHDOG)

1)启用(Enabling)

A)use_watchdog:设置是否激活看门狗。默认为 off 。

2)连接到上游服务器(Connection to up stream servers)

A)trusted_servers: 设置检测 pgpool-II 节点连接的可信服务器列表。每台pgpool-II节点服务器都应能响应ping协议。指定一个用逗号分隔的服务器列表例如 "host1,host2,host3",如果没有服务器可以 ping 通,则看门狗认为pgpool-II节点出故障了。默认为空,表示不检查。
B)ping_path:设置用于监控 pgpool-II 节点服务器的 ping 命令的路径。默认为'/bin' 。

3)看门狗通信(Watchdog communication Settings)

A)wd_hostname:设置看门狗的的主机名或者 IP 地址。默认为''。
B)wd_port:设置看门狗的通信端口。默认为9000。
C)wd_priority:设置在进行活动 pgpool-II 节点选举时,本地节点的优先权,在集群启动的时候或者旧的 pgpool-II 节点故障的时候,设置值较高的 pgpool-II 节点会被选为活动节点。默认为1。
D)wd_authkey:设置看门狗通信的认证密钥,所有的 pgpool-II 节点必须使用相同的密钥,从使用不同密钥的 pgpool-II 节点发送过来的包将被拒绝,本密钥也被用于生命检测被设置为心跳模式时的心跳信号。
E)wd_ipc_socket_dir:设置看门狗 IPC 连接的本地域套接字建立的目录。默认为'/tmp',建议设置这个值为'/var/run'或类似目录。

4)虚拟 IP 控制(Virtual IP control Setting)

A)delegate_IP:设置客户端的服务(例如应用服务等)连接到的活动 pgpool-II 节点的虚拟 IP (VIP) ,当一个 pgpool-II 从备节点切换为活动节点时,pgpool-II 活动节点接管这个 VIP。默认为''。
B)if_cmd_path:设置 pgpool-II 节点用于切换 IP 地址的命令的所在路径。默认为 '/sbin'。
C)if_up_cmd:设置 pgpool-II 节点启用虚拟 IP的命令。默认为 '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev eth0 label eth0:0'。$_IP_$ 应被 "delegate_IP" 设置值替换。
D)if_down_cmd:设置 pgpool-II 节点禁用虚拟 IP的命令。默认为 '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev eth0'。$_IP_$ 应被 "delegate_IP" 设置值替换。
E)arping_path:设置 pgpool-II 节点在虚拟 IP 切换后发送ARP请求命令的所在路径。默认为 '/usr/sbin'。
F)arping_cmd:设置 pgpool-II 节点在虚拟 IP 切换后发送ARP的请求命令。默认为 '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I eth0'。$_IP_$ 应被 "delegate_IP" 设置值替换。

5)升级/降级行为(Behaivor on escalation Setting)

A)clear_memqcache_on_escalation:设置是否在 pgpool-II 节点升级为活跃状态时清空所有的共享内存中的查询缓存,避免新激活的 pgpool-II 节点使用旧的 pgpool-II 节点而导致的不一致情况。默认为on。
B)wd_escalation_command:设置在 pgpool-II 节点升级为活动节点的时候执行本命令。如果配置了本命令,在启用虚拟/浮动 IP 前会立即执行这个命令。默认为''。
C)wd_de_escalation_command: 设置在 pgpool-II 节点放弃主节点时执行这个命令。如果配置了本命令,在停用虚拟/浮动 IP 前会立即执行这个命令。默认为''。

6)故障转移(Watchdog consensus settings for failover)

A)failover_when_quorum_exists:设置是否在看门狗仲裁时执行故障转移。默认为'on'。
B)failover_require_consensus:设置是否在 pgpool-II 节点状态变化时执行故障转移。默认为'on'。
C)allow_multiple_failover_requests_from_node:设置是否允许一个 pgpool-II 节点可以为建立故障转移共识投多票。默认为'off'。
D)enable_consensus_with_half_votes:设置是否在 pgpool-II 节点数为偶数的群集中,以50%的票数应用多数规则进行协商一致和仲裁计算。如果启用,则在收到群集中一半的总票数后,将解决存在仲裁和故障转移共识的问题,否则这两个决策都需要至少一个票数多于总票数的一半。默认为'off'。

7)健康检查-通用(Lifecheck Setting - common)

A)wd_monitoring_interfaces_list:设置一个用逗号分隔的网络设备名列表,让看门狗监控网络连接状态。如果列表中的所有接口都失效(禁用或者网线被拔掉),则看门狗认为网络完全出故障,pgpool-II 节点将执行一次自我停机。默认为'',表示将禁用网络接口监控,设置为 'any' 表示监控处 lookback 接口外的所有网络接口。
B)wd_lifecheck_method:设置健康检查的模式,可以是 'heartbeat' (默认)、'query' 或者 'external'。 在 'heartbeat' 模式中,看门狗定期发送心跳信号(UDP 包)到其他的 pgpool-II节点,也从其他 pgpool-II 节点获取信号, 如果在一段时间内没有收到信号,看门狗认为那个 pgpool-II 节点发生了故障。默认推荐为'heartbeat' 。
C)wd_interval:设置 pgpool-II 节点进行存活检查的间隔,单位为秒(大于或等于 1)。默认为 10.

8)健康检查-心跳模式配置(Lifecheck Setting - heartbeat mode)

A)wd_heartbeat_port:设置 pgpool-II 节点接收心跳信号的端口号,仅用于心跳模式。默认为 9694 。
B)wd_heartbeat_keepalive:设置 pgpool-II 节点发送心跳信号的间隔(秒),仅用于心跳模式。默认值为 2。
C)wd_heartbeat_deadtime:设置 pgpool-II 节点的时间周期(秒)内没有收到心跳信号,则看门狗认为 pgpool-II 节点发生故障,仅用于心跳模式。默认为30。
D)heartbeat_destination0:设置 pgpool-II 节点心跳信号发送的目标,可以是 IP 地址或主机名,仅用于心跳模式。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为'host0_ip1'
E)heartbeat_destination_port0:设置 pgpool-II 节点心跳信号发送的目标的端口号,端口号通常与"wd_heartbeat_port"设置值一致,仅用于心跳模式。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为 9694 。
F)heartbeat_device0:设置 pgpool-II 节点心跳信号发送/接受的目标的网络设备名(如:"eth0"),只有在运行在 Linux 下 root 权限中的 pgpool-II 才能生效。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为''。

9)健康检查-查询模式配置(Lifecheck Setting - query mode)

A)wd_life_point:设置在确认 pgpool-II节点失效时的重试次数(一个大于或等于 1 的数字),仅用于查询模式。默认为 3。
B)wd_lifecheck_query:设置检查 pgpool-II 节点的查询SQL脚本,仅用于查询模式。默认为 'SELECT 1'。
C)wd_lifecheck_dbname:设置检查 pgpool-II 节点时连接到的数据库名,仅用于查询模式。默认为 'template1'。
D)wd_lifecheck_user:设置检查 pgpool-II 节点的用户名,用户名必须存在于后端数据库节点的 PostgreSQL 中,仅用于查询模式。默认为 'nobody'。
E)wd_lifecheck_password:设置检查 pgpool-II 节点的用户名的口令,仅用于查询模式。默认为''。

10)服务监控(Other pgpool Connection Settings)

A)other_pgpool_hostname0:设置需要监控的  pgpool-II 节点主机,可以是 IP 地址或主机名。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为'host0'。
B)other_pgpool_port0:设置需要监控的  pgpool-II 节点端口。 对于查询模式,wd_lifecheck_query 指定的查询语句将被发送到这个端口。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为9999。
C)other_wd_port0:设置需要监控的看门狗的端口。允许指定多个目标,参数名后面的数字表示“目标序号”,从 0 开始。默认为9000。

10、基于内存的查询缓存(IN MEMORY QUERY MEMORY CACHE)

A)memory_cache_enabled:设置  pgpool-II 是否启用基于内存的查询缓存。默认为off。
B)memqcache_method:设置缓存方式,shmem 或者 memcached(不能同时使用)。 使用 shmem 的查询缓存很快且简单,不需要安装和配置 memcached 服务器,但缓存的最大数量限制于shmem。 使用 memcached 的查询缓存需要安装 memcached 服务器,但可以任意设置你需要的大小。 默认为 'shmem'。
C)memqcache_memcached_host:设置 memcached 的主机的主机名或 IP 地址。如果和 pgpool-II 在同一台机器,设置为 'localhost'。默认为'localhost'。
D)memqcache_memcached_port:设置 memcached 的服务端口。默认为11211。
E)memqcache_total_size:设置用于缓存的共享内存的大小,单位为字节。默认为67108864。
F)memqcache_max_num_cache:设置缓存的项目数,用于定义缓存管理空间的大小。需要参照 memqcache_total_size 参数,使用以下方法计算缓存管理空间的大小:memqcache_max_num_cache * 48 字节。 如果数量太小,则注册缓存的时候会报错。但如果太大则浪费空间。
G)memqcache_expire:设置查询缓存的生命周期。默认为 0,表示没有缓存超时,而且缓存被启用直到表被更新。
H)memqcache_auto_cache_invalidation:设置在表被更新的时候自动删除相关的缓存。默认为 on,如果为 off,则不删除缓存。
I)memqcache_maxcache:设置SELECT查询结果最大的缓存空间,需要设置得大一些。 如果使用"shmem"作为缓存策略,它必须小于 "memqcache_cache_block_size"参数的设置值;如果是 "memchached",它必须小于 slab 的大小(默认为 1 MB)。默认409600。
J)memqcache_cache_block_size:设置缓存块大小(字节),如果使用"shmem"作为缓存策略必须设置,设置值必须大于或等于 512。默认为1048576。
K)memqcache_oiddir: 设置缓存工作目录。在目录下有使用数据库OID命名的子目录, 每个子目录之下存放以OID命名的 SELECT 查询结果的文件。重启 pgpool-II 时默认不会清除缓存。默认为'/var/log/pgpool/oiddir'。
L)white_memqcache_table_list: 设置一个以逗号分隔的使 SELECT 查询结果被缓存的名字列表,名字列表可以是:表名、视图名或正则表达式。同时存在于 white_memqcache_table_list 和 black_memqcache_table_list 的表和视图将被缓存。默认为''。
M)black_memqcache_table_list:设置一个以逗号分隔的使 SELECT 查询结果被缓存的名字列表,名字列表可以是:表名、视图名或正则表达式。同时存在于 white_memqcache_table_list 和 black_memqcache_table_list 的表和视图将被缓存。默认为''。

11、其他(OTHERS)

A)relcache_expire:设置PostgreSQL 数据库关系缓存的生命周期。关系缓存用于缓存数PostgreSQL 据库的表结构信息或元数据查询结果。缓存位于  pgpool-II 节点本地内存中并一直保持,若使用 ALTER TABLE 修改了表结构或其他类似内容会关系缓存不再一致,因此通过设置relcache_expire 控制缓存的生命周期。默认为0,表示没有缓冲区过期。
B)relcache_size:设置PostgreSQL 数据库关系缓存的条目数。默认为 256。
C)check_temp_table:设置是否在 SELECT 语句中启用临时表检查。启动时会在 SELECT 执行前查询主节点上的系统对象, 因此增加主节点上的负载。如果系统不会使用临时表,将它设置为 off 可以降低对主节点的访问负载。默认为 on。
D)check_unlogged_table:设置是否在SELECT语句签入未标记的临时表。启动时会在 SELECT 执行前查询主节点上的系统对象, 因此增加主节点上的负载。如果系统不会使用临时表,将它设置为 off 可以降低对主节点的访问负载。默认为 on。
E)enable_shared_relcache:设置是启用否共享关系缓存。默认为on。
F)relcache_query_target:设置关系缓存查询目标节点。默认为'master'。

12、复制(REPLICATION MODE)

A)replication_mode:设置是否启用复制模式。默认为 off。
B)replicate_select:当设置为on,pgpool-II 在复制模式中将复制 SELECT 语句;当设置为off,pgpool-II 只发送它们到主要数据库节点。默认为 off。如果 SELECT 查询是在一个显式的事务块中,replicate_select 和 load_balance_mode 将影响复制的工作模式。
C)insert_lock:设置是否在使用INSERT语句自动锁定虚拟行或表,以保持串行数据的一致性,如果没有SERIAL类型的列,就不会锁定。默认为on。
D)lobj_lock_table:设置用于大对象锁定的表名。如果它被指定,pgpool-II  将锁定表并产生一个大对象 ID以及建立这个大对象。这个过程保证 复制模式中在所有数据库节点中获得相同的大对象ID。默认为''。
lobj_lock_table 指定的表必须被预先建立。如果你在 template1 中建立这个表,之后建立的任何数据库都将有这个表。建立示例:
CREATE TABLE public.lock_table ();
GRANT ALL ON public.lock_table TO PUBLIC;
E)replication_stop_on_mismatch:设置为on时,当有数据库节点和其他多数节点的执行结果存在差别时(例如:一个 SELECT 语句,在 replicate_select 设置为 true 的情况下,从不同的后台数据库节点中返回不同的行数),差异节点的执行结果将会忽略;设置为off时,发现有数据库节点执行结果存在差别时,终止会话。默认为off。
F)failover_if_affected_tuples_mismatch:设置为on时,在执行 INSERT/UPDATE/DELETE 脚本时,当有数据库节点和其他多数节点的返回的生效记录数存在差别时,差异节点的执行结果将会忽略;设置为off时,发现有数据库节点执行结果存在差别时,终止会话。默认为off。
replicate_select 和 load_balance_mode 将影响复制的工作模式

13、负载均衡(LOAD BALANCING MODE)

A)load_balance_mode:设置是否将SELECT 查询分发到每个数据库节点执行,用于负载均衡。默认为off。
B)ignore_leading_white_space:设置是否忽略每个SELECT查询的前导空格。默认为on。
C)white_function_list:设置一系列用逗号隔开的禁止更新数据库的函数名。在复制模式中,不在本列表中指定的函数将即不会被负载均衡,也不会被复制。在主备模式中,这些语句只被发送到主要数据库节点。默认为''。不能与"black_function_list"参数同时配置。允许使用正则表达式来匹配函数名,例如:通过前缀“get_”或“select_”来作为你只读函数的开头:
white_function_list = 'get_.*,select_.*'
D)black_function_list:设置一系列用逗号隔开的允许更新数据库的函数名。在复制模式中,在本列表中指定的函数将即不会被负载均衡,也不会被复制。在主备模式中,这些语句只被发送到主要数据库节点。默认为''。不能与"white_function_list"参数同时配置。允许使用正则表达式来匹配函数名,例如:通过前缀“set_”、“update_”、“delete_”或“insert_”来作为你只读函数的开头:
black_function_list = 'nextval,setval,set_.*,update_.*,delete_.*,insert_.*'
E)black_query_pattern_list:设置一系列用逗号隔开的查询脚本的正则表达式。在复制模式中,在本列表中指定的查询将即不会被负载均衡,也不会被复制。在主备模式中,这些 SELECT 语句只被发送到主节点。默认为''。
F)database_redirect_preference_list:设置一系列用逗号隔开的数据库和节点ID的映射关系表,仅用于流复制模式。默认为''。例如:
postgres:primary,mydb[0-4]:1,mydb[5-9]:2
G)app_name_redirect_preference_list:设置一系列用逗号隔开的应用程序和节点ID的映射关系表,仅用于流复制模式。默认为''。例如:
psql:primary,myapp[0-4]:1,myapp[5-9]:standby
H)allow_sql_comments:设置是否在负载平衡或查询缓存时忽略SQL注释。默认为off。
I)disable_load_balance_on_write:设置在显式事务中写查询负载均衡方式(不在显式事务中本参数不受影响)。默认为'transaction'。其中:
"transaction"表示如果发出写查询,则在事务结束之前,不会对后续的读查询进行负载平衡;
"trans_transaction"表示如果发出写查询,则在会话结束之前,显式事务中的后续读取查询将不会进行负载平衡;
"always":如果发出写查询,则在会话结束之前,不会对读查询进行负载平衡。
J)statement_level_load_balance:是否启用语句级负载平衡。默认为off。

14、主备(MASTER/SLAVE MODE)

A)master_slave_mode:设置是否启用主备模式。默认为off。
B)master_slave_sub_mode:设置主备模式的允许方式。默认为'stream'。其中:
"stream"表示基于PostgreSQL数据库内置的流复制启用了热备,备库是以只读方式打开的;
"slony"表示通过Slony-I插件进行数据复制。
C)sr_check_period:设置基于流复制的延迟检查的间隔,单位为秒。默认为 0,表示禁用这个检查。
D)sr_check_user:设置基于流复制检查的用户名。用户必须存在于所有的 PostgreSQL 数据库节点上。注意即使 sr_check_period 为0, sr_check_user 和 sr_check_password 也会被使用。要识别主服务器,pgpool-II 会发送函数调用请求每个 PostgreSQL 数据库节点。sr_check_user 和 sr_check_password 用于这个会话。默认为'nobody'。
E)sr_check_password:设置基于流复制检查的用户的口令。默认为''。
F)sr_check_database:设置基于流复制检查的数据库名称。默认为'postgres'。
G)delay_threshold:设置能够容忍的从属数据库节点上相对于主要数据库节点的 WAL 的复制延迟,单位为字节。如果延迟到达设置值,pgpool-II 不再发送 SELECT 查询到从属数据库节点。所有的东西都被发送到主要数据库节点,即使启用了负载均衡模式,直到从属数据库追赶上来。如果 delay_threshold 为 0 或者流复制检查被禁用,则延迟检查不被执行。这个检查在每"sr_check_period"周期执行一次。默认值为 0。
H)follow_master_command:设置在主备流复制模式中,主要数据库节点发生故障恢复后执行的命令。默认为''。
G)delay_threshold 变量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343