pgpool-II搭建集群,實現(xiàn)高可用與讀寫分離
pgpool-II簡介
https://www.pgpool.net/docs/45/en/html/ 官方文檔地址
pgpool-II架構(gòu)圖
pgpool-II進(jìn)程簡介
- pcp進(jìn)程:pcp是一個命令行的管理工具,用戶可以使用此管理工具向pgpool-II發(fā)送管 理命令。
- pgpool-II父進(jìn)程:pgpool-II父進(jìn)程負(fù)責(zé)檢查各個底層數(shù)據(jù)庫的健康狀態(tài)。
- pgpool-II子進(jìn)程:負(fù)責(zé)接收用戶發(fā)過來的SQL請求,然后再根據(jù)規(guī)則將SQL請求發(fā)送 到底層的數(shù)據(jù)庫上。
- worker進(jìn)程:pgpool-II 3.X版本之后才增加的進(jìn)程,負(fù)責(zé)檢查底層數(shù)據(jù)庫之間的復(fù)制 延遲。
- watchdog進(jìn)程:可以把多個pgpool-II組成一個高可用集群,解決pgpool-II自身的高可用問題,提供了vip的管理功能。
看門狗進(jìn)程詳細(xì)介紹
pgpool-II在3.2版本之后把健康檢查的功能從pgpool-II父進(jìn)程中剝離出來,放到了一個 叫“看門狗”(watchdog)的模塊中,該模塊添加的功能如下。
- 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)控。
- 看門狗進(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。
- 在pgpool進(jìn)行主備切換的時候自動進(jìn)行虛擬IP地址的漂移:當(dāng)一個備用pgpool服務(wù)器 提升為主pgpool時,相應(yīng)的虛擬IP也會漂移過來。這樣應(yīng)用程序不需要修改配置就可以連 接到新的主pgpool上。
- 當(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有以下幾種工作模式。
- 原始模式:只實現(xiàn)一個故障切換的功能,可以配置多個后端數(shù)據(jù)庫,當(dāng)?shù)谝粋€后端 數(shù)據(jù)庫不能工作時,pgpool-II會切換到第二個后端數(shù)據(jù)庫,如果第二個后端數(shù)據(jù)庫也不能 工作,再切換到第三個后端數(shù)據(jù)庫,依次類推。
- 內(nèi)置復(fù)制(Native Replication)的模式:實際上就是把修改數(shù)據(jù)庫的操作同時發(fā)送到 后端所有的數(shù)據(jù)庫上進(jìn)行處理,只讀查詢發(fā)送給任意一臺數(shù)據(jù)庫。此模式下可以實現(xiàn)負(fù)載 均衡的功能。
- 主/備模式:此模式下,使用其他軟件(非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
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
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;
查看流復(fù)制
postgres=# select usename,client_addr,sync_state from pg_stat_replication;
查看pool_node節(jié)點信息
postgres=# show pool_nodes;
到此這篇關(guān)于pgpool-II搭建集群,實現(xiàn)高可用與讀寫分離的文章就介紹到這了,更多相關(guān)pgpool-II實現(xiàn)高可用與讀寫分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
虛擬主機(jī)應(yīng)該如何解決電信網(wǎng)通間互聯(lián)互通
電信和網(wǎng)通兩大基礎(chǔ)網(wǎng)絡(luò),人為地割裂了整個中國的網(wǎng)絡(luò)。無論是選擇把網(wǎng)站托管在電信、還是網(wǎng)通,都等于是在拒絕處于另外一個網(wǎng)絡(luò)中的客戶,因為實在太慢了2011-10-10將 PFX,JKS 證書轉(zhuǎn)換為 PEM 格式方法
這篇文章主要介紹了將 PFX,JKS 證書轉(zhuǎn)換為 PEM 格式方法,需要的朋友可以參考下2024-01-01HTTP響應(yīng)字段Transfer-Encoding含義及作用詳解
在HTTP通信中,響應(yīng)正文可以以多種不同的編碼方式傳輸,其中一種方式是chunked傳輸編碼,本文將詳細(xì)介紹Transfer-Encoding字段的含義和chunked傳輸編碼,以及提供示例來解釋這些概念2023-11-11服務(wù)器從安裝到配置陣列RAID1+RAID5?安裝Windows?Server?2019
今天就給安排上了——從RAID的配置開始,以及如何在WinPE里面載入陣列卡驅(qū)動、磁盤分區(qū)、安裝系統(tǒng)等,另外 ,圖片為操作過程中實拍,質(zhì)量不高,敬請諒解2022-10-10Windows遠(yuǎn)程數(shù)據(jù)、文件同步工具cwRsync配置方法
這篇文章主要介紹了Windows遠(yuǎn)程數(shù)據(jù)、文件同步工具cwRsync配置方法,需要的朋友可以參考下2015-10-10服務(wù)器硬件知識普及篇(需要配置服務(wù)器的朋友可以參考)
服務(wù)器硬件知識普及篇(需要配置服務(wù)器的朋友可以參考)2009-08-08