PostgreSQL12 是一款功能強大且開源(遵循BSD協(xié)議)的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。PostgreSQL12兼具NoSQL特性,支持兩種JSON數(shù)據(jù)類型:json和jsonb,并自帶流復(fù)制的實時備份和讀寫分離功能。
PGPool-II 是一款位于多個PostgreSQL數(shù)據(jù)庫服務(wù)器和客戶端之間,主要實現(xiàn)連接池、限制超過度連接、故障轉(zhuǎn)移、在線恢復(fù)、數(shù)據(jù)復(fù)制、負(fù)載均衡、集群監(jiān)聽(看門狗)等功能的集群中間件。主要解決在業(yè)務(wù)系統(tǒng)存在大量的讀并發(fā)時,通過負(fù)載均衡提高查詢請求吞吐量,并將多個數(shù)據(jù)庫節(jié)點集群化管理,在單點數(shù)據(jù)庫故障時自動轉(zhuǎn)移恢復(fù),實現(xiàn)數(shù)據(jù)庫高可用性。
本方案基于CentOS8系統(tǒng)設(shè)計,建議在RedHat/CentOS系統(tǒng)中使用。部署數(shù)據(jù)庫集群使用服務(wù)器及網(wǎng)絡(luò)資源較多,建議在實施前做好規(guī)劃工作,有利于部署工作順利、有序進(jìn)行。
目錄
1.前言
2.數(shù)據(jù)庫集群部署拓?fù)鋱D
3.PGPool-II的功能和模式
4.PostgreSQL數(shù)據(jù)庫的安裝和配置
5.主從庫集群安裝和配置
-- 5.1.在"數(shù)據(jù)庫集群"上部署 PostgreSQL12 主從庫
-- 5.2.在"數(shù)據(jù)庫集群"上配置 SSH 互信
-- 5.3.在"中間件集群"節(jié)點上安裝 PGPool-II-12 中間件
-- 5.4."數(shù)據(jù)庫集群"節(jié)點故障恢復(fù)方案
6.復(fù)制集群安裝和配置
-- 6.1.在"中間件集群"節(jié)點上安裝 PGPool-II-12 中間件
-- 6.2."數(shù)據(jù)庫集群"節(jié)點故障恢復(fù)方案
7.基于內(nèi)存的查詢緩存
8.集群管理和控制
9.后記:PGPool-II 中間件主配置文件詳解(PGPool-II v4.1.1版官方文檔中文翻譯)
1.前言
數(shù)據(jù)庫集群部署主要實現(xiàn)多個數(shù)據(jù)庫服務(wù)器之間的負(fù)載均衡,故障轉(zhuǎn)移,實時熱備和讀寫分離。
1、方案使用的PostgreSQL12、PGPool-II-12(v4.1.1)和PGAdmin4軟件的安裝包,建議從PostgreSQL官方網(wǎng)站【https://www.postgresql.org】中使用yum源獲取。建議將官方y(tǒng)um源進(jìn)行本地化或私有化后再使用。有關(guān)如何進(jìn)行yum源的本地化/私有化,請閱讀文章《RedHat/CentOS8 【國內(nèi)/本地/私有 YUM 源】制作和使用》,文章地址【http://m.itdecent.cn/p/68db74388600】。
2、核心組件簡介
1)PGPool-II:一款位于多個 PostgreSQL數(shù)據(jù)庫服務(wù)器和客戶端之間,主要實現(xiàn)連接池、限制超過度連接、故障轉(zhuǎn)移、在線恢復(fù)、數(shù)據(jù)復(fù)制、負(fù)載均衡、集群監(jiān)聽(看門狗)等功能的集群中間件。PGPool-II主要解決在業(yè)務(wù)系統(tǒng)存在大量的讀并發(fā)時,通過負(fù)載均衡提高查詢請求吞吐量,并將多個數(shù)據(jù)庫節(jié)點集群化管理,在單點數(shù)據(jù)庫故障時自動轉(zhuǎn)移恢復(fù),實現(xiàn)數(shù)據(jù)庫高可用性。官方網(wǎng)站:https://www.pgpool.net/。
2)PostgreSQL:一款功能強大且開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。PostgreSQL12兼具NoSQL特性,支持兩種JSON數(shù)據(jù)類型:json和jsonb,并自帶流復(fù)制的實時備份和讀寫分離功能。
3)PGAdmin4:一款PostgreSQL數(shù)據(jù)庫的官方客戶端(PostgreSQL數(shù)據(jù)庫專用圖形化管理工具)。采用B/S架構(gòu)設(shè)計,服務(wù)器端模式可以實現(xiàn)集中部署,用戶通過瀏覽器即可實現(xiàn)管理個人建立的數(shù)據(jù)庫,即安全又便于使用;功能強大且支持中文、英文等多種語言。
2.數(shù)據(jù)庫集群部署拓?fù)鋱D
數(shù)據(jù)庫集群部署最少需要兩個節(jié)點,建議至少部署三個節(jié)點,性能不足時可以擴(kuò)充多個"數(shù)據(jù)庫集群"節(jié)點。集群部署拓?fù)鋱D如下:

網(wǎng)絡(luò)資源規(guī)劃:
1、PostgreSQL 數(shù)據(jù)庫集群
| 節(jié)點名 | 主機名 | IP:PORT | 程序 | 操作系統(tǒng) |
|---|---|---|---|---|
| 主庫 | 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 中間件集群
| 節(jié)點名 | 主機名 | IP:PORT | 程序 | 操作系統(tǒng) |
|---|---|---|---|---|
| 活動節(jié)點 | DBC-1 | 192.168.216.128:9999 | PGPool-II-12 | CentOS8 |
| 備節(jié)點-1 | DBC-2 | 192.168.216.129:9999 | PGPool-II-12 | CentOS8 |
| 備節(jié)點≥2 | DBC-3 | 192.168.216.130:9999 | PGPool-II-12 | CentOS8 |
3、PGPool-II Virtual IP:192.168.216.200。
當(dāng)存在≥2個以上集群節(jié)點時,通過配置PGPool-II的Watchdog組件建立高可用集群,客戶端通過虛擬IP訪問集群中間件。但是需要注意,當(dāng)只有1個集群節(jié)點有效時,虛擬IP自動失效。
4、客戶端
同一網(wǎng)段計算機,部署PGAdmin4或應(yīng)用系統(tǒng)的調(diào)用程序模塊。
3.PGPool-II的功能模式
1、PGPool-II的功能。
1)連接池
保持已經(jīng)連接到數(shù)據(jù)庫的連接,并在使用相同參數(shù)(例如:用戶名,數(shù)據(jù)庫,協(xié)議版本)連接訪問數(shù)據(jù)庫時重用。實現(xiàn)減少連接開銷,增加系統(tǒng)的總體吞吐量。
2)限制過度連接
限制當(dāng)前的最大連接數(shù),當(dāng)?shù)竭_(dá)這個數(shù)量上限是,新的連接將被放入隊列保持等待。
3)故障轉(zhuǎn)移
在主備模式下,當(dāng)主要數(shù)據(jù)庫節(jié)點發(fā)生故障時,自動轉(zhuǎn)到從屬數(shù)據(jù)庫節(jié)點繼續(xù)運行。
4)在線恢復(fù)
在主備模式下,當(dāng)從屬從離線狀態(tài)轉(zhuǎn)為在線狀態(tài)時,將主要數(shù)據(jù)庫中的數(shù)據(jù)還原到從屬數(shù)據(jù)庫。
5)數(shù)據(jù)復(fù)制
在復(fù)制模式下,在2個或更多數(shù)據(jù)庫節(jié)點的物理磁盤上創(chuàng)建一個實時數(shù)據(jù)備份,這樣服務(wù)不會因其中一臺數(shù)據(jù)庫服務(wù)器的磁盤故障而中斷。
6)負(fù)載均衡
如果數(shù)據(jù)庫進(jìn)行了復(fù)制, 則在任何一臺服務(wù)器中執(zhí)行一個 SELECT 查詢將返回相同的結(jié)果。通過分發(fā)多個查詢請求到所有可用的服務(wù)器中,增強了系統(tǒng)的整體吞吐量,在理想的情況下,讀性能應(yīng)該和 PostgreSQL 服務(wù)器的數(shù)量成正比。
7)內(nèi)存查詢緩存
基于內(nèi)存的緩存保存 SELECT 語句(以及它綁定的參數(shù),如果 SELECT 是一個擴(kuò)展的查詢)以及對應(yīng)的數(shù)據(jù),如果是相同的 SELECT 語句,則直接返回緩存的值;通過監(jiān)視 UPDATE,INSERT,ALTER TABLE一類的查詢語句自動刪除緩存的數(shù)據(jù)。但無法發(fā)現(xiàn)通過觸發(fā)器、外鍵和 DROP TABLE CASCADE 產(chǎn)生的非顯式的更新。
8)集群高可用性(看門狗)
“看門狗”是一個 PGPool-II 的子進(jìn)程,用于實現(xiàn)集群高可用性功能。通過多個 PGPool-II 的合作解決單點故障的問題。
2、PGPool-II的主要集群模式
1)主從庫模式
主從庫模式下支持連接池、限制過度連接、故障轉(zhuǎn)移、在線恢復(fù)、負(fù)載均衡、內(nèi)存查詢緩存功能,由≥2個數(shù)據(jù)庫節(jié)點組成。主要特點:
A)多個數(shù)據(jù)庫節(jié)點并行工作。
B)主要數(shù)據(jù)庫節(jié)點失效后,由從屬數(shù)據(jù)庫節(jié)點接管。
C)數(shù)據(jù)寫入時,只寫入到主要數(shù)據(jù)庫節(jié)點,主要數(shù)據(jù)庫節(jié)點將通過內(nèi)置的流復(fù)制系統(tǒng),將數(shù)據(jù)復(fù)制到從屬數(shù)據(jù)庫節(jié)點;數(shù)據(jù)查詢時,多個查詢請求分發(fā)到各個數(shù)據(jù)庫節(jié)點,增強整體吞吐量。
2)復(fù)制模式
復(fù)制模式下支持連接池、限制過度連接、故障轉(zhuǎn)移、在線恢復(fù)、負(fù)載均衡、數(shù)據(jù)復(fù)制、內(nèi)存查詢緩存功能,由≥2個數(shù)據(jù)庫節(jié)點組成。主要特點:
A)多個數(shù)據(jù)庫節(jié)點并行工作。
B)主要數(shù)據(jù)庫節(jié)點失效后,由從屬數(shù)據(jù)庫節(jié)點接管。
C)數(shù)據(jù)寫入時,分發(fā)寫入請求到各個數(shù)據(jù)庫節(jié)點,同時寫入數(shù)據(jù);數(shù)據(jù)查詢時,多個查詢請求分發(fā)到各個數(shù)據(jù)庫節(jié)點,增強整體吞吐量。
3、PGPool-II的高可用性模式。
集群支持Watchdog(看門狗)功能,在≥2個集群節(jié)點時實現(xiàn)高可用性模式,通過虛擬IP地址訪問集群中間件。主要特點:
A)同時只有1個集群節(jié)點工作。
B)主要集群節(jié)點失效后,由備用集群節(jié)點接管。
4.PostgreSQL 數(shù)據(jù)庫的安裝和配置
在"數(shù)據(jù)庫集群"節(jié)點上安裝 PostgreSQL12 數(shù)據(jù)庫。有關(guān)如何安裝 PostgreSQL12 數(shù)據(jù)庫,請閱讀文章《RedHat/CentOS8【PostgreSQL12】安裝、配置和管理》,文章地址【http://m.itdecent.cn/p/bb1675988568】。
5.主從庫集群安裝和配置
5.1.在"數(shù)據(jù)庫集群"上部署 PostgreSQL12 主從庫
有關(guān)如何部署 PostgreSQL12 主從庫,請閱讀文章《數(shù)據(jù)庫架構(gòu)之【PostgreSQL12+Replication】RDBMS 主從庫讀寫分離方案》,文章地址【http://m.itdecent.cn/p/73e8357f31ad】。
5.2.在"數(shù)據(jù)庫集群"上創(chuàng)建集群管理用戶并配置 SSH 互信
1)生成本地節(jié)點秘鑰文件:
[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)創(chuàng)建本地及遠(yuǎn)程節(jié)點登錄信息加密文件。注意所有節(jié)點都需要創(chuàng)建本地及遠(yuǎn)程節(jié)點登錄信息加密文件:
-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
注意: "數(shù)據(jù)庫集群" 中的所有數(shù)據(jù)庫節(jié)點上全部需要按照以上步驟配置。
5.3.在"中間件集群"節(jié)點上安裝 PGPool-II-12 中間件
以"中間件集群活動節(jié)點"為例:
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"。
創(chuàng)建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 中間件的控制接口認(rèn)證文件。
PGPool-II 有一個控制接口,管理員可以通過它遠(yuǎn)程收集 PGPool-II 的狀態(tài)信息或者終止 PGPool-II 進(jìn)程。位于程序配置目錄"/etc/pgpool-II-12"下的"pcp.conf"文件是用于這個接口認(rèn)證的用戶/密碼配置文件,所有的模式都需要先設(shè)置"pcp.conf"文件。模板"pcp.conf.sample"文件在 PGPool-II 安裝時已經(jīng)被創(chuàng)建??截惒⒅孛@個文件為"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編碼存儲,在修改這個文件之前,需要把預(yù)設(shè)的密碼轉(zhuǎn)化為MD5編碼,使用"pg_md5"命令將明文轉(zhuǎn)化為MD5編碼的功能。假設(shè)密碼明文是"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 中間件的主從庫集群參數(shù)。
位于程序配置目錄"/etc/pgpool-II-12"下的"pgpool.conf"是PGPool-II的主配置文件。PGPool-II 安裝時就創(chuàng)建了主從庫集群的配置模板。拷貝并重命名主從庫集群的模板文件為"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)根據(jù)集群實際情況,編輯配置文件參數(shù)。
使用文本編輯器程序配置目錄下的"pgpool.conf"文件:
[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pgpool.conf
設(shè)置或確認(rèn)配置文件中關(guān)于主從庫集群下的必要參數(shù):
# 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數(shù)據(jù)庫集群節(jié)點則不需配置此項)
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 中間件的前端連接認(rèn)證文件。
[centos@DBC-1 ~]$ sudo pg_md5 -m -p -u postgres /etc/pgpool-II-12/pool_passwd
5、為程序運行用戶"postgres"增加"/sbin/ip"和"/usr/sbin/arping"兩個指令的管理員免密運行權(quán)限。
使用文本編輯器打開"/etc/sudoers"文件:
[centos@DBC-1 ~]$ sudo gedit /etc/sudoers
在文件尾部追加以下內(nèi)容并保存:
postgres ALL=NOPASSWD: /sbin/ip,NOPASSWD:/usr/sbin/arping
6、從配置模板文件中生成故障恢復(fù)腳本。拷貝并重命名"/etc/pgpool-II-12/failover.sh.sample"到"/etc/pgpool-II-12/failover_stream.sh",并增加可執(zhí)行權(quán)限:
[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
編輯內(nèi)容如下并保存:
#!/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 "當(dāng)前故障的主要數(shù)據(jù)庫節(jié)點:"$FAILED_NODE_HOST >> /tmp/pgsql_failover_stream.log
echo "計劃提升的主要數(shù)據(jù)庫節(jié)點:"$NEW_MASTER_NODE_HOST >> /tmp/pgsql_failover_stream.log
echo "主從一致的數(shù)據(jù)庫程序目錄:"$PGHOME >> /tmp/pgsql_failover_stream.log
echo "主從一致的數(shù)據(jù)庫數(shù)據(jù)實例目錄:"$PGDATA >> /tmp/pgsql_failover_stream.log
if [ -n $NEW_MASTER_NODE_HOST ]; then
echo "新的主要節(jié)點配置信息驗證通過..." >> /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 "已升級新的主要節(jié)點..." >> /tmp/pgsql_failover_stream.log
echo "本次故障切換完成.新的主要節(jié)點是:"$NEW_MASTER_NODE_HOST"時間:"$(date +"%Y-%m-%d %T") >> /tmp/pgsql_failover_stream.log
echo "請登錄到從屬節(jié)點服務(wù)器,將從屬節(jié)點關(guān)聯(lián)到新的主要節(jié)點。登錄后執(zhí)行以下操作步驟:" >> /tmp/pgsql_failover_stream.log
echo "1.停止數(shù)據(jù)庫服務(wù):$ 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.清空從屬節(jié)點的數(shù)據(jù)實例目錄:$ rm -rf "$PGDATA"/*" >> /tmp/pgsql_failover_stream.log
echo "4.關(guān)聯(lián)新的主要節(jié)點,如:$ 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.啟動數(shù)據(jù)庫服務(wù),如:[centos@host ~]$ sudo systemctl start postgresql-12.service" >> /tmp/pgsql_failover_stream.log
else
echo "本次故障切換失敗.原因:找不到新的主要數(shù)據(jù)庫節(jié)點.時間:"$(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 "停止已失效的從屬節(jié)點:"$HOST >> /tmp/pgsql_failover_stream.log
fi
done
exit 0
7、配置 PGPool-II 中間件的遠(yuǎn)程訪問策略。PGPool-II 安裝完成后默認(rèn)只允許本地訪問。
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)設(shè)置PGPool-II訪問策略,可以設(shè)置多個由主機類型、數(shù)據(jù)庫、用戶、IP地址組成的策略。
使用文本編輯器程序配置目錄下的"pool_hba.conf"文件:
[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pool_hba.conf
在文件的"# IPv4 local connections"策略中追加一條“允許全部用戶,通過全部網(wǎng)絡(luò)地址訪問全部數(shù)據(jù)庫”的策略并保存,策略定義如下:
# IPv4 local connections:
# 默認(rèn)只有一條"允許全部用戶,通過本地網(wǎng)絡(luò)地址訪問全部數(shù)據(jù)庫"的策略
host all all 127.0.0.1/32 trust
# 追加一條“允許全部用戶,通過全部網(wǎng)絡(luò)地址訪問全部數(shù)據(jù)庫”的策略
host all all 0.0.0.0/0 md5
3)設(shè)置防火墻端口(CentOS8 默認(rèn)安裝 firewall 防火墻),允許"9999","9898","9000","9694"端口(PGPool-II 各功能默認(rèn)端口)訪問服務(wù)器。
[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 服務(wù)管理配置,但不要設(shè)置為開機啟動。
1)修改服務(wù)管理配置信息。
使用文本編輯器打開配置文件:
[centos@DBC-1 ~]$ sudo gedit /usr/lib/systemd/system/pgpool-II-12.service
修改文件內(nèi)容如下:
[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)修改服務(wù)啟動參數(shù)信息。
使用文本編輯器打開配置文件:
[centos@DBC-1 ~]$ sudo gedit /etc/sysconfig/pgpool-II-12
修改文件內(nèi)容如下:
OPTS=" -n -D -C"
3)禁用開機啟動,PGPool-II服務(wù)不宜使用開機自動啟動的模式,建議人工操作。
[centos@DBC-1 ~]$ sudo systemctl disable pgpool-II-12.service
注意:其他"中間件集群"節(jié)點上全部需要按照以上步驟配置。
9、啟動 PGPool-II。
啟動 PGPool-II 服務(wù)之前,應(yīng)確保已正確啟動了各數(shù)據(jù)庫集群節(jié)點的 PostgreSQL 服務(wù)。
各節(jié)點的啟動或重啟的順序為:
① 依次關(guān)閉全部節(jié)點的 PGPool-II 服務(wù);
② 啟動活動節(jié)點上的 PGPool-II 服務(wù);
③ 依次備用節(jié)點上的 PGPool-II 服務(wù)。
假設(shè)DBC1為數(shù)據(jù)庫主要節(jié)點,DBC2和DBC3為備用節(jié)點。
[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、查看集群主從節(jié)點。
[centos@DBC-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -h 192.168.216.200 -p 9999 -c 'show pool_nodes'
5.4."數(shù)據(jù)庫集群"節(jié)點故障恢復(fù)方案
當(dāng)主要節(jié)點發(fā)生故障后,會提升一個從屬節(jié)點作為新的主要節(jié)點,并停止其他的從屬節(jié)點的數(shù)據(jù)庫服務(wù),整體來看就是將集群數(shù)據(jù)庫降級成為單點數(shù)據(jù)庫。故障恢復(fù)策略在"/etc/pgpool-II-12/failover_stream.sh"文件中定義,詳見"5.3.在"中間件集群"節(jié)點上安裝 PGPool-II-12 中間件"第 6 個步驟。
故障節(jié)點恢復(fù)的思路是:重新配置故障節(jié)點(原主要節(jié)點)以及已經(jīng)停止的從屬節(jié)點(原主要節(jié)點的從屬節(jié)點)的流復(fù)制,使它們作為新主要節(jié)點的從屬節(jié)點。
1、禁止新主要節(jié)點的對外請求響應(yīng)。
通過關(guān)閉防火墻策略、關(guān)閉集群或定義數(shù)據(jù)庫實例目錄中"pg_hba.conf"文件的策略,使新的主要節(jié)點受限訪問,固定數(shù)據(jù)庫快照。
2、 在"數(shù)據(jù)庫集群"上重新配置 PostgreSQL12 主從庫。
假設(shè)故障主庫節(jié)點是"DB-1",IP地址是"192.168.216.28";新的主庫節(jié)點是"DB-2",IP地址是"192.168.216.29",作步驟如下:
1)停止數(shù)據(jù)庫服務(wù)(默認(rèn)已經(jīng)停止)。
[centos@DB-1 ~]$ sudo systemctl stop postgresql-12.service
2)清空數(shù)據(jù)庫實例目錄中的數(shù)據(jù)(注意刪除隱藏文件)。
[centos@DB-1 ~]$ su postgres
-bash-4.4$ rm -rf /data/pgsql12-data/*
-bash-4.4$ exit
3)從主要數(shù)據(jù)庫執(zhí)行備份并還原到本地。
[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格式數(shù)據(jù),-Xs表示以stream方式包含所需的WAL文件,-P表示顯示進(jìn)度,-R表示為replication寫配置信息。備份完成,在數(shù)據(jù)庫實例目錄下自動生成standby.signal“信號”文件,并在"postgresql.auto.conf"文件寫入了主要數(shù)據(jù)庫的連接信息。
4)重新啟動數(shù)據(jù)庫。
[centos@DB-1 ~]$ sudo systemctl start postgresql-12.service
5)驗證當(dāng)前數(shù)據(jù)庫節(jié)點是否為從屬節(jié)點,查詢結(jié)果為"t"表示當(dāng)前數(shù)據(jù)庫節(jié)點為從屬節(jié)點。
[centos@DB-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -c "select pg_is_in_recovery()"

注意:其他"已停止的從屬數(shù)據(jù)庫"節(jié)點上全部需要按照以上步驟配置。
3、恢復(fù)新主要節(jié)點的對外請求響應(yīng)。
通過開啟防火墻策略、開啟集群或定期數(shù)據(jù)庫實例目錄中"pg_hba.conf"文件的策略,恢復(fù)新主要節(jié)點的對外請求響應(yīng)。
6.復(fù)制集群安裝和配置
6.1.在"中間件集群"節(jié)點上安裝 PGPool-II-12 中間件
以"中間件集群活動節(jié)點"為例:
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"。
創(chuàng)建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 中間件的控制接口認(rèn)證文件。
PGPool-II 有一個控制接口,管理員可以通過它遠(yuǎn)程收集 PGPool-II 的狀態(tài)信息或者終止 PGPool-II 進(jìn)程。位于程序配置目錄"/etc/pgpool-II-12"下的"pcp.conf"文件是用于這個接口認(rèn)證的用戶/密碼配置文件,所有的模式都需要先設(shè)置"pcp.conf"文件。模板"pcp.conf.sample"文件在 PGPool-II 安裝時已經(jīng)被創(chuàng)建。拷貝并重命名這個文件為"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編碼存儲,在修改這個文件之前,需要把預(yù)設(shè)的密碼轉(zhuǎn)化為MD5編碼,使用"pg_md5"命令將明文轉(zhuǎn)化為MD5編碼的功能。假設(shè)密碼明文是"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 中間件的復(fù)制集群參數(shù)。
位于程序配置目錄"/etc/pgpool-II-12"下的"pgpool.conf"是PGPool-II的主配置文件。PGPool-II 安裝時就創(chuàng)建了復(fù)制集群的配置模板。拷貝并重命名復(fù)制集群的模板文件為"pgpool.conf"。
1)拷貝并重命名復(fù)制集群配置文件。拷貝并重命名"/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)根據(jù)集群實際情況,編輯配置文件參數(shù)。
使用文本編輯器程序配置目錄下的"pgpool.conf"文件:
[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pgpool.conf
設(shè)置或確認(rèn)配置文件中關(guān)于復(fù)制模式下的必要參數(shù):
# 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數(shù)據(jù)庫集群節(jié)點則不需配置此項)
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 中間件的前端連接認(rèn)證文件。
[centos@DBC-1 ~]$ sudo pg_md5 -m -p -u postgres /etc/pgpool-II-12/pool_passwd
5、為程序運行用戶"postgres"增加"/sbin/ip"和"/usr/sbin/arping"兩個指令的管理員免密運行權(quán)限。
使用文本編輯器打開"/etc/sudoers"文件:
[centos@DBC-1 ~]$ sudo gedit /etc/sudoers
在文件尾部追加以下內(nèi)容并保存:
postgres ALL=NOPASSWD: /sbin/ip,NOPASSWD:/usr/sbin/arping
6、配置 PGPool-II 中間件的遠(yuǎn)程訪問策略。PGPool-II 安裝完成后默認(rèn)只允許本地訪問。
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)設(shè)置PGPool-II訪問策略,可以設(shè)置多個由主機類型、數(shù)據(jù)庫、用戶、IP地址組成的策略。
使用文本編輯器程序配置目錄下的"pool_hba.conf"文件:
[centos@DBC-1 ~]$ sudo gedit /etc/pgpool-II-12/pool_hba.conf
在文件的"# IPv4 local connections"策略中追加一條“允許全部用戶,通過全部網(wǎng)絡(luò)地址訪問全部數(shù)據(jù)庫”的策略并保存,策略定義如下:
# IPv4 local connections:
# 默認(rèn)只有一條"允許全部用戶,通過本地網(wǎng)絡(luò)地址訪問全部數(shù)據(jù)庫"的策略
host all all 127.0.0.1/32 trust
# 追加一條“允許全部用戶,通過全部網(wǎng)絡(luò)地址訪問全部數(shù)據(jù)庫”的策略
host all all 0.0.0.0/0 md5
3)設(shè)置防火墻端口(CentOS8 默認(rèn)安裝 firewall 防火墻),允許"9999","9898","9000","9694"端口(PGPool-II 各功能默認(rèn)端口)訪問服務(wù)器。
[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 服務(wù)管理配置,但不要設(shè)置為開機啟動。
1)修改服務(wù)管理配置信息。
使用文本編輯器打開配置文件:
[centos@DBC-1 ~]$ sudo gedit /usr/lib/systemd/system/pgpool-II-12.service
修改文件內(nèi)容如下:
[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)修改服務(wù)啟動參數(shù)信息。
使用文本編輯器打開配置文件:
[centos@DBC-1 ~]$ sudo gedit /etc/sysconfig/pgpool-II-12
修改文件內(nèi)容如下:
OPTS=" -n -D -C"
3)禁用開機啟動,PGPool-II服務(wù)不宜使用開機自動啟動的模式,建議人工操作。
[centos@DBC-1 ~]$ sudo systemctl disable pgpool-II-12.service
注意:其他"中間件集群"節(jié)點上全部需要按照以上步驟配置。
8、啟動 PGPool-II。
啟動 PGPool-II 服務(wù)之前,應(yīng)確保已正確啟動了各數(shù)據(jù)庫集群節(jié)點的 PostgreSQL 服務(wù)。
各節(jié)點的啟動或重啟的順序為:
① 依次關(guān)閉全部節(jié)點的 PGPool-II 服務(wù);
② 啟動活動節(jié)點上的 PGPool-II 服務(wù);
③ 依次備用節(jié)點上的 PGPool-II 服務(wù)。
假設(shè)DBC1為數(shù)據(jù)庫主要節(jié)點,DBC2和DBC3為備用節(jié)點。
[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、查看集群主從節(jié)點。
[centos@DBC-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -h 192.168.216.200 -p 9999 -c 'show pool_nodes'
6.2."數(shù)據(jù)庫集群"節(jié)點故障恢復(fù)方案
在復(fù)制模式中,數(shù)據(jù)庫的任一節(jié)點發(fā)生故障后會自動離線,離線之后的數(shù)據(jù)庫不論是否仍然可用,都會脫離集群成為單點數(shù)據(jù)庫,只有重新啟動集群后,才會恢復(fù)成在線數(shù)據(jù)庫。
故障節(jié)點恢復(fù)的思路是:將已離線的節(jié)點通過流復(fù)制的方式從在線節(jié)點中同步最新數(shù)據(jù)后,重啟集群服務(wù),將離線節(jié)點重新恢復(fù)在線。
1、禁止所有節(jié)點的對外請求響應(yīng)。
關(guān)閉集群,通過關(guān)閉防火墻策略或定義數(shù)據(jù)庫實例目錄中"pg_hba.conf"文件的策略,使所有節(jié)點受限訪問,固定數(shù)據(jù)庫快照。
2、開啟任一在線節(jié)點的 Replication 訪問策略,作為故障節(jié)點恢復(fù)的數(shù)據(jù)庫參照節(jié)點。
假設(shè)故障主庫節(jié)點是"DB-1",IP地址是"192.168.216.28";數(shù)據(jù)庫參照節(jié)點是"DB-2",IP地址是"192.168.216.29",作步驟如下:
1)設(shè)置數(shù)據(jù)庫流復(fù)制訪問策略。使用文本編輯器打開數(shù)據(jù)存儲目錄下的"pg_hba.conf"文件:
[centos@DB-2 ~]$ sudo gedit /data/pgsql12-data/pg_hba.conf
在文件的"# IPv4 local connections"策略中追加一條“允許postgres用戶,通過全部網(wǎng)絡(luò)地址使用 Replication 的策略并保存,策略定義如下:
# replication privilege.
# 追加一條“允許postgres用戶,通過全部網(wǎng)絡(luò)地址使用流復(fù)制”的策略
host replication postgres 0.0.0.0/0 trust
2)重新加載配置參數(shù)。
[centos@DB-2 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -c "select pg_reload_conf()"
3、故障(離線)節(jié)點通過 Replication 同步最新數(shù)據(jù)。
1)停止數(shù)據(jù)庫服務(wù)(默認(rèn)已經(jīng)停止)。
[centos@DB-1 ~]$ sudo systemctl stop postgresql-12.service
2)清空數(shù)據(jù)庫實例目錄中的數(shù)據(jù)(注意刪除隱藏文件)。
[centos@DB-1 ~]$ su postgres
-bash-4.4$ rm -rf /data/pgsql12-data/*
-bash-4.4$ exit
3)從主要數(shù)據(jù)庫執(zhí)行備份并還原到本地。
[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格式數(shù)據(jù),-Xs表示以stream方式包含所需的WAL文件,-P表示顯示進(jìn)度,-R表示為replication寫配置信息。備份完成,在數(shù)據(jù)庫實例目錄下自動生成standby.signal“信號”文件,并在"postgresql.auto.conf"文件寫入了主要數(shù)據(jù)庫的連接信息。
4)重新啟動數(shù)據(jù)庫。
[centos@DB-1 ~]$ sudo systemctl start postgresql-12.service
5)驗證當(dāng)前數(shù)據(jù)庫節(jié)點是否為從屬節(jié)點,查詢結(jié)果為"t"表示當(dāng)前數(shù)據(jù)庫節(jié)點為從屬節(jié)點。
[centos@DB-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -c "select pg_is_in_recovery()"

注意:其他"已停止的從屬數(shù)據(jù)庫"節(jié)點上全部需要按照以上步驟配置。
3、恢復(fù)新主要節(jié)點的對外請求響應(yīng)。
通過開啟防火墻策略、開啟集群或定期數(shù)據(jù)庫實例目錄中"pg_hba.conf"文件的策略,恢復(fù)新主要節(jié)點的對外請求響應(yīng)。
7.基于內(nèi)存的查詢緩存
在各集群節(jié)點的"pgpool.conf"文件中開啟內(nèi)存緩存庫功能。以"中間件集群"活動節(jié)點為例:
使用文本編輯器程序配置目錄下的"pgpool.conf"文件。
[centos@DB-1 ~]$ sudo gedit /etc/pgpool-II-12/pgpool.conf
設(shè)置或確認(rèn)配置文件中關(guān)于內(nèi)存緩存庫的必要參數(shù),使用默認(rèn)設(shè)置開啟內(nèi)置的內(nèi)存緩存庫。
# IN MEMORY QUERY MEMORY CACHE
memory_cache_enabled = on
memqcache_method = 'shmem'
memqcache_oiddir = '/var/log/pgpool-II-12/oiddir'
詳細(xì)配置參見"9.后記:PGPool-II中間件主配置文件詳解(PGPool-II v4.1.1版官方文檔中文翻譯)"章節(jié)。
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管道端口(默認(rèn)是9898),-U 表示 PCP管道用戶。
4、查看集群節(jié)點詳情
[centos@DBC-1 ~]$ /usr/pgpool-12/bin/pcp_watchdog_info -h 192.168.216.200 -p 9898 -U postgres -v
其中:-h 表示集群IP,-p 表示PCP管道端口(默認(rèn)是9898),-U 表示 PCP管道用戶,-v表示查看詳細(xì)內(nèi)容(不使用本參數(shù)時顯示摘要內(nèi)容)。
5、查看集群節(jié)點數(shù)量
[centos@DBC-1 ~]$ /usr/pgpool-12/bin/pcp_node_count -h 192.168.216.200 -p 9898 -U postgres
其中:-h 表示集群IP,-p 表示PCP管道端口(默認(rèn)是9898),-U 表示 PCP管道用戶。
6、查看指定的集群節(jié)點信息
[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管道端口(默認(rèn)是9898),-U 表示 PCP管道用戶,-n 表示節(jié)點序號(從0開始),-v表示查看詳細(xì)內(nèi)容(不使用本參數(shù)時顯示摘要內(nèi)容)。
7、增加一個集群節(jié)點
[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管道端口(默認(rèn)是9898),-U 表示 PCP管道用戶,-n 表示節(jié)點序號(從0開始),-v表示查看詳細(xì)內(nèi)容(不使用本參數(shù)時顯示摘要內(nèi)容)。
8、脫離一個集群節(jié)點
[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管道端口(默認(rèn)是9898),-U 表示 PCP管道用戶,-n 表示節(jié)點序號(從0開始),-v表示查看詳細(xì)內(nèi)容(不使用本參數(shù)時顯示摘要內(nèi)容)。
9、提升一個集群備用節(jié)點為活動節(jié)點
[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管道端口(默認(rèn)是9898),-U 表示 PCP管道用戶,-n 表示節(jié)點序號(從0開始),-v表示查看詳細(xì)內(nèi)容(不使用本參數(shù)時顯示摘要內(nèi)容)。
10、恢復(fù)一個離線節(jié)點為集群節(jié)點
[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管道端口(默認(rèn)是9898),-U 表示 PCP管道用戶,-n 表示節(jié)點序號(從0開始),-v表示查看詳細(xì)內(nèi)容(不使用本參數(shù)時顯示摘要內(nèi)容)。
11、連接集群數(shù)據(jù)庫
[centos@DBC-1 ~]$ sudo -u postgres /usr/pgsql-12/bin/psql -h 192.168.216.200 -p 9999
12、查看集群數(shù)據(jù)庫狀態(tài)
[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不同運行模式和參數(shù)。主配置文件的參數(shù)包括:
1、連接(CONNECTIONS)
1)前端連接(pgpool Connection Settings)
A)listen_addresses:設(shè)置 pgpool-II 監(jiān)聽的主機名或者IP地址。'*'將監(jiān)聽所有連接,''將不監(jiān)聽任何連接,默認(rèn)為'localhost'。
B)port:設(shè)置 pgpool-II 監(jiān)聽連接的端口號。默認(rèn)為 9999。
C)socket_dir:設(shè)置 pgpool-II 監(jiān)聽套接字連接的目錄。 默認(rèn)為'/tmp'。建議設(shè)置這個值為'/var/run'或類似目錄。
D)listen_backlog_multiplier:設(shè)置 pgpool-II 監(jiān)聽連接隊列的長度。默認(rèn)值為 2。
E)serialize_accept:設(shè)置 pgpool-II 是否針對客戶端的連接串行化的調(diào)用過程。默認(rèn)為 off,即不進(jìn)行串行化。
F)reserved_connections:設(shè)置 pgpool-II 保留連接數(shù),如果超過該值則不再接受連接。默認(rèn)值為0,即不限制連接數(shù)。
2)PCP連接(pgpool Communication Manager Connection Settings)
A)pcp_listen_addresses: 設(shè)置pcp 進(jìn)程TCP/IP接受連接的主機名或IP地址。 '*' 接收所有的連接,'' 禁用 TCP/IP 連接,默認(rèn)為 '*'。
B)pcp_port: 設(shè)置pcp進(jìn)程接受連接的端口號。默認(rèn)為 9898。
C)pcp_socket_dir:設(shè)置pcp進(jìn)程用于建立接受套接字連接的目錄。 默認(rèn)為 '/tmp'。建議設(shè)置這個值為 '/var/run' 或類似目錄。
3)后端數(shù)據(jù)庫節(jié)點連接(Backend Connection Settings)
B)backend_port0:設(shè)置PostgreSQL 數(shù)據(jù)庫的端口號。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為 5432。
C)backend_weight0:設(shè)置PostgreSQL數(shù)據(jù)庫的負(fù)載均衡權(quán)重。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。 默認(rèn)為1。
D)backend_data_directory0:設(shè)置PostgreSQL數(shù)據(jù)庫實例的目錄。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為'/var/lib/pgsql/12/data'。
E)backend_flag0:設(shè)置PostgreSQL數(shù)據(jù)庫的行為標(biāo)志。'ALLOW_TO_FAILOVER'表示允許故障切換或者從后臺程序斷開;'DISALLOW_TO_FAILOVER'表示不允許故障切換或者從后臺程序斷開。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為'ALLOW_TO_FAILOVER'。
F)backend_application_name0:設(shè)置PostgreSQL數(shù)據(jù)庫的應(yīng)用別名(僅用于管理時顯示)。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為'server0'。
4)認(rèn)證(Authentication)
A)enable_pool_hba:設(shè)置 pgpool-II 是否使用 'pgpool_hba.conf'配置文件來進(jìn)行客戶端認(rèn)證。默認(rèn)為off。
B)pool_passwd:設(shè)置用于 MD5 認(rèn)證的文件名。默認(rèn)為'pool_passwd','' 表示禁用。
C)authentication_timeout:設(shè)置認(rèn)證超時的時長。0 表示禁用超時,默認(rèn)為 60 。
D)allow_clear_text_frontend_auth:設(shè)置是否允許對客戶端使用明文密碼身份驗證。默認(rèn)為off。
5)SSL連接(SSL Connections)
A)ssl:設(shè)置 pgpool-II 是否啟用前后端程序的 SSL 支持。開啟后必須設(shè)置ssl_key和ssl_cert,默認(rèn)為off。
B)ssl_key :設(shè)置SSL連接私鑰文件路徑。默認(rèn)為'./server.key',注釋不啟用。
C)ssl_cert:設(shè)置SSL連接公鑰證書文件路徑。默認(rèn)為'./server.cert',注釋不啟用。
D)ssl_ca_cert:設(shè)置一個 PEM 格式的證書文件路徑,包含一個或多個 CA 根證書, 用于校驗后端的服務(wù)器證書。默認(rèn)為'',注釋不啟用。
E)ssl_ca_cert_dir:設(shè)置一個包含 PEM 格式的 CA 證書的目錄的路徑,用于校驗后端的服務(wù)器證書。默認(rèn)為'',注釋不啟用。
F)ssl_ciphers:設(shè)置允許的SSL秘鑰。默認(rèn)為'HIGH:MEDIUM:+3DES:!aNULL'。
G)ssl_prefer_server_ciphers:設(shè)置使用服務(wù)器的SSL密碼,而不是客戶端的。默認(rèn)為off。
H)ssl_ecdh_curve:設(shè)置用于ECDH密鑰交換的曲線算法名稱。默認(rèn)為'prime256v1'。
I)ssl_dh_params_file:設(shè)置包含Diffie-Hellman參數(shù)的文件路徑。默認(rèn)為''。
2、池(POOLS)
A)num_init_children:設(shè)置 pgpool-II 預(yù)生成的服務(wù)子進(jìn)程數(shù), 也是支持從客戶端發(fā)起的最大并發(fā)連接數(shù),超出數(shù)量的客戶端嘗試連接將被阻塞(而不是拒絕連接),直到已有連接被關(guān)閉釋放。默認(rèn)為 32。
B)max_pool:設(shè)置 pgpool-II 緩存的最大連接數(shù)。當(dāng)有新的連接使用相同的用戶名連接到相同的數(shù)據(jù)庫將重用緩存的連接,如果不是則建立一個新的連接到 PostgreSQL。如果緩存的連接數(shù)超出設(shè)置值,則最老的連接將被拋棄,并使用這個槽位來保存新的連接。默認(rèn)為 4。
C)child_life_time:設(shè)置 pgpool-II 子進(jìn)程的生命周期,單位為秒, 如果子進(jìn)程空閑時間達(dá)到設(shè)置值將被終止,一個新的子進(jìn)程將被創(chuàng)建??捎糜趹?yīng)對內(nèi)存泄露和其他不可預(yù)料錯誤的一個措施。默認(rèn)為 300 (5分鐘),設(shè)置為0 將禁用本功能。
D)child_max_connections:設(shè)置當(dāng) pgpool-II 子進(jìn)程處理客戶端連接數(shù)量達(dá)到設(shè)置值后,它將被終止。默認(rèn)值為 0,表示客戶端連接不被終止。
E)connection_life_time:設(shè)置 pgpool-II 緩存的連接的過期時長,單位為秒,過期的緩存連接將被關(guān)閉。默認(rèn)值為 0,表示緩存的連接將不被關(guān)閉。
F)client_idle_limit:設(shè)置當(dāng)一個客戶端在執(zhí)行最后一條查詢后如果空閑時間,單位為秒,當(dāng)這個客戶端的空間時間達(dá)到設(shè)置值后,與 pgpool-II 的連接將被斷開,可用于避免 pgpool-II 子進(jìn)程被懶客戶端占用或者探測斷開客戶端的TCP/IP 連接。默認(rèn)值為 0,表示客戶端連接不被斷開。
3、日志(LOGS)
A)log_destination:pgpool-II 支持多種記錄服務(wù)器消息的方式,包括'stderr'和'syslog'。默認(rèn)為'stderr'。
B)log_line_prefix:設(shè)置輸出到每行日志開頭的打印樣式字符串。'%'字符開始的轉(zhuǎn)義序列將被下表的內(nèi)容替換。所有不支持的轉(zhuǎn)義將被忽略。其他的字符串將直接拷貝到日志行中。默認(rèn)值為 '%t: pid %p: ',即打印時間戳和進(jìn)程號。
C)log_connections:設(shè)置是否記錄連接請求的日志消息。默認(rèn)為off。
D)log_hostname:設(shè)置是否記錄連接客戶端的主機名而不是 IP 地址。默認(rèn)為off。
E)log_statement:設(shè)置是否記錄生成 SQL 的日志消息。默認(rèn)為off。
F)log_per_node_statement:設(shè)置是否記錄數(shù)據(jù)庫節(jié)點的日志消息。默認(rèn)為off。
G)log_client_messages:設(shè)置是否記錄客戶端的日志消息。默認(rèn)為off。
H)log_standby_delay:設(shè)置記錄復(fù)制延遲的方式。如果設(shè)置為 'none',則不寫入日志; 如果設(shè)置為 'always',則在每次執(zhí)行復(fù)制延遲檢查時記錄延遲;如果設(shè)置為 'if_over_threshold' ,則只有當(dāng)延遲到達(dá) delay_threshold 時記錄日志。 默認(rèn)值為 'none'。
I)syslog_facility:設(shè)置當(dāng)記錄日志到 syslog (log_destination參數(shù)設(shè)置值)時,被使用的 syslog設(shè)備。 你可以使用 'LOCAL(0-7)'。默認(rèn)為 'LOCAL0'。
J)syslog_ident:設(shè)置當(dāng)記錄日志到 syslog (log_destination參數(shù)設(shè)置值)時,用于標(biāo)記 syslog 中 pgpool-II 消息的程序名。默認(rèn)為'pgpool'。
K)log_error_verbosity:設(shè)置記錄的日支消息的詳細(xì)程度。有效的取值包括 'terse'、'default'和 'verbose',每個都會增加顯示的消息內(nèi)容。默認(rèn)為'default'。
L)client_min_messages:設(shè)置發(fā)送到客戶端的最小消息級別??捎玫闹禐?'DEBUG5'、'DEBUG4'、'DEBUG3'、'DEBUG2'、'DEBUG1'、'LOG'、'NOTICE'、'WARNING' 以及 'ERROR'。每個級別包含它后面的級別。默認(rèn)為 'NOTICE'。
M)log_min_messages:設(shè)置發(fā)送到日志的最小消息級別??捎玫闹禐?'DEBUG5'、'DEBUG4'、'DEBUG3'、'DEBUG2'、'DEBUG1'、'LOG'、'NOTICE'、'WARNING' 以及 'ERROR'。每個級別包含它后面的級別。默認(rèn)為 'NOTICE'。

4、運行時文件位置(FILE LOCATIONS)
A)pid_file_name:設(shè)置 pgpool-II 進(jìn)程 ID 的文件完整路徑名,建議使用絕對路徑,指定目錄應(yīng)有程序管理用戶的寫權(quán)限。 默認(rèn)為'/var/run/pgpool-II-12/pgpool.pid'。
B)logdir:設(shè)置 pgpool-II 保存日志文件的目錄。建議使用絕對路徑,指定目錄應(yīng)有程序管理用戶的寫權(quán)限。 默認(rèn)為'/var/log/pgpool-II-12'。
5、連接池(CONNECTION POOLING)
A)connection_cache:設(shè)置 pgpool-II 是否激活連接器,緩存 PostgreSQL 的連接。默認(rèn)為on。
B)reset_query_list:設(shè)置 pgpool-II 在推出一個會話時發(fā)送到后臺程序的SQL命令,多個命令可以通過“;”隔開。默認(rèn)為以下的設(shè)置為'ABORT; DISCARD ALL'。
6、健康檢查全局配置(HEALTH CHECK GLOBAL PARAMETERS)
A)health_check_period:設(shè)置 數(shù)據(jù)庫節(jié)點健康檢查的頻率間隔,單位為秒。默認(rèn)為 0 ,表示禁用健康檢查。
B)health_check_timeout:設(shè)置 數(shù)據(jù)庫節(jié)點健康檢查在例如網(wǎng)線斷開等情況下等待時長。超時值的單位為秒。默認(rèn)值為 20 。0表示一直等待到超時。
C)health_check_user:設(shè)置數(shù)據(jù)庫節(jié)點執(zhí)行健康檢查的用戶。用戶必須存在于 PostgreSQL 后臺中。默認(rèn)為 'nobody'。
D)health_check_password:設(shè)置數(shù)據(jù)庫節(jié)點執(zhí)行健康檢查的用戶的密碼,與health_check_user配套使用。默認(rèn)為 ''。
E)health_check_database:設(shè)置數(shù)據(jù)庫節(jié)點健康檢查的數(shù)據(jù)庫名。默認(rèn)為 '',即首先嘗試使用“postgres”數(shù)據(jù)庫,之后嘗試“template1”數(shù)據(jù)庫,直到成功。
F)health_check_max_retries:設(shè)置數(shù)據(jù)庫節(jié)點執(zhí)行失效故障切換前嘗試的最大失效健康檢查次數(shù)。這個參數(shù)對于網(wǎng)絡(luò)不穩(wěn)定的時,健康檢查失敗但主節(jié)點依舊正常的情況下非常有效。 默認(rèn)為0,表示不重試。如果啟用 health_check_max_retries, 建議禁用 fail_over_on_backend_error。
G)health_check_retry_delay:設(shè)置數(shù)據(jù)庫節(jié)點失效健康檢查重試的間隔時間(單位為秒)( health_check_max_retries > 0 時有效 )。默認(rèn)為1, 如果為 0 ,表示立即重試(不延遲)。
H)connect_timeout :設(shè)置數(shù)據(jù)庫節(jié)點使用健康檢查連接超時毫秒值。默認(rèn)為 10000 毫秒(10秒)。網(wǎng)絡(luò)不穩(wěn)地的用戶可能需要增加這個值。0 表示不允許超時。注意本參數(shù)不僅僅用于健康檢查,也用于普通連接池的連接。
健康檢查也可以單獨為每各個數(shù)據(jù)庫節(jié)點進(jìn)行配置,參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 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、故障切換和恢復(fù)(FAILOVER AND FAILBACK)
A)failover_command:設(shè)置當(dāng)一個數(shù)據(jù)庫節(jié)點斷開連接時執(zhí)行的命令。當(dāng)進(jìn)行故障切換時殺掉所有 pgpool-II 子進(jìn)程,順序終止所有會話,調(diào)用命令并等待它完成。然后啟動新的子進(jìn)程并再次開始從客戶端接受連接。
B)failback_command:設(shè)置當(dāng)一個數(shù)據(jù)庫節(jié)點連接時執(zhí)行的命令。
C)failover_on_backend_error :設(shè)置數(shù)據(jù)庫節(jié)點是否在讀取/寫入數(shù)據(jù)庫節(jié)點發(fā)生錯誤時啟動故障切換,設(shè)置為off表示不切換,僅提示錯誤并斷開會后。默認(rèn)為on。
D)detach_false_primary :設(shè)置數(shù)據(jù)庫節(jié)點是否分離失效的主要數(shù)據(jù)庫節(jié)點,僅在PostgreSQL9.6及以上版本的流復(fù)制模式中有效。默認(rèn)為off。
E)search_primary_node_timeout :設(shè)置數(shù)據(jù)庫節(jié)點在故障切換的時查找一個主要數(shù)據(jù)庫節(jié)點的最長時間,單位為秒。在發(fā)生故障切換的時候嘗試搜索主節(jié)點,如果到達(dá)設(shè)置時間未搜索到則放棄搜索。本參數(shù)只適用于流復(fù)制模式。默認(rèn)為 10,0 表示一直嘗試。
F)auto_failback :設(shè)置數(shù)據(jù)庫節(jié)點是否自動恢復(fù)已分離的數(shù)據(jù)庫節(jié)點。本參數(shù)只適用于流復(fù)制模式。默認(rèn)為off。
G)auto_failback_interval :設(shè)置數(shù)據(jù)庫節(jié)點執(zhí)行自動故障恢復(fù)的最小間隔,單位為秒。默認(rèn)為60。

8、在線恢復(fù)(ONLINE RECOVERY)
A)recovery_user:設(shè)置數(shù)據(jù)庫節(jié)點用于在線恢復(fù)的 用戶的賬號。默認(rèn)為'nobody'。
B)recovery_password:設(shè)置數(shù)據(jù)庫節(jié)點用于在線恢復(fù)的用戶口令。默認(rèn)為''。
C)recovery_1st_stage_command:設(shè)置數(shù)據(jù)庫節(jié)點在線恢復(fù)第一階段在主要(Master)節(jié)點上運行的命令。處于安全原因,本命令必須被放置在數(shù)據(jù)庫實例目錄中,例如:如果 recovery_1st_stage_command = 'sync-command',那么將執(zhí)行 $PGDATA/sync-command。本命令在執(zhí)行時接收連接和查詢。在本階段中,你可以查詢和更新數(shù)據(jù)。默認(rèn)為''。recovery_1st_stage_command 將接收 3 個參數(shù):到主要(Master)數(shù)據(jù)庫實例的路徑、需要恢復(fù)的 PostgreSQL 主機名、需要恢復(fù)的數(shù)據(jù)庫實例路徑。
D)recovery_2nd_stage_command:設(shè)置數(shù)據(jù)庫節(jié)點在線恢復(fù)第二階段在主要(Master)節(jié)點上運行的命令。處于安全原因,本命令必須被放置在數(shù)據(jù)庫實例目錄中,例如:如果 recovery_2st_stage_command = 'sync-command',那么將執(zhí)行 $PGDATA/sync-command。在執(zhí)行時不接收連接和查詢,因此如果一個客戶端長時間持有一個連接,則恢復(fù)命令不會被執(zhí)行,等待所有的客戶端關(guān)閉它們的連接,只在沒有任何客戶端連接才執(zhí)行。recovery_2nd_stage_command 將接收 3 個參數(shù):到主要(Master)數(shù)據(jù)庫實例的路徑、需要恢復(fù)的 PostgreSQL 主機名、需要恢復(fù)的數(shù)據(jù)庫實例路徑。
E)recovery_timeout:設(shè)置數(shù)據(jù)庫節(jié)點恢復(fù)超時的時間,單位為秒。如果到達(dá)設(shè)置值,則取消在線恢復(fù)并接受連接。0 表示不等待。
F)client_idle_limit_in_recovery:設(shè)置數(shù)據(jù)庫節(jié)點在恢復(fù)的第二個階段,從執(zhí)行最后一個查詢后空閑到設(shè)置值時長的客戶端將被斷開連接,時長單位為妙。 避免恢復(fù)被懶客戶端擾亂或者TCP/IP 連接被意外斷開(例如網(wǎng)線斷開)。如果設(shè)置為 -1,則立即斷開客戶端連接。 默認(rèn)為 0,表示不啟用。
9、高可用性集群-看門狗(WATCHDOG)
1)啟用(Enabling)
A)use_watchdog:設(shè)置是否激活看門狗。默認(rèn)為 off 。
2)連接到上游服務(wù)器(Connection to up stream servers)
A)trusted_servers: 設(shè)置檢測 pgpool-II 節(jié)點連接的可信服務(wù)器列表。每臺pgpool-II節(jié)點服務(wù)器都應(yīng)能響應(yīng)ping協(xié)議。指定一個用逗號分隔的服務(wù)器列表例如 "host1,host2,host3",如果沒有服務(wù)器可以 ping 通,則看門狗認(rèn)為pgpool-II節(jié)點出故障了。默認(rèn)為空,表示不檢查。
B)ping_path:設(shè)置用于監(jiān)控 pgpool-II 節(jié)點服務(wù)器的 ping 命令的路徑。默認(rèn)為'/bin' 。
3)看門狗通信(Watchdog communication Settings)
A)wd_hostname:設(shè)置看門狗的的主機名或者 IP 地址。默認(rèn)為''。
B)wd_port:設(shè)置看門狗的通信端口。默認(rèn)為9000。
C)wd_priority:設(shè)置在進(jìn)行活動 pgpool-II 節(jié)點選舉時,本地節(jié)點的優(yōu)先權(quán),在集群啟動的時候或者舊的 pgpool-II 節(jié)點故障的時候,設(shè)置值較高的 pgpool-II 節(jié)點會被選為活動節(jié)點。默認(rèn)為1。
D)wd_authkey:設(shè)置看門狗通信的認(rèn)證密鑰,所有的 pgpool-II 節(jié)點必須使用相同的密鑰,從使用不同密鑰的 pgpool-II 節(jié)點發(fā)送過來的包將被拒絕,本密鑰也被用于生命檢測被設(shè)置為心跳模式時的心跳信號。
E)wd_ipc_socket_dir:設(shè)置看門狗 IPC 連接的本地域套接字建立的目錄。默認(rèn)為'/tmp',建議設(shè)置這個值為'/var/run'或類似目錄。
4)虛擬 IP 控制(Virtual IP control Setting)
A)delegate_IP:設(shè)置客戶端的服務(wù)(例如應(yīng)用服務(wù)等)連接到的活動 pgpool-II 節(jié)點的虛擬 IP (VIP) ,當(dāng)一個 pgpool-II 從備節(jié)點切換為活動節(jié)點時,pgpool-II 活動節(jié)點接管這個 VIP。默認(rèn)為''。
B)if_cmd_path:設(shè)置 pgpool-II 節(jié)點用于切換 IP 地址的命令的所在路徑。默認(rèn)為 '/sbin'。
C)if_up_cmd:設(shè)置 pgpool-II 節(jié)點啟用虛擬 IP的命令。默認(rèn)為 '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev eth0 label eth0:0'。$_IP_$ 應(yīng)被 "delegate_IP" 設(shè)置值替換。
D)if_down_cmd:設(shè)置 pgpool-II 節(jié)點禁用虛擬 IP的命令。默認(rèn)為 '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev eth0'。$_IP_$ 應(yīng)被 "delegate_IP" 設(shè)置值替換。
E)arping_path:設(shè)置 pgpool-II 節(jié)點在虛擬 IP 切換后發(fā)送ARP請求命令的所在路徑。默認(rèn)為 '/usr/sbin'。
F)arping_cmd:設(shè)置 pgpool-II 節(jié)點在虛擬 IP 切換后發(fā)送ARP的請求命令。默認(rèn)為 '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I eth0'。$_IP_$ 應(yīng)被 "delegate_IP" 設(shè)置值替換。
5)升級/降級行為(Behaivor on escalation Setting)
A)clear_memqcache_on_escalation:設(shè)置是否在 pgpool-II 節(jié)點升級為活躍狀態(tài)時清空所有的共享內(nèi)存中的查詢緩存,避免新激活的 pgpool-II 節(jié)點使用舊的 pgpool-II 節(jié)點而導(dǎo)致的不一致情況。默認(rèn)為on。
B)wd_escalation_command:設(shè)置在 pgpool-II 節(jié)點升級為活動節(jié)點的時候執(zhí)行本命令。如果配置了本命令,在啟用虛擬/浮動 IP 前會立即執(zhí)行這個命令。默認(rèn)為''。
C)wd_de_escalation_command: 設(shè)置在 pgpool-II 節(jié)點放棄主節(jié)點時執(zhí)行這個命令。如果配置了本命令,在停用虛擬/浮動 IP 前會立即執(zhí)行這個命令。默認(rèn)為''。
6)故障轉(zhuǎn)移(Watchdog consensus settings for failover)
A)failover_when_quorum_exists:設(shè)置是否在看門狗仲裁時執(zhí)行故障轉(zhuǎn)移。默認(rèn)為'on'。
B)failover_require_consensus:設(shè)置是否在 pgpool-II 節(jié)點狀態(tài)變化時執(zhí)行故障轉(zhuǎn)移。默認(rèn)為'on'。
C)allow_multiple_failover_requests_from_node:設(shè)置是否允許一個 pgpool-II 節(jié)點可以為建立故障轉(zhuǎn)移共識投多票。默認(rèn)為'off'。
D)enable_consensus_with_half_votes:設(shè)置是否在 pgpool-II 節(jié)點數(shù)為偶數(shù)的群集中,以50%的票數(shù)應(yīng)用多數(shù)規(guī)則進(jìn)行協(xié)商一致和仲裁計算。如果啟用,則在收到群集中一半的總票數(shù)后,將解決存在仲裁和故障轉(zhuǎn)移共識的問題,否則這兩個決策都需要至少一個票數(shù)多于總票數(shù)的一半。默認(rèn)為'off'。
7)健康檢查-通用(Lifecheck Setting - common)
A)wd_monitoring_interfaces_list:設(shè)置一個用逗號分隔的網(wǎng)絡(luò)設(shè)備名列表,讓看門狗監(jiān)控網(wǎng)絡(luò)連接狀態(tài)。如果列表中的所有接口都失效(禁用或者網(wǎng)線被拔掉),則看門狗認(rèn)為網(wǎng)絡(luò)完全出故障,pgpool-II 節(jié)點將執(zhí)行一次自我停機。默認(rèn)為'',表示將禁用網(wǎng)絡(luò)接口監(jiān)控,設(shè)置為 'any' 表示監(jiān)控處 lookback 接口外的所有網(wǎng)絡(luò)接口。
B)wd_lifecheck_method:設(shè)置健康檢查的模式,可以是 'heartbeat' (默認(rèn))、'query' 或者 'external'。 在 'heartbeat' 模式中,看門狗定期發(fā)送心跳信號(UDP 包)到其他的 pgpool-II節(jié)點,也從其他 pgpool-II 節(jié)點獲取信號, 如果在一段時間內(nèi)沒有收到信號,看門狗認(rèn)為那個 pgpool-II 節(jié)點發(fā)生了故障。默認(rèn)推薦為'heartbeat' 。
C)wd_interval:設(shè)置 pgpool-II 節(jié)點進(jìn)行存活檢查的間隔,單位為秒(大于或等于 1)。默認(rèn)為 10.
8)健康檢查-心跳模式配置(Lifecheck Setting - heartbeat mode)
A)wd_heartbeat_port:設(shè)置 pgpool-II 節(jié)點接收心跳信號的端口號,僅用于心跳模式。默認(rèn)為 9694 。
B)wd_heartbeat_keepalive:設(shè)置 pgpool-II 節(jié)點發(fā)送心跳信號的間隔(秒),僅用于心跳模式。默認(rèn)值為 2。
C)wd_heartbeat_deadtime:設(shè)置 pgpool-II 節(jié)點的時間周期(秒)內(nèi)沒有收到心跳信號,則看門狗認(rèn)為 pgpool-II 節(jié)點發(fā)生故障,僅用于心跳模式。默認(rèn)為30。
D)heartbeat_destination0:設(shè)置 pgpool-II 節(jié)點心跳信號發(fā)送的目標(biāo),可以是 IP 地址或主機名,僅用于心跳模式。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為'host0_ip1'
E)heartbeat_destination_port0:設(shè)置 pgpool-II 節(jié)點心跳信號發(fā)送的目標(biāo)的端口號,端口號通常與"wd_heartbeat_port"設(shè)置值一致,僅用于心跳模式。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為 9694 。
F)heartbeat_device0:設(shè)置 pgpool-II 節(jié)點心跳信號發(fā)送/接受的目標(biāo)的網(wǎng)絡(luò)設(shè)備名(如:"eth0"),只有在運行在 Linux 下 root 權(quán)限中的 pgpool-II 才能生效。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為''。
9)健康檢查-查詢模式配置(Lifecheck Setting - query mode)
A)wd_life_point:設(shè)置在確認(rèn) pgpool-II節(jié)點失效時的重試次數(shù)(一個大于或等于 1 的數(shù)字),僅用于查詢模式。默認(rèn)為 3。
B)wd_lifecheck_query:設(shè)置檢查 pgpool-II 節(jié)點的查詢SQL腳本,僅用于查詢模式。默認(rèn)為 'SELECT 1'。
C)wd_lifecheck_dbname:設(shè)置檢查 pgpool-II 節(jié)點時連接到的數(shù)據(jù)庫名,僅用于查詢模式。默認(rèn)為 'template1'。
D)wd_lifecheck_user:設(shè)置檢查 pgpool-II 節(jié)點的用戶名,用戶名必須存在于后端數(shù)據(jù)庫節(jié)點的 PostgreSQL 中,僅用于查詢模式。默認(rèn)為 'nobody'。
E)wd_lifecheck_password:設(shè)置檢查 pgpool-II 節(jié)點的用戶名的口令,僅用于查詢模式。默認(rèn)為''。
10)服務(wù)監(jiān)控(Other pgpool Connection Settings)
A)other_pgpool_hostname0:設(shè)置需要監(jiān)控的 pgpool-II 節(jié)點主機,可以是 IP 地址或主機名。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為'host0'。
B)other_pgpool_port0:設(shè)置需要監(jiān)控的 pgpool-II 節(jié)點端口。 對于查詢模式,wd_lifecheck_query 指定的查詢語句將被發(fā)送到這個端口。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為9999。
C)other_wd_port0:設(shè)置需要監(jiān)控的看門狗的端口。允許指定多個目標(biāo),參數(shù)名后面的數(shù)字表示“目標(biāo)序號”,從 0 開始。默認(rèn)為9000。
10、基于內(nèi)存的查詢緩存(IN MEMORY QUERY MEMORY CACHE)
A)memory_cache_enabled:設(shè)置 pgpool-II 是否啟用基于內(nèi)存的查詢緩存。默認(rèn)為off。
B)memqcache_method:設(shè)置緩存方式,shmem 或者 memcached(不能同時使用)。 使用 shmem 的查詢緩存很快且簡單,不需要安裝和配置 memcached 服務(wù)器,但緩存的最大數(shù)量限制于shmem。 使用 memcached 的查詢緩存需要安裝 memcached 服務(wù)器,但可以任意設(shè)置你需要的大小。 默認(rèn)為 'shmem'。
C)memqcache_memcached_host:設(shè)置 memcached 的主機的主機名或 IP 地址。如果和 pgpool-II 在同一臺機器,設(shè)置為 'localhost'。默認(rèn)為'localhost'。
D)memqcache_memcached_port:設(shè)置 memcached 的服務(wù)端口。默認(rèn)為11211。
E)memqcache_total_size:設(shè)置用于緩存的共享內(nèi)存的大小,單位為字節(jié)。默認(rèn)為67108864。
F)memqcache_max_num_cache:設(shè)置緩存的項目數(shù),用于定義緩存管理空間的大小。需要參照 memqcache_total_size 參數(shù),使用以下方法計算緩存管理空間的大?。簃emqcache_max_num_cache * 48 字節(jié)。 如果數(shù)量太小,則注冊緩存的時候會報錯。但如果太大則浪費空間。
G)memqcache_expire:設(shè)置查詢緩存的生命周期。默認(rèn)為 0,表示沒有緩存超時,而且緩存被啟用直到表被更新。
H)memqcache_auto_cache_invalidation:設(shè)置在表被更新的時候自動刪除相關(guān)的緩存。默認(rèn)為 on,如果為 off,則不刪除緩存。
I)memqcache_maxcache:設(shè)置SELECT查詢結(jié)果最大的緩存空間,需要設(shè)置得大一些。 如果使用"shmem"作為緩存策略,它必須小于 "memqcache_cache_block_size"參數(shù)的設(shè)置值;如果是 "memchached",它必須小于 slab 的大?。J(rèn)為 1 MB)。默認(rèn)409600。
J)memqcache_cache_block_size:設(shè)置緩存塊大?。ㄗ止?jié)),如果使用"shmem"作為緩存策略必須設(shè)置,設(shè)置值必須大于或等于 512。默認(rèn)為1048576。
K)memqcache_oiddir: 設(shè)置緩存工作目錄。在目錄下有使用數(shù)據(jù)庫OID命名的子目錄, 每個子目錄之下存放以O(shè)ID命名的 SELECT 查詢結(jié)果的文件。重啟 pgpool-II 時默認(rèn)不會清除緩存。默認(rèn)為'/var/log/pgpool/oiddir'。
L)white_memqcache_table_list: 設(shè)置一個以逗號分隔的使 SELECT 查詢結(jié)果被緩存的名字列表,名字列表可以是:表名、視圖名或正則表達(dá)式。同時存在于 white_memqcache_table_list 和 black_memqcache_table_list 的表和視圖將被緩存。默認(rèn)為''。
M)black_memqcache_table_list:設(shè)置一個以逗號分隔的使 SELECT 查詢結(jié)果被緩存的名字列表,名字列表可以是:表名、視圖名或正則表達(dá)式。同時存在于 white_memqcache_table_list 和 black_memqcache_table_list 的表和視圖將被緩存。默認(rèn)為''。
11、其他(OTHERS)
A)relcache_expire:設(shè)置PostgreSQL 數(shù)據(jù)庫關(guān)系緩存的生命周期。關(guān)系緩存用于緩存數(shù)PostgreSQL 據(jù)庫的表結(jié)構(gòu)信息或元數(shù)據(jù)查詢結(jié)果。緩存位于 pgpool-II 節(jié)點本地內(nèi)存中并一直保持,若使用 ALTER TABLE 修改了表結(jié)構(gòu)或其他類似內(nèi)容會關(guān)系緩存不再一致,因此通過設(shè)置relcache_expire 控制緩存的生命周期。默認(rèn)為0,表示沒有緩沖區(qū)過期。
B)relcache_size:設(shè)置PostgreSQL 數(shù)據(jù)庫關(guān)系緩存的條目數(shù)。默認(rèn)為 256。
C)check_temp_table:設(shè)置是否在 SELECT 語句中啟用臨時表檢查。啟動時會在 SELECT 執(zhí)行前查詢主節(jié)點上的系統(tǒng)對象, 因此增加主節(jié)點上的負(fù)載。如果系統(tǒng)不會使用臨時表,將它設(shè)置為 off 可以降低對主節(jié)點的訪問負(fù)載。默認(rèn)為 on。
D)check_unlogged_table:設(shè)置是否在SELECT語句簽入未標(biāo)記的臨時表。啟動時會在 SELECT 執(zhí)行前查詢主節(jié)點上的系統(tǒng)對象, 因此增加主節(jié)點上的負(fù)載。如果系統(tǒng)不會使用臨時表,將它設(shè)置為 off 可以降低對主節(jié)點的訪問負(fù)載。默認(rèn)為 on。
E)enable_shared_relcache:設(shè)置是啟用否共享關(guān)系緩存。默認(rèn)為on。
F)relcache_query_target:設(shè)置關(guān)系緩存查詢目標(biāo)節(jié)點。默認(rèn)為'master'。
12、復(fù)制(REPLICATION MODE)
A)replication_mode:設(shè)置是否啟用復(fù)制模式。默認(rèn)為 off。
B)replicate_select:當(dāng)設(shè)置為on,pgpool-II 在復(fù)制模式中將復(fù)制 SELECT 語句;當(dāng)設(shè)置為off,pgpool-II 只發(fā)送它們到主要數(shù)據(jù)庫節(jié)點。默認(rèn)為 off。如果 SELECT 查詢是在一個顯式的事務(wù)塊中,replicate_select 和 load_balance_mode 將影響復(fù)制的工作模式。
C)insert_lock:設(shè)置是否在使用INSERT語句自動鎖定虛擬行或表,以保持串行數(shù)據(jù)的一致性,如果沒有SERIAL類型的列,就不會鎖定。默認(rèn)為on。
D)lobj_lock_table:設(shè)置用于大對象鎖定的表名。如果它被指定,pgpool-II 將鎖定表并產(chǎn)生一個大對象 ID以及建立這個大對象。這個過程保證 復(fù)制模式中在所有數(shù)據(jù)庫節(jié)點中獲得相同的大對象ID。默認(rèn)為''。
lobj_lock_table 指定的表必須被預(yù)先建立。如果你在 template1 中建立這個表,之后建立的任何數(shù)據(jù)庫都將有這個表。建立示例:
CREATE TABLE public.lock_table ();
GRANT ALL ON public.lock_table TO PUBLIC;
E)replication_stop_on_mismatch:設(shè)置為on時,當(dāng)有數(shù)據(jù)庫節(jié)點和其他多數(shù)節(jié)點的執(zhí)行結(jié)果存在差別時(例如:一個 SELECT 語句,在 replicate_select 設(shè)置為 true 的情況下,從不同的后臺數(shù)據(jù)庫節(jié)點中返回不同的行數(shù)),差異節(jié)點的執(zhí)行結(jié)果將會忽略;設(shè)置為off時,發(fā)現(xiàn)有數(shù)據(jù)庫節(jié)點執(zhí)行結(jié)果存在差別時,終止會話。默認(rèn)為off。
F)failover_if_affected_tuples_mismatch:設(shè)置為on時,在執(zhí)行 INSERT/UPDATE/DELETE 腳本時,當(dāng)有數(shù)據(jù)庫節(jié)點和其他多數(shù)節(jié)點的返回的生效記錄數(shù)存在差別時,差異節(jié)點的執(zhí)行結(jié)果將會忽略;設(shè)置為off時,發(fā)現(xiàn)有數(shù)據(jù)庫節(jié)點執(zhí)行結(jié)果存在差別時,終止會話。默認(rèn)為off。

13、負(fù)載均衡(LOAD BALANCING MODE)
A)load_balance_mode:設(shè)置是否將SELECT 查詢分發(fā)到每個數(shù)據(jù)庫節(jié)點執(zhí)行,用于負(fù)載均衡。默認(rèn)為off。
B)ignore_leading_white_space:設(shè)置是否忽略每個SELECT查詢的前導(dǎo)空格。默認(rèn)為on。
C)white_function_list:設(shè)置一系列用逗號隔開的禁止更新數(shù)據(jù)庫的函數(shù)名。在復(fù)制模式中,不在本列表中指定的函數(shù)將即不會被負(fù)載均衡,也不會被復(fù)制。在主備模式中,這些語句只被發(fā)送到主要數(shù)據(jù)庫節(jié)點。默認(rèn)為''。不能與"black_function_list"參數(shù)同時配置。允許使用正則表達(dá)式來匹配函數(shù)名,例如:通過前綴“get_”或“select_”來作為你只讀函數(shù)的開頭:
white_function_list = 'get_.*,select_.*'
D)black_function_list:設(shè)置一系列用逗號隔開的允許更新數(shù)據(jù)庫的函數(shù)名。在復(fù)制模式中,在本列表中指定的函數(shù)將即不會被負(fù)載均衡,也不會被復(fù)制。在主備模式中,這些語句只被發(fā)送到主要數(shù)據(jù)庫節(jié)點。默認(rèn)為''。不能與"white_function_list"參數(shù)同時配置。允許使用正則表達(dá)式來匹配函數(shù)名,例如:通過前綴“set_”、“update_”、“delete_”或“insert_”來作為你只讀函數(shù)的開頭:
black_function_list = 'nextval,setval,set_.*,update_.*,delete_.*,insert_.*'
E)black_query_pattern_list:設(shè)置一系列用逗號隔開的查詢腳本的正則表達(dá)式。在復(fù)制模式中,在本列表中指定的查詢將即不會被負(fù)載均衡,也不會被復(fù)制。在主備模式中,這些 SELECT 語句只被發(fā)送到主節(jié)點。默認(rèn)為''。
F)database_redirect_preference_list:設(shè)置一系列用逗號隔開的數(shù)據(jù)庫和節(jié)點ID的映射關(guān)系表,僅用于流復(fù)制模式。默認(rèn)為''。例如:
postgres:primary,mydb[0-4]:1,mydb[5-9]:2
G)app_name_redirect_preference_list:設(shè)置一系列用逗號隔開的應(yīng)用程序和節(jié)點ID的映射關(guān)系表,僅用于流復(fù)制模式。默認(rèn)為''。例如:
psql:primary,myapp[0-4]:1,myapp[5-9]:standby
H)allow_sql_comments:設(shè)置是否在負(fù)載平衡或查詢緩存時忽略SQL注釋。默認(rèn)為off。
I)disable_load_balance_on_write:設(shè)置在顯式事務(wù)中寫查詢負(fù)載均衡方式(不在顯式事務(wù)中本參數(shù)不受影響)。默認(rèn)為'transaction'。其中:
"transaction"表示如果發(fā)出寫查詢,則在事務(wù)結(jié)束之前,不會對后續(xù)的讀查詢進(jìn)行負(fù)載平衡;
"trans_transaction"表示如果發(fā)出寫查詢,則在會話結(jié)束之前,顯式事務(wù)中的后續(xù)讀取查詢將不會進(jìn)行負(fù)載平衡;
"always":如果發(fā)出寫查詢,則在會話結(jié)束之前,不會對讀查詢進(jìn)行負(fù)載平衡。
J)statement_level_load_balance:是否啟用語句級負(fù)載平衡。默認(rèn)為off。
14、主備(MASTER/SLAVE MODE)
A)master_slave_mode:設(shè)置是否啟用主備模式。默認(rèn)為off。
B)master_slave_sub_mode:設(shè)置主備模式的允許方式。默認(rèn)為'stream'。其中:
"stream"表示基于PostgreSQL數(shù)據(jù)庫內(nèi)置的流復(fù)制啟用了熱備,備庫是以只讀方式打開的;
"slony"表示通過Slony-I插件進(jìn)行數(shù)據(jù)復(fù)制。
C)sr_check_period:設(shè)置基于流復(fù)制的延遲檢查的間隔,單位為秒。默認(rèn)為 0,表示禁用這個檢查。
D)sr_check_user:設(shè)置基于流復(fù)制檢查的用戶名。用戶必須存在于所有的 PostgreSQL 數(shù)據(jù)庫節(jié)點上。注意即使 sr_check_period 為0, sr_check_user 和 sr_check_password 也會被使用。要識別主服務(wù)器,pgpool-II 會發(fā)送函數(shù)調(diào)用請求每個 PostgreSQL 數(shù)據(jù)庫節(jié)點。sr_check_user 和 sr_check_password 用于這個會話。默認(rèn)為'nobody'。
E)sr_check_password:設(shè)置基于流復(fù)制檢查的用戶的口令。默認(rèn)為''。
F)sr_check_database:設(shè)置基于流復(fù)制檢查的數(shù)據(jù)庫名稱。默認(rèn)為'postgres'。
G)delay_threshold:設(shè)置能夠容忍的從屬數(shù)據(jù)庫節(jié)點上相對于主要數(shù)據(jù)庫節(jié)點的 WAL 的復(fù)制延遲,單位為字節(jié)。如果延遲到達(dá)設(shè)置值,pgpool-II 不再發(fā)送 SELECT 查詢到從屬數(shù)據(jù)庫節(jié)點。所有的東西都被發(fā)送到主要數(shù)據(jù)庫節(jié)點,即使啟用了負(fù)載均衡模式,直到從屬數(shù)據(jù)庫追趕上來。如果 delay_threshold 為 0 或者流復(fù)制檢查被禁用,則延遲檢查不被執(zhí)行。這個檢查在每"sr_check_period"周期執(zhí)行一次。默認(rèn)值為 0。
H)follow_master_command:設(shè)置在主備流復(fù)制模式中,主要數(shù)據(jù)庫節(jié)點發(fā)生故障恢復(fù)后執(zhí)行的命令。默認(rèn)為''。
