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

14    2783    10

Tags:

👉 本文共约8166个字,系统预计阅读时间或需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服务器都位于同一子网中。

本文架构图如下所示:

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

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

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

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

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的帖子,
    就这个验证成功。
    谢谢你,辛苦了

发表回复