欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pgpool-II搭建集群,實現(xiàn)高可用與讀寫分離

 更新時間:2025年04月19日 08:48:55   作者:茁壯成長的露露  
pgpool-II是開源的PostgreSQL數(shù)據(jù)庫連接池、負(fù)載均衡和高可用解決方案,支持多種工作模式,包括原始模式、內(nèi)置復(fù)制模式和主/備模式,本文介紹pgpool-II的架構(gòu)、進(jìn)程、工作模式以及配置步驟,包括環(huán)境規(guī)劃、系統(tǒng)準(zhǔn)備、軟件安裝、數(shù)據(jù)庫主節(jié)點配置、pgpool配置和集群啟動

pgpool-II簡介

https://www.pgpool.net/docs/45/en/html/ 官方文檔地址

pgpool-II架構(gòu)圖

pgpool-II實現(xiàn)對業(yè)務(wù)透明的高可用與讀寫分離_pgpool-II

pgpool-II進(jìn)程簡介

  1. pcp進(jìn)程:pcp是一個命令行的管理工具,用戶可以使用此管理工具向pgpool-II發(fā)送管 理命令。 
  2. pgpool-II父進(jìn)程:pgpool-II父進(jìn)程負(fù)責(zé)檢查各個底層數(shù)據(jù)庫的健康狀態(tài)。 
  3. pgpool-II子進(jìn)程:負(fù)責(zé)接收用戶發(fā)過來的SQL請求,然后再根據(jù)規(guī)則將SQL請求發(fā)送 到底層的數(shù)據(jù)庫上。 
  4. worker進(jìn)程:pgpool-II 3.X版本之后才增加的進(jìn)程,負(fù)責(zé)檢查底層數(shù)據(jù)庫之間的復(fù)制 延遲。 
  5. watchdog進(jìn)程:可以把多個pgpool-II組成一個高可用集群,解決pgpool-II自身的高可用問題,提供了vip的管理功能。 

看門狗進(jìn)程詳細(xì)介紹

pgpool-II在3.2版本之后把健康檢查的功能從pgpool-II父進(jìn)程中剝離出來,放到了一個 叫“看門狗”(watchdog)的模塊中,該模塊添加的功能如下。

  1. pgpool服務(wù)是否正常工作的檢測:看門狗模塊監(jiān)控pgpool服務(wù)的響應(yīng)是否正常,而不 是簡單監(jiān)控進(jìn)程是否存活。它通過向被它監(jiān)控的pgpool發(fā)送查詢,并檢查響應(yīng)情況來判斷 pgpool是否正常工作??撮T狗進(jìn)程還監(jiān)控從pgpool到前端服務(wù)器的連接(如應(yīng)用服務(wù)器) 。從pgpool到前端服務(wù)器的連接作為pgpool的服務(wù)來監(jiān)控。 
  2. 看門狗進(jìn)程相互監(jiān)控:看門狗進(jìn)程交換被監(jiān)控服務(wù)器的信息用來保證信息是最新的 ,并允許看門狗進(jìn)程相互監(jiān)控。 ·在某些故障檢測中交換各自pgpool的主/備狀態(tài):當(dāng)一個pgpool的故障被檢測到,看門狗進(jìn)程會把故障信息通知到其他的看門狗進(jìn)程,同時看門狗進(jìn)程會通過投票來確定哪一 個pgpool是主pgpool,哪一個是備pgpool。 
  3. 在pgpool進(jìn)行主備切換的時候自動進(jìn)行虛擬IP地址的漂移:當(dāng)一個備用pgpool服務(wù)器 提升為主pgpool時,相應(yīng)的虛擬IP也會漂移過來。這樣應(yīng)用程序不需要修改配置就可以連 接到新的主pgpool上。 
  4. 當(dāng)原先發(fā)生故障的pgpool服務(wù)器恢復(fù)時,會自動注冊為為備用pgpool服務(wù)器:當(dāng)發(fā)生 故障的服務(wù)器恢復(fù)后,或原服務(wù)器徹底損壞通過增加新的服務(wù)器來替換原先的服務(wù)器時, 新的服務(wù)器連接上來后,新服務(wù)器上的看門狗進(jìn)程通知其他的看門狗進(jìn)程,新的備pgpool 服務(wù)器加進(jìn)來了,讓整個環(huán)境恢復(fù)成高可用狀態(tài)。

pgpool-II的工作模式

pgpool-II有連接池、復(fù)制、負(fù)載均衡等功能,使用這些功能需要把pgpool-II配置在不同的工作模式下,pgpool-II有以下幾種工作模式。

  1. 原始模式:只實現(xiàn)一個故障切換的功能,可以配置多個后端數(shù)據(jù)庫,當(dāng)?shù)谝粋€后端 數(shù)據(jù)庫不能工作時,pgpool-II會切換到第二個后端數(shù)據(jù)庫,如果第二個后端數(shù)據(jù)庫也不能 工作,再切換到第三個后端數(shù)據(jù)庫,依次類推。 
  2. 內(nèi)置復(fù)制(Native Replication)的模式:實際上就是把修改數(shù)據(jù)庫的操作同時發(fā)送到 后端所有的數(shù)據(jù)庫上進(jìn)行處理,只讀查詢發(fā)送給任意一臺數(shù)據(jù)庫。此模式下可以實現(xiàn)負(fù)載 均衡的功能。 
  3. 主/備模式:此模式下,使用其他軟件(非pgpool自身)完成實際的數(shù)據(jù)復(fù)制,如使 用Slony-I或流復(fù)制,中間件層使用pgpool-II。此時,pgpool-II主要提供高可用和連接池的 功能。在主/備模式中,DDL和DML操作在主節(jié)點上執(zhí)行,SELECT語句可以在主備節(jié)點 上執(zhí)行,當(dāng)然也可以強(qiáng)制SELECT語句在主節(jié)點上執(zhí)行,但需要在SELECT語句前添加“/* NO LOAD BALANCE*/”注釋。

pgpool-II 3.0版本之后支持配合使用流復(fù)制+Standby的主/備模式,這基本是現(xiàn)在的主流模式。所以此文我們是基于這種模式部署的。操作步驟很多,請注意哪些是在所有節(jié)點執(zhí)行,哪些是只在主節(jié)點執(zhí)行

1.環(huán)境規(guī)劃

1.1 節(jié)點信息

主機(jī)

hostname

節(jié)點配置

角色

組件

vip

10.0.0.41

postgres-01

Centos7.9 4c/8GB

Leader

PostgreSQL 15.5、pgpool-II-4.5.6

10.0.0.44

10.0.0.42

postgres-02

Centos7.9 4c/8GB

standby1

PostgreSQL 15.5、pgpool-II-4.5.6

10.0.0.43

postgres-03

Centos7.9 4c/8GB

standby2

PostgreSQL 15.5、pgpool-II-4.5.6

 

1.2PostgreSQL版本和配置

Item

Value

Detail

PostgreSQL Version

15.5

-

port

5432

-

$PGDATA

/data/pgsql/data

-

Archive mode

on

/data/pgsql/archive

Replication Slots

Enabled

Async/Sync Replication

Async

-

 

1.3 Pgpool-II版本與配置

Item

Value

Detail

Pgpool-II Version

4.4.5

-

port

9999

Pgpool-II接收連接

9898

PCP 進(jìn)程接收連接

9000

看門狗接收連接

9694

UDP port接收看門狗心跳信號

Config file

/usr/local/pgpool/etc/pgpool.conf

-

User running Pgpool-II

postgres (Pgpool-II 4.1 or later)

Pgpool-II 4.0 or before, the default user running Pgpool-II is root

Running mode

streaming replication mode

-

Watchdog

on

Life check method: heartbeat

 

1.4 相關(guān)腳本

模塊

腳本名

說明

Failover

failover.sh

用于啟動failover

follow_primary.sh

failover之后從節(jié)點與新主節(jié)點的同步

Online recovery

recovery_1st_stage

用于恢復(fù)從節(jié)點的數(shù)據(jù)

pgpool_remote_start

用于啟動從節(jié)點

Watchdog

escalation.sh

用于安全的切換主從

 

2.系統(tǒng)準(zhǔn)備

注意:以下操作在所有節(jié)點進(jìn)行

2.1 安裝依賴

yum install -y yum-utils openjade docbook-dtds docbook-style-dsssl docbook-style-xsl
yum install -y cmake make gcc zlib gcc-c++ perl readline readline-devel zlib 
yum install -y yum-builddep flex libselinux-devel libxml2-devel libxslt-devel openssl-devel pam-devel readline-devel libcurl-devel json-c-devel

2.2 配置域名解析

#所有節(jié)點
cat >> /etc/hosts << EOF
10.0.0.41 postgres-01
10.0.0.42 postgres-02
10.0.0.43 postgres-03
EOF

2.3 創(chuàng)建用戶與目錄

#所有節(jié)點
groupadd -g 701 postgres
useradd -g 701 -u 701 -s /bin/bash -m postgres
passwd postgres

mkdir /data/pgsql/{data,log,archive} -p
mkdir /data/pgpool/log -p
chown -R postgres.postgres /data

# Pgpool-II運行的進(jìn)程通常是在后臺運行,沒有關(guān)聯(lián)的終端,所以如果不做處理,在執(zhí)行 if_up_cmd、if_down_cmd 和 arping_cmd 這些帶有 sudo 的命令時就會失敗
visudo
Defaults:postgres !requiretty
postgres ALL=(ALL) NOPASSWD: /sbin/ip,/usr/sbin/arping

2.4 配置互信

#所有節(jié)點都要與其它節(jié)點互信,需要特殊配置私鑰文件得名稱為id_rsa_pgpool,因為pgpool的很多配置文件里面的變量都已經(jīng)寫好了這個名字

(1)生成公鑰
su - postgres
mkdir /home/postgres/.ssh
cd /home/postgres/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
s

(2)將公鑰分發(fā)到所有節(jié)點
for i in {1..3};do ssh-copy-id -i id_rsa_pgpool.pub postgres@postgres-0$i;done
(3)修改權(quán)限
chmod 600 ~/.ssh/* 
chmod 644 ~/.ssh/*.pub 
chmod 700 ~/.ssh

(4)互信驗證
for i in {1..3};do ssh postgres@postgres-0$i -i id_rsa_pgpool hostname;done
for i in {1..3};do ssh postgres@postgres-0$i -i id_rsa_pgpool.pub hostname;done

pgpool-II實現(xiàn)對業(yè)務(wù)透明的高可用與讀寫分離_pgpool-II_02

2.5 系統(tǒng)優(yōu)化

> /etc/sysctl.conf 
cat >> /etc/sysctl.conf << EOF
vm.swappiness = 0
vm.overcommit_memory=2
vm.overcommit_ratio=90 
vm.dirty_background_ratio = 10   
vm.dirty_ratio = 20
#測試環(huán)境物理內(nèi)存8G,數(shù)據(jù)節(jié)點shared_buffer=2G,最大連接數(shù)500為例,進(jìn)行如下設(shè)置
#        SEMMSL SEMMNS SEMOPM SEMMNI
kernel.sem=300  60000  100    200
vm.nr_hugepages=1500                 
EOF
sysctl -p

echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag

chmod +x /etc/rc.d/rc.local


cat >> /etc/rc.local << EOF
#修改為數(shù)據(jù)庫系統(tǒng)盤符
blockdev --setra 4096 /dev/sdc
echo deadline > /sys/block/sdc/queue/scheduler
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF

cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag

> /etc/security/limits.conf
cat >> /etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
* soft memlock -1
* hard memlock -1
EOF

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

3.軟件安裝

注意:以下操作在所有節(jié)點進(jìn)行

3.1 安裝postgresql

#所有節(jié)點
(1)編譯安裝
cd /opt
wget https://ftp.postgresql.org/pub/source/v15.5/postgresql-15.5.tar.gz
tar xf postgresql-15.5.tar.gz
cd postgresql-15.5
./configure --prefix=/usr/local/postgresql-15.5 --with-perl --with-python
make && make install

(2)創(chuàng)建軟連接,方便日后升級
ln -sf /usr/local/postgresql-15.5 /usr/local/pgsql

(3)安裝contrib目錄下的工具
cd contrib/
make && make install

(4)加入環(huán)境變量
[root@Postgres-01 contrib]# vi /etc/profile
export PATH=/usr/local/pgsql/bin:$PATH 
export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH
export PGDATA=/data/pgsql/data
export PGHOST=/tmp
[root@Postgres-01 contrib]# source /etc/profile
(5)驗證安裝
[root@Postgres-01 contrib]# psql -V
psql (PostgreSQL) 15.5

3.2 安裝pgpool

cd /opt
wget https://www.pgpool.net/mediawiki/download.php"export PATH=/usr/local/pgpool/bin/:$PATH">> /etc/profile
[postgres@postgres-01 pgpool-II-4.5.6]$ source /etc/profile

# 安裝pgpool_recovery
cd ./src/sql/pgpool-recovery/
make && make install

4.數(shù)據(jù)庫主節(jié)點配置

注意:以下操作只在主節(jié)點進(jìn)行

4.1 初始化主節(jié)點

[root@postgres-01 ~]# su - postgres
[postgres@postgres-01 ~]$ initdb -D $PGDATA

4.2 編輯配置文件

[postgres@postgres-01 ~]$ cd $PGDATA
> postgresql.conf 
cat >> postgresql.conf << EOF
############# Connection #############
listen_addresses = '*'    
port = 5432   
max_connections = 500   
superuser_reserved_connections = 3
############# Buffer #############
shared_buffers = 2GB
temp_buffers = 8MB
work_mem = 4MB
huge_pages = on
############# Log #############
logging_collector = on
log_min_messages = warning
log_statement = ddl
log_directory = '/data/pgsql/log'
log_filename = 'postgresql-%Y-%m-%d.log' 
log_truncate_on_rotation = off 
log_rotation_age = 1d
log_rotation_size = 0
############# Wal #############
wal_level = replica
wal_compression = on
max_wal_senders = 10
wal_log_hints = on
fsync = on
archive_mode = on
archive_command = 'cp "%p" "/data/pgsql/archive"'
############# VACUUM #############
autovacuum = on
autovacuum_max_workers = 10
############ 流復(fù)制 ##############
hot_standby=on
hot_standby_feedback=on
max_replication_slots = 10
EOF

4.3 啟動主節(jié)點

[postgres@postgres-01 data]$ pg_ctl start -D $PGDATA

# 安裝pgpool_recovery擴(kuò)展
# 如果一個節(jié)點損壞,要在線把失敗的節(jié)點再加回集群,需要使用到函數(shù)"pgpool_recovery"、"pgpool_remote_start"、"pgpool_switch_xlog"。另外,附帶工具pgpoolAdmin控制pgpoolII啟停和重新連接后端的PostgreSQL節(jié)點,需要使用函數(shù)"pgpool_pgctl"。這些函數(shù)都在pgpool提供的擴(kuò)展插件pgpool_recovery中
[postgres@postgres-01 ~]$ psql template1
psql (15.5)
Type "help" for help.

template1=# CREATE EXTENSION pgpool_recovery;

4.4 創(chuàng)建用戶

用戶名

Password

說明

repl

Repl@123

PostgreSQL流復(fù)制用戶

pgpool

Pgpool@123

Pgpool-II  ( health_check_user) and ( sr_check_user

postgres

Postgres@123

User running online recovery

appuser 

Appuser@123

業(yè)務(wù)用戶

 

[postgres@postgres-01 data]$ psql
set password_encryption = md5;

CREATE user pgpool  password 'Pgpool@123';
GRANT pg_monitor TO pgpool;

CREATE user repl replication  password 'Repl@123';

alter user postgres password 'Postgres@123';

CREATE USER appuser WITH PASSWORD 'Appuser@123' login;
create database appdb;
\c appdb
GRANT USAGE ON SCHEMA public TO appuser;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO appuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO appuser;

4.5 配置訪問控制文件

[postgres@postgres-01 data]$ vim pg_hba.conf 
host    replication     repl            10.0.0.0/24             md5
host    all             pgpool          10.0.0.0/24             md5 
host    all             postgres        10.0.0.0/24             md5
host    all             postgres        127.0.0.1/32            md5
local   all             postgres                                md5
host    appdb           appuser         10.0.0.0/24             md5

# 重新加載配置
[postgres@postgres-01 data]$ psql
postgres=# select pg_reload_conf();

5.pgpool配置

5.1 相關(guān)腳本配置

(1)所有節(jié)點做的操作
[root@postgres-01 ~]# chown -R postgres.postgres /usr/local/pgpool
cd /usr/local/pgpool/etc
cp pool_hba.conf.sample pool_hba.conf
cp pcp.conf.sample pcp.conf
cp pgpool.conf.sample pgpool.conf
cp follow_primary.sh.sample follow_primary.sh
cp failover.sh.sample failover.sh
cp escalation.sh.sample escalation.sh
cp recovery_1st_stage.sample recovery_1st_stage
cp pgpool_remote_start.sample pgpool_remote_start

chmod +x follow_primary.sh
chmod +x failover.sh
chmod +x escalation.sh
chmod +x recovery_1st_stage
chmod +x pgpool_remote_start

mkdir sample
mv *.sample sample

(2)主節(jié)點操作
mv recovery_1st_stage /data/pgsql/data
mv pgpool_remote_start /data/pgsql/data

配置failover.sh

注意:以下操作在所有節(jié)點進(jìn)行

在檢測到 PostgreSQL 后端節(jié)點出現(xiàn)故障時,自動執(zhí)行一系列操作以實現(xiàn)故障轉(zhuǎn)移,從而保障數(shù)據(jù)庫服務(wù)的高可用性

# 所有節(jié)點
# 修改failover.sh文件中的如下配置
# PGHOME=/usr/local/pgsql
cd /usr/local/pgpool/etc
sed -i 's/^PGHOME=.*/PGHOME=\/usr\/local\/pgsql/' /usr/local/pgpool/etc/failover.sh

配置follow_primary.sh

注意:以下操作在所有節(jié)點進(jìn)行

# 修改/usr/local/pgpool/etc/follow_primary.sh文件中的如下配置
# PGHOME=/usr/local/pgsql/
# ARCHIVEDIR=/data/pgsql/archive
# PGPOOL_PATH=/usr/local/pgpool/bin
# 95行左右的.pgpass文件路徑由/var/lib/pgsql/.pgpass更改為/home/postgres/.pgpass
# failover后,新主節(jié)點的連接信息,寫入到什么文件,RECOVERYCONF=${NODE_PGDATA}/postgresql.auto.conf
cd /usr/local/pgpool/etc
sed -i 's/^PGHOME=.*/PGHOME=\/usr\/local\/pgsql/' follow_primary.sh
sed -i 's/^ARCHIVEDIR=.*/ARCHIVEDIR=\/data\/pgsql\/archive/' follow_primary.sh
sed -i 's/^PGPOOL_PATH.*/PGPOOL_PATH=\/usr\/local\/pgpool\/bin/' follow_primary.sh
sed -i 's/\/var\/lib\/pgsql/\/home\/postgres/' follow_primary.sh
sed -i 's/myrecovery.conf/postgresql.auto.conf/' follow_primary.sh

配置recovery_1st_stage

注意:以下操作在主節(jié)點執(zhí)行

# 官方原文:出于安全原因,該命令文件必須放置在數(shù)據(jù)庫數(shù)據(jù)目錄中。例如,如果recovery_1st_stage_command = 'sync-command',則Pgpool-II將在$PGDATA目錄中查找命令腳本,并嘗試執(zhí)行$PGDATA/sync-command

# 修改/data/pgsql/data/recovery_1st_stage文件中的如下配置:
# PGHOME=/usr/local/pgsql
# ARCHIVEDIR=/data/pgsql/archive
# REPLUSER=repl
# 在56行左右的pg_basebackup命令的后面加上-R參數(shù)
# 59行左右的.pgpass文件路徑由/var/lib/pgsql/.pgpass更改為/home/postgres/.pgpass
cd /usr/local/pgpool/etc
sed -i 's/^PGHOME=.*/PGHOME=\/usr\/local\/pgsql/' recovery_1st_stage
sed -i 's/^ARCHIVEDIR=.*/ARCHIVEDIR=\/data\/pgsql\/archive/' recovery_1st_stage
sed -i 's/^REPLUSER=.*/REPLUSER=repl/' recovery_1st_stage
sed -i 's/-X stream/-X stream -R/' recovery_1st_stage
sed -i 's/\/var\/lib\/pgsql/\/home\/postgres/' recovery_1st_stage

配置pgpool_remote_start

注意:以下操作在主節(jié)點執(zhí)行

官方原文:

注意:腳本路徑和文件名是硬編碼的,$PGDATA/pgpool_remote_start在主節(jié)點上執(zhí)行。

# 修改/data/pgsql/data/pgpool_remote_start文件中的如下配置
# PGHOME=/usr/local/pgsql
cd /usr/local/pgpool/etc
sed -i 's/^PGHOME=.*/PGHOME=\/usr\/local\/pgsql/' pgpool_remote_start

配置escalation.sh

注意:以下操作在所有節(jié)點進(jìn)行

主要用于當(dāng)前 Pgpool 節(jié)點被選舉為 Leader 時,執(zhí)行 VIP切換和資源接管

# 修改escalation.sh文件中的如下配置
# PGPOOLS=(10.0.0.41 10.0.0.42 10.0.0.43)
# VIP=10.0.0.44
# DEVICE=ens33
cd /usr/local/pgpool/etc
sed -i 's/^PGPOOLS.*/PGPOOLS=(10.0.0.41 10.0.0.42 10.0.0.43)/' escalation.sh
sed -i 's/^VIP.*/VIP=10.0.0.44/' escalation.sh
sed -i 's/^DEVICE.*/DEVICE=ens33/' escalation.sh

5.2 訪問控制文件與密碼驗證文件

注意:以下操作在所有節(jié)點進(jìn)行

配置pool_hba.conf

用于客戶端到pgpool的訪問控制

[postgres@postgres-01 etc]$ cd /usr/local/pgpool/etc
[postgres@postgres-01 etc]$ > pool_hba.conf
cat >> pool_hba.conf << EOF
host    all         pgpool      10.0.0.0/24           md5        
host    all         pgpool      127.0.0.1/32          md5

host    all         postgres    10.0.0.0/24           md5
host    all         postgres    127.0.0.1/32          md5
local   all         postgres                          md5

host    appdb       appuser     10.0.0.0/24           md5
EOF

配置pool_passwd文件

用于客戶端到pgpool的用戶密碼驗證

[postgres@postgres-01 etc]$ cd /usr/local/pgpool/etc
pg_md5 -p -m -u postgres pool_passwd
password: (輸入密碼Postgres@123)

pg_md5 -p -m -u pgpool pool_passwd
password: (輸入密碼Pgpool@123)

pg_md5 -p -m -u appuser pool_passwd
password: (輸入密碼Appuser@123)

[postgres@postgres-01 etc]$ cat pool_passwd
postgres:md5dd27d33705155fd675e498384ad3d2ea
pgpool:md52a23dd6e92c7f1d2a42fafbb757ef026
appuser:md5af0df380d022abbae08aeff4d162a25b

配置pcp.conf文件

對 PCP(Pgpool-II Command Prompt)工具的認(rèn)證信息進(jìn)行管理,獨立哈希算法(非標(biāo)準(zhǔn) MD5) ,純 32 位哈希字符串(無md5前綴)

echo 'pgpool:'`pg_md5 Pgpool@123` > /usr/local/pgpool/etc/pcp.conf
echo 'postgres:'`pg_md5 Postgres@123` >> /usr/local/pgpool/etc/pcp.conf
[postgres@postgres-01 data]$ cat /usr/local/pgpool/etc/pcp.conf
pgpool:a6270f3fee9602c6d2754b7515e85ac3
postgres:c3178349c6ad5ddaecf81e15616be142

配置pgpool_node_id文件

從 Pgpool-II 4.2 開始,所有主機(jī)的所有配置參數(shù)都相同。如果啟用了監(jiān)視器功能,以消除對哪個主機(jī)是哪個主機(jī)的干擾,則需要pgpool_node_id文件

[postgres@postgres-01 .ssh]$ echo "0" >> /usr/local/pgpool/etc/pgpool_node_id
[postgres@postgres-02 .ssh]$ echo "1" >> /usr/local/pgpool/etc/pgpool_node_id
[postgres@postgres-03 .ssh]$ echo "2" >> /usr/local/pgpool/etc/pgpool_node_id

配置.pgpass文件

當(dāng) Pgpool 需要連接后端 PostgreSQL 節(jié)點進(jìn)行(健康檢查、故障轉(zhuǎn)移、負(fù)載均衡)時,提供用戶名和密碼

cat >> /home/postgres/.pgpass << EOF
10.0.0.41:5432:replication:repl:Repl@123
10.0.0.42:5432:replication:repl:Repl@123
10.0.0.43:5432:replication:repl:Repl@123
10.0.0.41:5432:postgres:postgres:Postgres@123
10.0.0.42:5432:postgres:postgres:Postgres@123
10.0.0.43:5432:postgres:postgres:Postgres@123
EOF
chmod 0600 /home/postgres/.pgpass

配置.pcppass 文件

.pcppass 文件可讓用戶在使用 PCP 工具時無需每次都手動輸入用戶名和密碼,從而實現(xiàn)自動認(rèn)證。

cat >> /home/postgres/.pcppass << EOF
localhost:9898:pgpool:Pgpool@123
10.0.0.41:9898:pgpool:Pgpool@123
10.0.0.42:9898:pgpool:Pgpool@123
10.0.0.43:9898:pgpool:Pgpool@123
EOF
chmod 600 /home/postgres/.pcppass

5.3 編輯主配置文件

注意:以下操作在所有節(jié)點進(jìn)行

[postgres@postgres-01 ~]$ cd /usr/local/pgpool/etc/
[postgres@postgres-01 etc]$ vim pgpool.conf
###################
### CONNECTIONS ###
###################
listen_addresses = '*'
port = 9999
socket_dir = '/data/pgpool'
pid_file_name = '/data/pgpool/pgpool.pid'
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/data/pgpool'
num_init_children = 30

#####################
### Backend Nodes ###
#####################
backend_clustering_mode = 'streaming_replication'
backend_hostname0 = '10.0.0.41'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'backend_node01'

backend_hostname1 = '10.0.0.42'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data/pgsql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'backend_node02'

backend_hostname2 = '10.0.0.43'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/data/pgsql/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name2 = 'backend_node03'

######################
### Authentication ###
######################
enable_pool_hba = on
pool_passwd = '/usr/local/pgpool/etc/pool_passwd'

############
### LOGS ###
############
logging_collector = on
log_directory = '/data/pgpool/log'
log_filename = 'pgpool-%Y-%m-%d.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
l

####################
### HEALTH CHECK ###
####################
health_check_period = 5
health_check_timeout = 20
health_check_user = 'pgpool'
health_check_password = 'Pgpool@123'
health_check_max_retries = 3
sr_check_user = 'pgpool'
sr_check_password = 'Pgpool@123'
follow_primary_command = '/usr/local/pgpool/etc/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'

################
### FAILOVER ###
################
failover_command = '/usr/local/pgpool/etc/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'

#######################
### ONLINE RECOVERY ###
#######################
recovery_user = 'postgres'
recovery_password = 'Postgres@123'
recovery_1st_stage_command = 'recovery_1st_stage'
# 官方原文:只有原生復(fù)制模式和快照隔離模式才需要第二階段。其他模式(包括流復(fù)制模式)不會執(zhí)行第二階段
recovery_2nd_stage_command = ''

################
### WATCHDOG ###
################
# 注意:如果您有偶數(shù)個看門狗節(jié)點,則需要打開enable_consensus_with_half_votes參數(shù)。
use_watchdog = on
wd_ipc_socket_dir = '/data/pgpool'

hostname0 = '10.0.0.41'
wd_port0 = 9000
pgpool_port0 = 9999

hostname1 = '10.0.0.42'
wd_port1 = 9000
pgpool_port1 = 9999

hostname2 = '10.0.0.43'
wd_port2 = 9000
pgpool_port2 = 9999

###################
### VIP Setting ###
delegate_ip = '10.0.0.44'
# "$_IP_$" 在硬編碼中代表delegate_ip的值
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens33 label ens33:vip'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens33'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens33'

##########################
### escalation Setting ###
##########################
wd_escalation_command = '/usr/local/pgpool/etc/escalation.sh'
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 10

#########################
### Lifecheck Setting ###
#########################
wd_lifecheck_method = 'heartbeat'
heartbeat_hostname0 = '10.0.0.41'
heartbeat_port0 = 9694
heartbeat_device0 = 'ens33'

heartbeat_hostname1 = '10.0.0.42'
heartbeat_port1 = 9694
heartbeat_device1 = 'ens33'

heartbeat_hostname2 = '10.0.0.43'
heartbeat_port2 = 9694
heartbeat_device2 = 'ens33'

6. 集群啟動

6.1 啟動pgpool

# 所有節(jié)點啟動
# 注意第一個啟動的pgpool并不會直接掛載vip,要在第二個pgpool啟動之后才會選舉出leader,在leader上掛載vip
pgpool -f /usr/local/pgpool/etc/pgpool.conf -D

# 啟動完之后會在主節(jié)點的日志中出現(xiàn)以下內(nèi)容,證明成功的將 VIP 添加到網(wǎng)絡(luò)接口
2025-04-17 16:45:44.385: watchdog_utility pid 1676: LOG:  watchdog escalation successful
2025-04-17 16:45:48.419: watchdog_utility pid 1676: LOG:  successfully acquired the delegate IP:"10.0.0.44"
2025-04-17 16:45:48.419: watchdog_utility pid 1676: DETAIL:  'if_up_cmd' returned with success

pgpool-II實現(xiàn)對業(yè)務(wù)透明的高可用與讀寫分離_高可用_03

6.2 啟動后端數(shù)據(jù)庫從節(jié)點

會在主節(jié)點觸發(fā)recovery_1st_stage、pgpool_remote_start兩個腳本,從主節(jié)點克隆數(shù)據(jù),并直接啟動從節(jié)點

[postgres@postgres-02 ~]$ pcp_recovery_node -h 10.0.0.41 -p 9898 -U pgpool --node-id=1 -v -w
pcp_recovery_node -- Command Successful

[postgres@postgres-03 etc]$ pcp_recovery_node -h 10.0.0.41 -p 9898 -U pgpool --node-id=2 -v -w
pcp_recovery_node -- Command Successful

6.3 查看集群狀態(tài)

使用vip連接pgpool 9999端口,查看后端數(shù)據(jù)庫

[postgres@postgres-01 etc]$ PGPASSWORD="Postgres@123" psql -h10.0.0.44 -p 9999
psql (15.5)
Type "help" for help.

postgres=# SELECT inet_server_addr() AS backend_host,inet_server_port() AS backend_port,current_database(),current_user;

pgpool-II實現(xiàn)對業(yè)務(wù)透明的高可用與讀寫分離_數(shù)據(jù)庫_04

查看流復(fù)制

postgres=# select usename,client_addr,sync_state from pg_stat_replication;

pgpool-II實現(xiàn)對業(yè)務(wù)透明的高可用與讀寫分離_數(shù)據(jù)庫_05

查看pool_node節(jié)點信息

postgres=# show pool_nodes;

pgpool-II實現(xiàn)對業(yè)務(wù)透明的高可用與讀寫分離_數(shù)據(jù)庫_06

到此這篇關(guān)于pgpool-II搭建集群,實現(xiàn)高可用與讀寫分離的文章就介紹到這了,更多相關(guān)pgpool-II實現(xiàn)高可用與讀寫分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論