设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间13 现在时间13 缓存数据 到现在一共是295天,有了人生中第一张迷你专辑,我期许自己这不会是句号,只会是个逗号,会一直一直一直突破的,直到我唱不动的那天。

到现在一共是295天,有了人生中第一张迷你专辑,我期许自己这不会是句号,只会是个逗号,会一直一直一直突破的,直到我唱不动的那天。 -- 一种原谅

查看: 81|回复: 0

pgpool-II搭建集群,实现高可用与读写分离

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
29
主题
27
精华
0
金钱
94
积分
58
注册时间
2023-9-30
最后登录
2025-5-31

发表于 2025-5-31 06:14:08 | 显示全部楼层 |阅读模式
pgpool-II简介

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

pgpool-II架构图

1.png


pgpool-II进程简介


  • pcp进程:pcp是一个命令行的管理工具,用户可以使用此管理工具向pgpool-II发送管 理命令。
  • pgpool-II父进程:pgpool-II父进程负责检查各个底层数据库的健康状态。
  • pgpool-II子进程:负责接收用户发过来的SQL请求,然后再根据规则将SQL请求发送 到底层的数据库上。
  • worker进程:pgpool-II 3.X版本之后才增加的进程,负责检查底层数据库之间的复制 延迟。
  • watchdog进程:可以把多个pgpool-II组成一个高可用集群,解决pgpool-II自身的高可用问题,提供了vip的管理功能。

看门狗进程详细介绍

pgpool-II在3.2版本之后把健康检查的功能从pgpool-II父进程中剥离出来,放到了一个 叫“看门狗”(watchdog)的模块中,该模块添加的功能如下。

  • pgpool服务是否正常工作的检测:看门狗模块监控pgpool服务的响应是否正常,而不 是简单监控进程是否存活。它通过向被它监控的pgpool发送查询,并检查响应情况来判断 pgpool是否正常工作。看门狗进程还监控从pgpool到前端服务器的连接(如应用服务器) 。从pgpool到前端服务器的连接作为pgpool的服务来监控。
  • 看门狗进程相互监控:看门狗进程交换被监控服务器的信息用来保证信息是最新的 ,并允许看门狗进程相互监控。 ·在某些故障检测中交换各自pgpool的主/备状态:当一个pgpool的故障被检测到,看门狗进程会把故障信息通知到其他的看门狗进程,同时看门狗进程会通过投票来确定哪一 个pgpool是主pgpool,哪一个是备pgpool。
  • 在pgpool进行主备切换的时候自动进行虚拟IP地址的漂移:当一个备用pgpool服务器 提升为主pgpool时,相应的虚拟IP也会漂移过来。这样应用程序不需要修改配置就可以连 接到新的主pgpool上。
  • 当原先发生故障的pgpool服务器恢复时,会自动注册为为备用pgpool服务器:当发生 故障的服务器恢复后,或原服务器彻底损坏通过增加新的服务器来替换原先的服务器时, 新的服务器连接上来后,新服务器上的看门狗进程通知其他的看门狗进程,新的备pgpool 服务器加进来了,让整个环境恢复成高可用状态。

pgpool-II的工作模式

pgpool-II有连接池、复制、负载均衡等功能,使用这些功能需要把pgpool-II配置在不同的工作模式下,pgpool-II有以下几种工作模式。

  • 原始模式:只实现一个故障切换的功能,可以配置多个后端数据库,当第一个后端 数据库不能工作时,pgpool-II会切换到第二个后端数据库,如果第二个后端数据库也不能 工作,再切换到第三个后端数据库,依次类推。
  • 内置复制(Native Replication)的模式:实际上就是把修改数据库的操作同时发送到 后端所有的数据库上进行处理,只读查询发送给任意一台数据库。此模式下可以实现负载 均衡的功能。
  • 主/备模式:此模式下,使用其他软件(非pgpool自身)完成实际的数据复制,如使 用Slony-I或流复制,中间件层使用pgpool-II。此时,pgpool-II主要提供高可用和连接池的 功能。在主/备模式中,DDL和DML操作在主节点上执行,SELECT语句可以在主备节点 上执行,当然也可以强制SELECT语句在主节点上执行,但需要在SELECT语句前添加“/* NO LOAD BALANCE*/”注释。
pgpool-II 3.0版本之后支持配合使用流复制+Standby的主/备模式,这基本是现在的主流模式。所以此文我们是基于这种模式部署的。操作步骤很多,请注意哪些是在所有节点执行,哪些是只在主节点执行

1.环境规划


1.1 节点信息

主机
hostname
节点配置
角色
组件
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 进程接收连接
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 相关脚本


模块
脚本名
说明
Failover
failover.sh
用于启动failover
follow_primary.sh
failover之后从节点与新主节点的同步
Online recovery
recovery_1st_stage
用于恢复从节点的数据
pgpool_remote_start
用于启动从节点
Watchdog
escalation.sh
用于安全的切换主从

2.系统准备


注意:以下操作在所有节点进行

2.1 安装依赖
  1. yum install -y yum-utils openjade docbook-dtds docbook-style-dsssl docbook-style-xsl
  2. yum install -y cmake make gcc zlib gcc-c++ perl readline readline-devel zlib
  3. 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 配置域名解析
  1. #所有节点
  2. cat >> /etc/hosts << EOF
  3. 10.0.0.41 postgres-01
  4. 10.0.0.42 postgres-02
  5. 10.0.0.43 postgres-03
  6. EOF
复制代码
2.3 创建用户与目录
  1. #所有节点
  2. groupadd -g 701 postgres
  3. useradd -g 701 -u 701 -s /bin/bash -m postgres
  4. passwd postgres

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

  8. # Pgpool-II运行的进程通常是在后台运行,没有关联的终端,所以如果不做处理,在执行 if_up_cmd、if_down_cmd 和 arping_cmd 这些带有 sudo 的命令时就会失败
  9. visudo
  10. Defaults:postgres !requiretty
  11. postgres ALL=(ALL) NOPASSWD: /sbin/ip,/usr/sbin/arping
复制代码
2.4 配置互信
  1. #所有节点都要与其它节点互信,需要特殊配置私钥文件得名称为id_rsa_pgpool,因为pgpool的很多配置文件里面的变量都已经写好了这个名字

  2. (1)生成公钥
  3. su - postgres
  4. mkdir /home/postgres/.ssh
  5. cd /home/postgres/.ssh
  6. ssh-keygen -t rsa -f id_rsa_pgpool
  7. s

  8. (2)将公钥分发到所有节点
  9. for i in {1..3};do ssh-copy-id -i id_rsa_pgpool.pub postgres@postgres-0$i;done
  10. (3)修改权限
  11. chmod 600 ~/.ssh/*
  12. chmod 644 ~/.ssh/*.pub
  13. chmod 700 ~/.ssh

  14. (4)互信验证
  15. for i in {1..3};do ssh postgres@postgres-0$i -i id_rsa_pgpool hostname;done
  16. for i in {1..3};do ssh postgres@postgres-0$i -i id_rsa_pgpool.pub hostname;done
复制代码
2.png


2.5 系统优化
  1. > /etc/sysctl.conf
  2. cat >> /etc/sysctl.conf << EOF
  3. vm.swappiness = 0
  4. vm.overcommit_memory=2
  5. vm.overcommit_ratio=90
  6. vm.dirty_background_ratio = 10   
  7. vm.dirty_ratio = 20
  8. #测试环境物理内存8G,数据节点shared_buffer=2G,最大连接数500为例,进行如下设置
  9. #        SEMMSL SEMMNS SEMOPM SEMMNI
  10. kernel.sem=300  60000  100    200
  11. vm.nr_hugepages=1500                 
  12. EOF
  13. sysctl -p

  14. echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
  15. echo "never" > /sys/kernel/mm/transparent_hugepage/defrag

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


  17. cat >> /etc/rc.local << EOF
  18. #修改为数据库系统盘符
  19. blockdev --setra 4096 /dev/sdc
  20. echo deadline > /sys/block/sdc/queue/scheduler
  21. if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  22. echo never > /sys/kernel/mm/transparent_hugepage/enabled
  23. fi
  24. if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  25. echo never > /sys/kernel/mm/transparent_hugepage/defrag
  26. fi
  27. EOF

  28. cat /sys/kernel/mm/transparent_hugepage/enabled
  29. cat /sys/kernel/mm/transparent_hugepage/defrag

  30. > /etc/security/limits.conf
  31. cat >> /etc/security/limits.conf << EOF
  32. * soft nofile 65536
  33. * hard nofile 65536
  34. * soft nproc 131072
  35. * hard nproc 131072
  36. * soft memlock -1
  37. * hard memlock -1
  38. EOF

  39. systemctl stop firewalld
  40. systemctl disable firewalld

  41. setenforce 0
  42. sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
复制代码
3.软件安装

注意:以下操作在所有节点进行

3.1 安装postgresql
  1. #所有节点
  2. (1)编译安装
  3. cd /opt
  4. wget https://ftp.postgresql.org/pub/source/v15.5/postgresql-15.5.tar.gz
  5. tar xf postgresql-15.5.tar.gz
  6. cd postgresql-15.5
  7. ./configure --prefix=/usr/local/postgresql-15.5 --with-perl --with-python
  8. make && make install

  9. (2)创建软连接,方便日后升级
  10. ln -sf /usr/local/postgresql-15.5 /usr/local/pgsql

  11. (3)安装contrib目录下的工具
  12. cd contrib/
  13. make && make install

  14. (4)加入环境变量
  15. [root@Postgres-01 contrib]# vi /etc/profile
  16. export PATH=/usr/local/pgsql/bin:$PATH
  17. export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH
  18. export PGDATA=/data/pgsql/data
  19. export PGHOST=/tmp
  20. [root@Postgres-01 contrib]# source /etc/profile
  21. (5)验证安装
  22. [root@Postgres-01 contrib]# psql -V
  23. psql (PostgreSQL) 15.5
复制代码
3.2 安装pgpool
  1. cd /opt
  2. wget https://www.pgpool.net/mediawiki/download.php"export PATH=/usr/local/pgpool/bin/:$PATH">> /etc/profile
  3. [postgres@postgres-01 pgpool-II-4.5.6]$ source /etc/profile

  4. # 安装pgpool_recovery
  5. cd ./src/sql/pgpool-recovery/
  6. make && make install
复制代码
4.数据库主节点配置

注意:以下操作只在主节点进行

4.1 初始化主节点
  1. [root@postgres-01 ~]# su - postgres
  2. [postgres@postgres-01 ~]$ initdb -D $PGDATA
复制代码
4.2 编辑配置文件
  1. [postgres@postgres-01 ~]$ cd $PGDATA
  2. > postgresql.conf
  3. cat >> postgresql.conf << EOF
  4. ############# Connection #############
  5. listen_addresses = '*'   
  6. port = 5432   
  7. max_connections = 500   
  8. superuser_reserved_connections = 3
  9. ############# Buffer #############
  10. shared_buffers = 2GB
  11. temp_buffers = 8MB
  12. work_mem = 4MB
  13. huge_pages = on
  14. ############# Log #############
  15. logging_collector = on
  16. log_min_messages = warning
  17. log_statement = ddl
  18. log_directory = '/data/pgsql/log'
  19. log_filename = 'postgresql-%Y-%m-%d.log'
  20. log_truncate_on_rotation = off
  21. log_rotation_age = 1d
  22. log_rotation_size = 0
  23. ############# Wal #############
  24. wal_level = replica
  25. wal_compression = on
  26. max_wal_senders = 10
  27. wal_log_hints = on
  28. fsync = on
  29. archive_mode = on
  30. archive_command = 'cp "%p" "/data/pgsql/archive"'
  31. ############# VACUUM #############
  32. autovacuum = on
  33. autovacuum_max_workers = 10
  34. ############ 流复制 ##############
  35. hot_standby=on
  36. hot_standby_feedback=on
  37. max_replication_slots = 10
  38. EOF
复制代码
4.3 启动主节点
  1. [postgres@postgres-01 data]$ pg_ctl start -D $PGDATA

  2. # 安装pgpool_recovery扩展
  3. # 如果一个节点损坏,要在线把失败的节点再加回集群,需要使用到函数"pgpool_recovery"、"pgpool_remote_start"、"pgpool_switch_xlog"。另外,附带工具pgpoolAdmin控制pgpoolII启停和重新连接后端的PostgreSQL节点,需要使用函数"pgpool_pgctl"。这些函数都在pgpool提供的扩展插件pgpool_recovery中
  4. [postgres@postgres-01 ~]$ psql template1
  5. psql (15.5)
  6. Type "help" for help.

  7. template1=# CREATE EXTENSION pgpool_recovery;
复制代码
4.4 创建用户

用户名
Password
说明
repl
Repl@123
PostgreSQL流复制用户
pgpool
Pgpool@123
Pgpool-II  ( health_check_user) and ( sr_check_user)
postgres
Postgres@123
User running online recovery
appuser
Appuser@123
业务用户
  1. [postgres@postgres-01 data]$ psql
  2. set password_encryption = md5;

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

  5. CREATE user repl replication  password 'Repl@123';

  6. alter user postgres password 'Postgres@123';

  7. CREATE USER appuser WITH PASSWORD 'Appuser@123' login;
  8. create database appdb;
  9. \c appdb
  10. GRANT USAGE ON SCHEMA public TO appuser;
  11. GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO appuser;
  12. ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO appuser;
复制代码

4.5 配置访问控制文件
  1. [postgres@postgres-01 data]$ vim pg_hba.conf
  2. host    replication     repl            10.0.0.0/24             md5
  3. host    all             pgpool          10.0.0.0/24             md5
  4. host    all             postgres        10.0.0.0/24             md5
  5. host    all             postgres        127.0.0.1/32            md5
  6. local   all             postgres                                md5
  7. host    appdb           appuser         10.0.0.0/24             md5

  8. # 重新加载配置
  9. [postgres@postgres-01 data]$ psql
  10. postgres=# select pg_reload_conf();
复制代码
5.pgpool配置


5.1 相关脚本配置
  1. (1)所有节点做的操作
  2. [root@postgres-01 ~]# chown -R postgres.postgres /usr/local/pgpool
  3. cd /usr/local/pgpool/etc
  4. cp pool_hba.conf.sample pool_hba.conf
  5. cp pcp.conf.sample pcp.conf
  6. cp pgpool.conf.sample pgpool.conf
  7. cp follow_primary.sh.sample follow_primary.sh
  8. cp failover.sh.sample failover.sh
  9. cp escalation.sh.sample escalation.sh
  10. cp recovery_1st_stage.sample recovery_1st_stage
  11. cp pgpool_remote_start.sample pgpool_remote_start

  12. chmod +x follow_primary.sh
  13. chmod +x failover.sh
  14. chmod +x escalation.sh
  15. chmod +x recovery_1st_stage
  16. chmod +x pgpool_remote_start

  17. mkdir sample
  18. mv *.sample sample

  19. (2)主节点操作
  20. mv recovery_1st_stage /data/pgsql/data
  21. mv pgpool_remote_start /data/pgsql/data
复制代码
配置failover.sh

注意:以下操作在所有节点进行
在检测到 PostgreSQL 后端节点出现故障时,自动执行一系列操作以实现故障转移,从而保障数据库服务的高可用性
  1. # 所有节点
  2. # 修改failover.sh文件中的如下配置
  3. # PGHOME=/usr/local/pgsql
  4. cd /usr/local/pgpool/etc
  5. sed -i 's/^PGHOME=.*/PGHOME=\/usr\/local\/pgsql/' /usr/local/pgpool/etc/failover.sh
复制代码
配置follow_primary.sh

注意:以下操作在所有节点进行
  1. # 修改/usr/local/pgpool/etc/follow_primary.sh文件中的如下配置
  2. # PGHOME=/usr/local/pgsql/
  3. # ARCHIVEDIR=/data/pgsql/archive
  4. # PGPOOL_PATH=/usr/local/pgpool/bin
  5. # 95行左右的.pgpass文件路径由/var/lib/pgsql/.pgpass更改为/home/postgres/.pgpass
  6. # failover后,新主节点的连接信息,写入到什么文件,RECOVERYCONF=${NODE_PGDATA}/postgresql.auto.conf
  7. cd /usr/local/pgpool/etc
  8. sed -i 's/^PGHOME=.*/PGHOME=\/usr\/local\/pgsql/' follow_primary.sh
  9. sed -i 's/^ARCHIVEDIR=.*/ARCHIVEDIR=\/data\/pgsql\/archive/' follow_primary.sh
  10. sed -i 's/^PGPOOL_PATH.*/PGPOOL_PATH=\/usr\/local\/pgpool\/bin/' follow_primary.sh
  11. sed -i 's/\/var\/lib\/pgsql/\/home\/postgres/' follow_primary.sh
  12. sed -i 's/myrecovery.conf/postgresql.auto.conf/' follow_primary.sh
复制代码
配置recovery_1st_stage

注意:以下操作在主节点执行
# 官方原文:出于安全原因,该命令文件必须放置在数据库数据目录中。例如,如果recovery_1st_stage_command = 'sync-command',则Pgpool-II将在$PGDATA目录中查找命令脚本,并尝试执行$PGDATA/sync-command
  1. # 修改/data/pgsql/data/recovery_1st_stage文件中的如下配置:
  2. # PGHOME=/usr/local/pgsql
  3. # ARCHIVEDIR=/data/pgsql/archive
  4. # REPLUSER=repl
  5. # 在56行左右的pg_basebackup命令的后面加上-R参数
  6. # 59行左右的.pgpass文件路径由/var/lib/pgsql/.pgpass更改为/home/postgres/.pgpass
  7. cd /usr/local/pgpool/etc
  8. sed -i 's/^PGHOME=.*/PGHOME=\/usr\/local\/pgsql/' recovery_1st_stage
  9. sed -i 's/^ARCHIVEDIR=.*/ARCHIVEDIR=\/data\/pgsql\/archive/' recovery_1st_stage
  10. sed -i 's/^REPLUSER=.*/REPLUSER=repl/' recovery_1st_stage
  11. sed -i 's/-X stream/-X stream -R/' recovery_1st_stage
  12. sed -i 's/\/var\/lib\/pgsql/\/home\/postgres/' recovery_1st_stage
复制代码
配置pgpool_remote_start

注意:以下操作在主节点执行
官方原文:
注意:脚本路径和文件名是硬编码的,$PGDATA/pgpool_remote_start在主节点上执行。
  1. # 修改/data/pgsql/data/pgpool_remote_start文件中的如下配置
  2. # PGHOME=/usr/local/pgsql
  3. cd /usr/local/pgpool/etc
  4. sed -i 's/^PGHOME=.*/PGHOME=\/usr\/local\/pgsql/' pgpool_remote_start
复制代码
配置escalation.sh

注意:以下操作在所有节点进行
主要用于当前 Pgpool 节点被选举为 Leader 时,执行 VIP切换和资源接管
  1. # 修改escalation.sh文件中的如下配置
  2. # PGPOOLS=(10.0.0.41 10.0.0.42 10.0.0.43)
  3. # VIP=10.0.0.44
  4. # DEVICE=ens33
  5. cd /usr/local/pgpool/etc
  6. sed -i 's/^PGPOOLS.*/PGPOOLS=(10.0.0.41 10.0.0.42 10.0.0.43)/' escalation.sh
  7. sed -i 's/^VIP.*/VIP=10.0.0.44/' escalation.sh
  8. sed -i 's/^DEVICE.*/DEVICE=ens33/' escalation.sh
复制代码
5.2 访问控制文件与密码验证文件

注意:以下操作在所有节点进行

配置pool_hba.conf

用于客户端到pgpool的访问控制
  1. [postgres@postgres-01 etc]$ cd /usr/local/pgpool/etc
  2. [postgres@postgres-01 etc]$ > pool_hba.conf
  3. cat >> pool_hba.conf << EOF
  4. host    all         pgpool      10.0.0.0/24           md5        
  5. host    all         pgpool      127.0.0.1/32          md5

  6. host    all         postgres    10.0.0.0/24           md5
  7. host    all         postgres    127.0.0.1/32          md5
  8. local   all         postgres                          md5

  9. host    appdb       appuser     10.0.0.0/24           md5
  10. EOF
复制代码
配置pool_passwd文件

用于客户端到pgpool的用户密码验证
  1. [postgres@postgres-01 etc]$ cd /usr/local/pgpool/etc
  2. pg_md5 -p -m -u postgres pool_passwd
  3. password: (输入密码Postgres@123)

  4. pg_md5 -p -m -u pgpool pool_passwd
  5. password: (输入密码Pgpool@123)

  6. pg_md5 -p -m -u appuser pool_passwd
  7. password: (输入密码Appuser@123)

  8. [postgres@postgres-01 etc]$ cat pool_passwd
  9. postgres:md5dd27d33705155fd675e498384ad3d2ea
  10. pgpool:md52a23dd6e92c7f1d2a42fafbb757ef026
  11. appuser:md5af0df380d022abbae08aeff4d162a25b
复制代码
配置pcp.conf文件

对 PCP(Pgpool-II Command Prompt)工具的认证信息进行管理,独立哈希算法(非标准 MD5) ,纯 32 位哈希字符串(无md5前缀)
  1. echo 'pgpool:'`pg_md5 Pgpool@123` > /usr/local/pgpool/etc/pcp.conf
  2. echo 'postgres:'`pg_md5 Postgres@123` >> /usr/local/pgpool/etc/pcp.conf
  3. [postgres@postgres-01 data]$ cat /usr/local/pgpool/etc/pcp.conf
  4. pgpool:a6270f3fee9602c6d2754b7515e85ac3
  5. postgres:c3178349c6ad5ddaecf81e15616be142
复制代码
配置pgpool_node_id文件

从 Pgpool-II 4.2 开始,所有主机的所有配置参数都相同。如果启用了监视器功能,以消除对哪个主机是哪个主机的干扰,则需要pgpool_node_id文件
  1. [postgres@postgres-01 .ssh]$ echo "0" >> /usr/local/pgpool/etc/pgpool_node_id
  2. [postgres@postgres-02 .ssh]$ echo "1" >> /usr/local/pgpool/etc/pgpool_node_id
  3. [postgres@postgres-03 .ssh]$ echo "2" >> /usr/local/pgpool/etc/pgpool_node_id
复制代码
配置.pgpass文件

当 Pgpool 需要连接后端 PostgreSQL 节点进行(健康检查、故障转移、负载均衡)时,提供用户名和密码
  1. cat >> /home/postgres/.pgpass << EOF
  2. 10.0.0.41:5432:replication:repl:Repl@123
  3. 10.0.0.42:5432:replication:repl:Repl@123
  4. 10.0.0.43:5432:replication:repl:Repl@123
  5. 10.0.0.41:5432:postgres:postgres:Postgres@123
  6. 10.0.0.42:5432:postgres:postgres:Postgres@123
  7. 10.0.0.43:5432:postgres:postgres:Postgres@123
  8. EOF
  9. chmod 0600 /home/postgres/.pgpass
复制代码
配置.pcppass 文件

.pcppass 文件可让用户在使用 PCP 工具时无需每次都手动输入用户名和密码,从而实现自动认证。
  1. cat >> /home/postgres/.pcppass << EOF
  2. localhost:9898:pgpool:Pgpool@123
  3. 10.0.0.41:9898:pgpool:Pgpool@123
  4. 10.0.0.42:9898:pgpool:Pgpool@123
  5. 10.0.0.43:9898:pgpool:Pgpool@123
  6. EOF
  7. chmod 600 /home/postgres/.pcppass
复制代码
5.3 编辑主配置文件

注意:以下操作在所有节点进行
  1. [postgres@postgres-01 ~]$ cd /usr/local/pgpool/etc/
  2. [postgres@postgres-01 etc]$ vim pgpool.conf
  3. ###################
  4. ### CONNECTIONS ###
  5. ###################
  6. listen_addresses = '*'
  7. port = 9999
  8. socket_dir = '/data/pgpool'
  9. pid_file_name = '/data/pgpool/pgpool.pid'
  10. pcp_listen_addresses = '*'
  11. pcp_port = 9898
  12. pcp_socket_dir = '/data/pgpool'
  13. num_init_children = 30

  14. #####################
  15. ### Backend Nodes ###
  16. #####################
  17. backend_clustering_mode = 'streaming_replication'
  18. backend_hostname0 = '10.0.0.41'
  19. backend_port0 = 5432
  20. backend_weight0 = 1
  21. backend_data_directory0 = '/data/pgsql/data'
  22. backend_flag0 = 'ALLOW_TO_FAILOVER'
  23. backend_application_name0 = 'backend_node01'

  24. backend_hostname1 = '10.0.0.42'
  25. backend_port1 = 5432
  26. backend_weight1 = 1
  27. backend_data_directory1 = '/data/pgsql/data'
  28. backend_flag1 = 'ALLOW_TO_FAILOVER'
  29. backend_application_name1 = 'backend_node02'

  30. backend_hostname2 = '10.0.0.43'
  31. backend_port2 = 5432
  32. backend_weight2 = 1
  33. backend_data_directory2 = '/data/pgsql/data'
  34. backend_flag2 = 'ALLOW_TO_FAILOVER'
  35. backend_application_name2 = 'backend_node03'

  36. ######################
  37. ### Authentication ###
  38. ######################
  39. enable_pool_hba = on
  40. pool_passwd = '/usr/local/pgpool/etc/pool_passwd'

  41. ############
  42. ### LOGS ###
  43. ############
  44. logging_collector = on
  45. log_directory = '/data/pgpool/log'
  46. log_filename = 'pgpool-%Y-%m-%d.log'
  47. log_file_mode = 0600
  48. log_truncate_on_rotation = on
  49. log_rotation_age = 1d
  50. l

  51. ####################
  52. ### HEALTH CHECK ###
  53. ####################
  54. health_check_period = 5
  55. health_check_timeout = 20
  56. health_check_user = 'pgpool'
  57. health_check_password = 'Pgpool@123'
  58. health_check_max_retries = 3
  59. sr_check_user = 'pgpool'
  60. sr_check_password = 'Pgpool@123'
  61. follow_primary_command = '/usr/local/pgpool/etc/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'

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

  66. #######################
  67. ### ONLINE RECOVERY ###
  68. #######################
  69. recovery_user = 'postgres'
  70. recovery_password = 'Postgres@123'
  71. recovery_1st_stage_command = 'recovery_1st_stage'
  72. # 官方原文:只有原生复制模式和快照隔离模式才需要第二阶段。其他模式(包括流复制模式)不会执行第二阶段
  73. recovery_2nd_stage_command = ''

  74. ################
  75. ### WATCHDOG ###
  76. ################
  77. # 注意:如果您有偶数个看门狗节点,则需要打开enable_consensus_with_half_votes参数。
  78. use_watchdog = on
  79. wd_ipc_socket_dir = '/data/pgpool'

  80. hostname0 = '10.0.0.41'
  81. wd_port0 = 9000
  82. pgpool_port0 = 9999

  83. hostname1 = '10.0.0.42'
  84. wd_port1 = 9000
  85. pgpool_port1 = 9999

  86. hostname2 = '10.0.0.43'
  87. wd_port2 = 9000
  88. pgpool_port2 = 9999

  89. ###################
  90. ### VIP Setting ###
  91. delegate_ip = '10.0.0.44'
  92. # "$_IP_$" 在硬编码中代表delegate_ip的值
  93. if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens33 label ens33:vip'
  94. if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens33'
  95. arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens33'

  96. ##########################
  97. ### escalation Setting ###
  98. ##########################
  99. wd_escalation_command = '/usr/local/pgpool/etc/escalation.sh'
  100. wd_heartbeat_keepalive = 2
  101. wd_heartbeat_deadtime = 10

  102. #########################
  103. ### Lifecheck Setting ###
  104. #########################
  105. wd_lifecheck_method = 'heartbeat'
  106. heartbeat_hostname0 = '10.0.0.41'
  107. heartbeat_port0 = 9694
  108. heartbeat_device0 = 'ens33'

  109. heartbeat_hostname1 = '10.0.0.42'
  110. heartbeat_port1 = 9694
  111. heartbeat_device1 = 'ens33'

  112. heartbeat_hostname2 = '10.0.0.43'
  113. heartbeat_port2 = 9694
  114. heartbeat_device2 = 'ens33'
复制代码
6. 集群启动


6.1 启动pgpool
  1. # 所有节点启动
  2. # 注意第一个启动的pgpool并不会直接挂载vip,要在第二个pgpool启动之后才会选举出leader,在leader上挂载vip
  3. pgpool -f /usr/local/pgpool/etc/pgpool.conf -D

  4. # 启动完之后会在主节点的日志中出现以下内容,证明成功的将 VIP 添加到网络接口
  5. 2025-04-17 16:45:44.385: watchdog_utility pid 1676: LOG:  watchdog escalation successful
  6. 2025-04-17 16:45:48.419: watchdog_utility pid 1676: LOG:  successfully acquired the delegate IP:"10.0.0.44"
  7. 2025-04-17 16:45:48.419: watchdog_utility pid 1676: DETAIL:  'if_up_cmd' returned with success
复制代码
3.png


6.2 启动后端数据库从节点

会在主节点触发recovery_1st_stage、pgpool_remote_start两个脚本,从主节点克隆数据,并直接启动从节点
  1. [postgres@postgres-02 ~]$ pcp_recovery_node -h 10.0.0.41 -p 9898 -U pgpool --node-id=1 -v -w
  2. pcp_recovery_node -- Command Successful

  3. [postgres@postgres-03 etc]$ pcp_recovery_node -h 10.0.0.41 -p 9898 -U pgpool --node-id=2 -v -w
  4. pcp_recovery_node -- Command Successful
复制代码
6.3 查看集群状态

使用vip连接pgpool 9999端口,查看后端数据库
  1. [postgres@postgres-01 etc]$ PGPASSWORD="Postgres@123" psql -h10.0.0.44 -p 9999
  2. psql (15.5)
  3. Type "help" for help.

  4. postgres=# SELECT inet_server_addr() AS backend_host,inet_server_port() AS backend_port,current_database(),current_user;
复制代码
4.png

查看流复制
  1. postgres=# select usename,client_addr,sync_state from pg_stat_replication;
复制代码
5.png

查看pool_node节点信息
  1. postgres=# show pool_nodes;
复制代码
6.png

到此这篇关于pgpool-II搭建集群,实现高可用与读写分离的文章就介绍到这了,更多相关pgpool-II实现高可用与读写分离内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表