暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

用 TPA 自动化 PostgreSQL 集群的部署

新智锦绣 2024-05-09
170

点击蓝字关注我们


目前 PostgreSQL 的集群安装部署可以通过多种方法来实现,可以通过手动安装(源码或二进制包)、包管理器安装(apt、yum、zypper等)、Docker容器化安装、自动化部署工具(Ansible、Chef、Puppet等)。


这里我们介绍一个由 EDB 开发并开源的自动化部署工具,称为 Trusted Postgres Architect(简称TPA)。这是一个可信的以声明方式部署 PostgreSQL 集群的工具。


TPA 的可信来自工程师在最佳 Postgres 架构、如何以可靠的方式提供备份以及配置复制的最佳方法方面积累的多年经验。


TPA 在底层使用Ansible编排。使用TPA和直接编写 Ansible 之间的主要区别在于,TPA 提供了一种更简洁的“Postgres友好”语法来指定集群架构。虽然 Ansible 和 TPA 本质上都是声明式的,但在 Ansible 中部署和配置高可用性 Postgres 集群所需的低级语句数量可能让它感觉更像是一个命令式、分步工具。使用 TPA,您只需指定最终集群的外观,TPA 就会创建需要执行的 playbook,以便部署节点并配置不同的应用程序。换句话说,Ansible 的“命令性”被 TPA 抽象掉了。


本文不会介绍如何安装 TPA,后续的各种集群安装过程中会做介绍。

1

“配置”和集群定义


TPA 通过`config.yml`文件定义群集。该文件列出了群集变量和实例。实例代表一台服务器(也称为"节点"),分配给实例的角色决定了该服务器在群集中的功能。部署步骤将对每个节点进行相应的设置。这包括根据节点的角色安装软件包、设置复制、故障转移管理器、备份等。

这个`config.yml`文件在定义集群方面提供了很大的灵活性。同时,对于不熟悉 YAML 和 TPA 内部结构的人来说,编写该文件可能比较复杂。为了克服这种复杂性,TPA提供了一个`configure`命令,可根据几个参数生成基本的`config.yml`。之后,用户可以通过手动修改YAML文件来扩展集群的定义。


2

部署一个单主(primary)集群


首先,我们将建立一个包含四个节点的 PostgreSQL 集群:一个主节点(primary)、两个备用节点(standby)和一个备份服务器(backup)。

这在TPA中被称为"M1"架构(单主节点)。我们将使用 Patroni 作为三个 Postgres 节点的故障转移管理器,第四个节点将使用 Barman 来管理备份。

    tpaexec configure ~/clusters/patroni-tpa --architecture M1 --platform docker --os Rocky \ --postgresql 15 --enable-patroni

    上面的命令将创建“~/clusters/patroni-tpa/config.yml”,这是一个声明性配置文件,将用于部署具有指定选项的集群。也就是说,使用 Rocky Linux Docker 容器,并安装 PostgreSQL 15。(这里手动修改了节点名称,但我们稍后会看到如何在运行`configure`之前提供它们):

      ---
      architecture: M1
      cluster_name: patroni-tpa
      cluster_tags: {}

      cluster_vars:
       enable_pg_backup_api: false
       etcd_location: main
       failover_manager: patroni
       postgres_flavour: postgresql
       postgres_version: '15'
       preferred_python_version: python3
       use_volatile_subscriptions: false

      locations:
      - Name: main
      - Name: dr

      instance_defaults:
       image: tpa/rocky:8
       platform: docker
       vars:
         ansible_user: root

      instances:
      - Name: endor
       backup: hoth
       location: main
       node: 1
       role:
       - primary
      - Name: kamino
       location: main
       node: 2
       role:
       - replica
       upstream: endor
      - Name: hoth
       location: main
       node: 3
       role:
       - barman
       - log-server
       - monitoring-server
      - Name: naboo
       location: dr
       node: 4
       role:
       - replica
       upstream: endor
      - Name: tatooine
       location: dr
       node: 5
       role:
       - etcd
       vars:
         etcd_location: main
      - Name: bespin
       location: main
       node: 6
       role:
       - etcd
       vars:
         etcd_location: main
      - Name: alderaan
       location: dr
       node: 7
       role:
       - etcd
       vars:
         etcd_location: main


      选择平台


      在上面的示例中,我们选择了 Docker 平台,非常适合测试环境,可以使用它来启动集群以重现客户遇到的问题。但对于生产环境,可能会部署在虚拟机、云环境的实例中,甚至裸机服务器上。对于这些情况,您可以使用“--platform bare”选项。每个节点都需要 IP 地址,但无法从命令行指定。但 TPA 有一个可选参数用于指定节点名称,我们可以为这些节点名称添加 IP 地址。

        $ cat home/martin/cluster_nodes.txt 
        endor    192.168.130.5
        naboo    192.168.130.6
        bespin    192.168.130.7
        hoth     192.168.130.15
        alderaan   192.168.130.11
        kamino    192.168.130.12
        tatooine   192.168.130.13

        这里,我们给"Patroni"集群中设置了七个节点,因为 DCS 还需要另外三个"etcd"节点。有了它,我们就可以使用以下“configure”命令来设置“config.yml”。

          tpaexec configure ~/clusters/patroni-tpa-bare --architecture M1 --platform bare --os Rocky --postgresql 15 --enable-patroni --hostnames-from home/martin/cluster_nodes.txt

          这将产生以下`config.yml`:

            ---
            architecture: M1
            cluster_name: patroni-tpa-bare
            cluster_tags: {}


            cluster_vars:
             enable_pg_backup_api: false
             etcd_location: main
             failover_manager: patroni
             postgres_flavour: postgresql
             postgres_version: '15'
             preferred_python_version: python3
             use_volatile_subscriptions: false


            locations:
            - Name: main
            - Name: dr


            instance_defaults:
             platform: bare
             vars:
               
            ansible_user: root




            instances:
            - Name: endor
             backup: bespin
             ip_address: 192.168.130.5
             location: main
             node: 1
             role:
             - primary
            - Name: naboo
             ip_address: 192.168.130.6
             location: main
             node: 2
             role:
             - replica
             upstream: endor
            - Name: bespin
             ip_address: 192.168.130.7
             location: main
             node: 3
             role:
             - barman
             - log-server
             - monitoring-server
            - Name: hoth
             ip_address: 192.168.130.15
             location: dr
             node: 4
             role:
             - replica
             upstream: naboo
            - Name: alderaan
             ip_address: 192.168.130.11
             location: dr
             node: 5
             role:
             - etcd
             vars:
               etcd_location: main
            - Name: kamino
             ip_address: 192.168.130.12
             location: main
             node: 6
             role:
             - etcd
             vars:
               etcd_location: main
            - Name: tatooine
             ip_address: 192.168.130.13
             location: dr
             node: 7
             role:
             - etcd
             vars:
            etcd_location: main


            选择其他故障转移管理服务器


            在上面的示例中,我们使用“Patroni”作为故障转移管理器。但 TPA 提供了另外两个故障转移管理器:

            >- `repmgr`
            >- `EFM` (only for EDB customers)

            要使用这两个选项中的任何一个,你必须分别用`--enable-repmgr`或`--enable-efm`替换`--enable-patroni`。要使用`EFM`,你必须有一个 EDB 订阅。


            Postgres 多种版本


            除了安装 PostgreSQL 之外,TPA 还可以为订阅的客户安装由 EDB 提供的其他 Postgres 版本的集群。你可以使用"--edb-postgres-advanced"或"--edb-postgres-extended"分别将其设置为"EPAS"或"PGE"。


            Repositories 软件库


            您可以使用“yum_repositories:”或“apt_repositories:”或通过设置“edb_repositories:”来配置各种存储库。最后一项仅适用于拥有有效 EDB 订阅的客户。

            例如,要为 Rocky Linux 节点集群配置“PGDG”和“EPEL”存储库,您可以将以下内容添加到“config.yml”的“cluster_vars:”部分:

              cluster_vars:
               yum_repository_list:
               - PGDG
               - EPEL

              另一方面,如果你是 EDB 客户,你可以使用其中一个内部 EDB 存储库(根据权限,你可以选择其中一个)。目前,有四个 EDB 存储库:community360"、"standard"、"enterprise"和"postgres_distributed"。

              TPA 的一个重要功能是,它将根据您决定部署的体系结构和工具来决定和添加适当的存储库。例如,如果您选择“PGD-Always-ON”,它将添加“postgres_distributed”存储库,但如果它是以“EPAS”作为 Postgres 风格的 M1 架构,它将使用“enterprise”,如果安装 PostgreSQL 和开源工具,它将使用“PGDG”。通常,您不需要通过“configure”的命令行参数或在“config.yml”中手动设置存储库时执行任何操作

              例如,要设置可访问`PGE`、`EFM`和`PEM`的`standard`资源库,可以在`tpaexec configure`调用中添加以下选项:`--edb-repositories standard`。这将在`config.yml`的`cluster_vars`中包含以下几行:

                cluster_vars:
                 edb_repositories:
                 - standard

                为了能够访问 EDB 存储库,您必须设置订阅令牌:

                  export EDB_SUBSCRIPTION_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                  登入 EDB 网站后,您可以在https://www.enterprisedb.com/accounts/profile处找到您的令牌。

                  3


                  轻松配置 EDB Postgres 

                  Distributed (PGD)集群


                  最复杂的高可用性架构之一是 EDB 的多主(multi-master)数据库服务器,称为 EDB Postgres Distributed,简称 PGD。EDB Postgres Distributed 可实现高达5个9的极高可用性,并可作为 EDB 企业或标准计划订阅的附加组件来附加订阅。EDB 一直采用 TPA 在生产环境中部署 PGD,而且取得了巨大的成功。

                  与 M 一样,也可以使用 configure 命令设置 PGD 集群:

                    tpaexec configure -a PGD-Always-ON --platform aws --postgresql 15 --bdr-database martin --pgd-proxy-routing local  --data-nodes-per-location 2 --owner martin --location-names DC1 DC2 DC3 --instance-type t3.micro  --witness-only-location DC3  ~/clusters/PGD5

                    上面的代码将生成一个“config.yml”,它使用三个位置在 AWS 上部署“PGD-Always-ON”架构,前两个位置各有两个节点,第三个位置有一个见证节点。您可以在 PGD-Always-ON 的 TPA 文档中阅读有关可使用的附加选项的更多信息,还可以通过 PGD 5的文档来熟悉 PGD。


                    Provisioning 配置节点:Docker 和 AWS


                    在上面的第一个示例中,我们声明了一个在 Docker 容器上运行的集群。我们还提到,您也可以选择“裸”平台,无论它们是在云中、虚拟机上还是实际的裸机上。

                    您可以使用的另一个平台是“aws”。使用此平台选项时,TPA 将为您在 AWS 中配置节点,前提是在环境变量或 AWS 配置文件中设置了适当的凭证(通常为“~/.aws/credentials”)。

                    可以使用“tpaexec provision”来完成配置,它只会配置节点,也可以使用“tpaexec deploy”来完成配置和部署。


                    使用 TPA 进行部署


                    设置好配置后,如果使用“裸”平台,并且已配置节点,则部署集群就像对集群运行“tpaexec deploy”一样简单,最后一个参数始终是“config.yml”所在的集群目录):

                      cd ~/clusters/patroni-tpa/ && ssh -F ssh_config endor

                      TPA 将生成 ssh 密钥对并将其安装在集群的每个节点上。在集群配置目录中,可以找到私钥和公钥以及“ssh_config”文件。用于“ssh”进入连接节点。从上面的集群示例中,通过“ssh”连接到“endor”节点非常简单:

                        cd ~/clusters/patroni-tpa/ && ssh -F ssh_config endor


                        部署其他集群工具


                        TPA 不仅能够部署带有故障转移管理器和用于备份的 Barman 服务器的 PostgreSQL,还能够通过 EDB 的“PEM”服务器或带有 pgbouncer 的池化器进行监控。

                        1.PEM

                        设置带有 PEM 服务器监控的 PostgreSQL 集群只需添加`--enable-pem`参数。如果使用了“--enable-pg-backup-api”,会启用 Barman 节点。

                        2.pgbouncer

                        尽管这不是一个“配置”选项,但 TPA 支持在包含“pgbouncer”角色的实例上设置“pgbouncer”。您可以通过添加角色以及特定于“pgbouncer”的其他一些选项,轻松地将“pgbouncer”安装在 Postgres 实例中:

                          instances:
                          - Name: endor
                           backup: hoth
                           location: main
                           node: 1
                           role:
                           - primary
                           - pgbouncer
                          - Name: kamino
                           location: main
                           node: 2
                           role:
                           - replica
                           - pgbouncer
                           upstream: endor

                          或者,您可以使用“pgbouncer”设置代理,该代理将连接到两个“PostgreSQL”节点中的一个,如下例所示:

                            instances:
                            - Name: endor
                             backup: hoth
                             location: main
                             node: 1
                             role:
                             - primary
                            - Name: kamino
                             location: main
                             node: 2
                             role:
                             - replica
                             upstream: endor
                            - Name: proxy
                             role:
                             - pgbouncer
                             vars:
                               pgbouncer_backend: endor
                            pgbouncer_databases:
                            - name: luke
                              options:
                                pool_mode: transaction
                            - name: luke-ro
                              options:
                                host: kamino


                            4

                            TPA 可以处理的其它事项


                            除了上述所有之外,TPA 还可以根据配置设置以下工具:

                            -HAProxy
                            -pglogical

                            它还提供了运行“tpaexec cmd”的可能性,它允许您在实例上运行Ansible ad-hoc命令。

                            TPA 提供了对 EDB 订阅提供了中断/修复功能支持,如果有兴趣可以亲自体验 TPA 带来的优势!





                            发现“分享”“赞”了吗,戳我看看吧


                            文章转载自新智锦绣,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论