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

14    2480    10

Tags:

👉 本文共约8206个字,系统预计阅读时间或需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的相关文档:

架构

本节显示了使用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台机器都安装,如下:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
PG 14 + Pgpool-II + Watchdog 实现高可用(自动故障转移+读写分离+负载均衡)后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章!
验证码:
请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

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

您可能还喜欢...

14 条回复

  1. Avatar photo xsqzj说道:

    你好,请问这个方案没有部署witness,能够防止因网络波动导致的脑裂现象么?

  2. Avatar photo xsqzj说道:

    你好,在步骤“配置PostgreSQL主备库”中输入pcp_recovery_node -h172.72.6.30 -p 9898 -U postgres -n 提示输入密码,我输如 lhr 无法登录,
    报“ERROR: connection to host "172.72.6.30" failed with error "Connection refused"”,请问正确密码是多少呢?如何解决?
    谢谢!

    • Avatar photo xsqzj说道:

      [postgres@lhrpg30 ~]$ pcp_recovery_node -h localhost -p 9898 -U pgpool -n 1
      Password:
      172.72.6.30改为localhost输入密码lhr后报错
      ERROR: executing recovery, execution of command failed at "1st stage"
      DETAIL: command:"recovery_1st_stage"

      执行命令也失败了

      • Avatar photo xsqzj说道:

        查询日志报
        password authentication failed for user "repl"
        2023-02-10 08:10:04.845 CST [864981 DETAIL: Password does not match for user "repl"。
        底层pg_basebackup 密码错误

          • Avatar photo xsqzj说道:

            你好,博主。密码文件我已经存储过了。
            -- 配置psql的密码
            cat > /var/lib/pgsql/.pgpass <<"EOF"
            172.72.6.30:5432:replication:repl:lhr
            172.72.6.31:5432:replication:repl:lhr
            172.72.6.32:5432:replication:repl:lhr
            172.72.6.35:9999:postgres:pgpool:lhr
            172.72.6.35:9999:postgres:postgres:lhr
            lhrpg30:5432:replication:repl:lhr
            lhrpg31:5432:replication:repl:lhr
            lhrpg32:5432:replication:repl:lhr :
            lhrpg30:5432:postgres:postgres:lhr
            lhrpg31:5432:postgres:postgres:lhr
            lhrpg32:5432:postgres:postgres:lhr
            EOF

            现在的问题就是两个standy一直为down,我根据你的步骤pcp_recovery_node 想将两个从节点启动,就报错,看日志底层发现是pg_basebackup提示用户"repl"密码错误。请问有排查的方向么?
            谢谢哈!

  3. Avatar photo 正在尝试说道:

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

  4. Avatar photo 验证成功说道:

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

发表回复

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

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部