PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

6    1832    8

Tags:

👉 本文共约8182个字,系统预计阅读时间或需31分钟。

简介

Pgpool-II是一个在PostgreSQL服务器和PostgreSQL数据库客户端之间工作的中间件。它是根据BSD许可证授权的。它提供以下功能。

连接池

Pgpool-II保存与PostgreSQL服务器的连接,并在具有相同属性(即用户名,数据库,协议版本)的新连接进入时重用它们。它减少了连接开销,并提高了系统的整体吞吐量。

复制

Pgpool-II可以管理多个PostgreSQL服务器。使用复制功能可以在2个或更多物理磁盘上创建实时备份,以便在磁盘发生故障时服务可以继续运行而不会停止服务器。

负载均衡

如果复制了数据库,则在任何服务器上执行SELECT查询都将返回相同的结果。Pgpool-II利用复制功能,通过在多个服务器之间分配SELECT查询来减少每个PostgreSQL服务器的负载,从而提高系统的整体吞吐量。充其量,性能与PostgreSQL服务器的数量成比例地提高。在许多用户同时执行许多查询的情况下,负载平衡最有效。

限制超出连接

PostgreSQL的最大并发连接数有限制,连接在这么多连接后被拒绝。但是,设置最大连接数会增加资源消耗并影响系统性能。pgpool-II对最大连接数也有限制,但额外连接将排队,而不是立即返回错误。

看家狗

Watchdog可以协调多个Pgpool-II,创建一个强大的集群系统,避免单点故障或脑裂。看门狗可以对其他pgpool-II节点执行生命检查,以检测Pgpoll-II的故障。如果活动Pgpool-II发生故障,则可以将备用Pgpool-II提升为活动状态,并接管虚拟IP。

在内存查询缓存中

在内存中查询缓存允许保存一对SELECT语句及其结果。如果有相同的SELECT,Pgpool-II将从缓存中返回值。由于不涉及SQL解析或访问PostgreSQL,因此在内存缓存中使用速度非常快。另一方面,在某些情况下,它可能比正常路径慢,因为它增加了存储缓存数据的一些开销。

Pgpool-II讲PostgreSQL的后端和前端协议,并在后端和前端之间传递消息。因此,数据库应用程序(前端)认为Pgpool-II是实际的PostgreSQL服务器,服务器(后端)将Pgpool-II视为其客户端之一。因为Pgpool-II对服务器和客户端都是透明的,所以现有的数据库应用程序可以与Pgpool-II一起使用。Pgpool-II讲述PostgreSQL的后端和前端协议,并在它们之间传递连接。因此,数据库应用程序(前端)认为Pgpool-II是实际的PostgreSQL服务器,服务器(后端)将Pgpool-II视为其客户端之一。因为Pgpool-II对服务器和客户端都是透明的,所以现有的数据库应用程序可以与Pgpool-II一起使用,几乎不需要更改其源码。

watchdog是pgpool的核心组件,watchdog在 pgpool方案中扮演非常重要的角色,当启动pgpool时会启动watchdog子进程,主要作用为:

  • 和pgpool后端PostgreSQL数据库节点以及远程pgpool节点进行通信。
  • 对远程pgpool节点是否存活进行检查。
  • 当watchdog子进程启动时,对本地pgpool的配置和远程pgpool的配置参数进行检查,并且输出本地和远程pgpool不一致的参数。
  • 当pgpool主节点宕机时,watchdog集群将选举出新的 watchdog主节点。
  • 当pgpool备节点激活成主节点时,watchdog负责将VIP飘移到新的pgpool节点。

相关文章

之前发布过几篇有关pgpool的文章:

有关pgpool-II的相关文档:

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

架构

本节显示了使用Pgpool-II的流式复制配置示例。在本例中,我们使用3台Pgpool-II服务器来管理PostgreSQL服务器,以创建一个健壮的集群系统,并避免单点故障或脑裂。

本配置示例中使用了PostgreSQL 14。所有脚本都经过PostgreSQL 10及更高版本的测试。

我们使用3台安装了CentOS 7.6的服务器,server1、server2、server3。我们在每台服务器上安装PostgreSQL 14和Pgpool II。

我们假设所有Pgpool-II服务器和PostgreSQL服务器都位于同一子网中。

本文架构图如下所示:

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

Note: Active, Standby, Primary, Standby 这些角色不是固定的,在后续的切换中是可以改变的。

如果是2个节点,那么架构可以变为:

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

Table 1. 主机及IP地址

HostnameIP AddressVirtual IP别名
lhrpg30172.72.6.30172.72.6.35Server1
lhrpg31172.72.6.31172.72.6.35Server2
lhrpg32172.72.6.32172.72.6.35Server3

Table 2. PostgreSQL版本及配置

ItemValueDetail
PostgreSQL Version14.2-
port5432-
$PGDATA/var/lib/pgsql/14/data-
Archive modeon/var/lib/pgsql/archivedir
Replication SlotsEnable-
Start automaticallyEnable-

Table 3. Pgpool-II版本及配置

ItemValueDetail
Pgpool-II Version4.3.0-
port9999Pgpool-II accepts connections
9898PCP process accepts connections
9000watchdog accepts connections
9694UDP port for receiving Watchdog's heartbeat signal
Config file/etc/pgpool-II/pgpool.confPgpool-II config file
Pgpool-II start userpostgres (Pgpool-II 4.1 or later)Pgpool-II 4.0 or before, the default startup user is root
Running modestreaming replication mode-
WatchdogonLife check method: heartbeat
Start automaticallyEnable-

Table 4. 示例脚本

FeatureScriptDetail
Failover/etc/pgpool-II/failover.sh.sampleRun by failover_command to perform failover
/etc/pgpool-II/follow_primary.sh.sampleRun by follow_primary_command to synchronize the Standby with the new Primary after failover.
Online recovery/etc/pgpool-II/recovery_1st_stage.sampleRun by recovery_1st_stage_command to recovery a Standby node
/etc/pgpool-II/pgpool_remote_start.sampleRun after recovery_1st_stage_command to start the Standby node
Watchdog/etc/pgpool-II/escalation.sh.sampleRun by wd_escalation_command to switch the Active/Standby Pgpool-II safely

上述脚本包含在RPM包中,可以根据需要进行定制。

安装Pgpool-II和PostgreSQL 14

我们使用yum来安装Pgpool-II和PostgreSQL 14。

在3台机器都安装,如下:

yum安装PG 14.2

参考:【DB宝67】使用yum来安装PostgreSQL13.3数据库

yum安装pgpool-II

https://www.pgpool.net/yum/rpms/

https://www.pgpool.net/mediawiki/index.php/Yum_Repository

https://www.pgpool.net/docs/latest/en/html/install-rpm.html

Note: 如果设置Pgpool-II自动启动,则需要将 search_primary_node_timeout更改为适当的值,以便在服务器启动后启动PostgreSQL。如果Pgpool-II在 search_primary_node_timeout期间无法连接到后端的PostgreSQL,它将失败。

准备工作

在server1操作即可。

配置归档

Server1配置用户

Table 6. Users

User NamePasswordDetail
replreplPostgreSQL复制用户
pgpoolpgpoolPgpool-II health check (health_check_user) and replication delay check (sr_check_user) user
postgrespostgresUser running online recovery

配置互信

pgpool配置

创建pgpool的密码文件

注意:/var/lib/pgsql为postgres用的家目录。

创建pgpool_node_id

  • server1

  • server2

  • server3

Pgpool-II参数配置

故障转移配置

failover_command参数中执行故障转移后要执行的shell脚本。如果我们使用3台PostgreSQL服务器,我们需要指定follow_primary_command,以便在主节点故障转移后运行。对于两台PostgreSQL服务器,不需要设置follow_primary_command

示例脚本failover.sh和follow_primary.sh安装在/etc/pgpool-II/中。可以使用这些示例文件创建故障转移脚本。

注意脚本failover.shfollow_primary.sh中的PGHOME是否配置正确。脚本follow_primary.sh中的PCP_USER为pgpool。

Pgpool-II在线恢复配置

为了使用Pgpool II执行在线恢复,我们指定PostgreSQL用户名和在线恢复命令recovery_1st_stage。因为执行在线恢复需要PostgreSQL中的超级用户权限,所以我们在recovery_user中指定postgres_user。然后,我们在PostgreSQL主服务器(server1)的数据库集群目录中创建recovery_1st_stage和pgpool_remote_start,并添加执行权限。

在线恢复示例脚本recovery_First_stage和pgpool_remote_start安装在/etc/pgpool II/中。将这些文件复制到主服务器(server1)的数据目录。

Basically, it should work if you change PGHOME according to PostgreSQL installation directory.

注意脚本recovery_1st_stagepgpool_remote_start中的PGHOME是否配置正确。脚本follow_primary.sh中的PCP_USER为pgpool。

为了使用在线恢复功能,需要pgpool_recovery、pgpool_remote_start、pgpool_switch_xlog等功能,因此我们需要在PostgreSQL server server1的template1上安装pgpool_recovery。

配置/etc/pgpool-II/pool_hba.conf

Watchdog配置

启动Pgpool-II

在启动Pgpool-II之前,请先启动PostgreSQL;在关闭PostgreSQL之前,请先关闭Pgpool-II

过程:

节点1已经有VIP了。

配置PostgreSQL主备库

3个节点都启动pgpool:

首先,我们应该使用Pgpool-II在线恢复功能设置PostgreSQL备用服务器。确保pcp_recovery_node命令使用的recovery_1st_stage和pgpool_remote_start脚本位于PostgreSQL主服务器(server1)的数据库群集目录中。

在执行pcp_recovery_node命令后,验证server2和server3是否作为PostgreSQL备用服务器启动。

切换active/standby watchdog

停止server1节点或者停止server1上的Pgpool-II服务:

启动server1上的Pgpool-II服务, 该服务会以standby角色运行:

Failover

停止节点1的PG数据库,

在关闭server1上的PG后,failover自动发生,节点3成为新的主库:

在线恢复

恢复之前宕掉的server1主机:

可以看到,server1作为一个standby存在:

读写分离+负载均衡

测试之前,可以考虑修改文件pgpool.conf中的如下参数:

生效:

测试完成后,修改回原值:

测试过程:

过程省略,参考:https://www.xmmup.com/dbbao61postgresqlshiyongpgpool-iishixianduxiefenlifuzaijunheng.html

安装pgpoolAdmin

更多内容参考:【DB宝72】pgpool-II和pgpoolAdmin的使用

pgpool项目还提供了一个使用PHP写的 Web管理工具,称为“pgpoolAdmin ",该Web管理工具可以以 Web界面方式实现pgpool-II 的配置。

pgpoolAdmin下载:https://pgpool.net/mediawiki/index.php/Downloads

pgpoolAdmin官方文档:https://www.pgpool.net/docs/pgpoolAdmin/index_en.html

pgpoolAdmin安装:https://www.pgpool.net/docs/pgpoolAdmin/en/install.html

The pgpool Administration Tool is management tool of pgpool. It is possible to monitor, start, stop pgpool and change setting for pgpool.

PgpoolAdmin是管理pgpool的WEB界面工具,可以对pgpool进行监控,启停服务,更改设置。

使用yum直接安装:

启动:

第一次使用,需要进行配置:

http://172.72.6.30/admin/install/

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

image-20220224135827264

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

image-20220224141154635

配置完成之后,提示会说删除install目录。

最后使用在pcp.conf中的用户名密码登录。

登陆:http://172.72.6.30/admin/login.php ,用户名和密码:pgpooladmin/lhr

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

image-20220224145351654

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

可以在界面进行操作进行switchover:

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

错误解决

可以正常进入登录界面,但是输入用户名和密码后,报错“500 Internal Server Error”,如下:

PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)

解决:php版本太低,最低需要PHP 5.6.0,请升级您的php版本。

参考

参考:

https://www.pgpool.net/docs/latest/en/html/example-cluster.html

https://www.jianshu.com/p/dab25c3af916?utm_campaign=haruki

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

6 条回复

  1. 头像 正在尝试说道:

    请问这个sshUserSetup.sh脚本是从哪里获取呢?

  2. 头像 验证成功说道:

    看了非常多的PG+pgpool的帖子,
    就这个验证成功。
    谢谢你,辛苦了

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

9 + 14 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部