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

手动部署和配置 PGD (二)

新智锦绣 2024-07-04
171

点击蓝字关注我们


接:手动部署和配置 PGD (一) 


七、 配置代理


PGD可以使用代理将流量引导至由集群自动选择的集群节点之一。使用代理有性能和可用性方面的原因:

  • 性能:通过将所有流量(特别是写入流量)引导到一个节点,该节点可以在本地更有效地解决写入冲突。

  • 可用性:当节点因维护而停机或因其他原因离线时,代理可以将新流量定向到它选择的新写入领导者。


7.1 将每个主机配置为代理

集群准备就绪后,需要配置每个主机以运行 pgd-proxy:

  • 创建 pgdproxy 本地用户。

  • 为该用户创建一个.pgpass 文件,允许用户以pgdproxy身份登录集群。

  • 修改pgdproxy的systemd服务文件以使用pgdproxy用户。

  • 为主机创建一个代理配置文件,其中列出子组中所有节点的连接字符串,指定在获取代理选项(例如 listen_address 和 listen_port )时要使用的代理名称。

  • 将该文件配置为 etc/edb/pgd-proxy/pgd-proxy-config.yml 。

  • 重新启动systemd服务并检查其状态。

  • 登录代理并验证其操作。


7.2 代理环境准备

为了使代理发挥作用,dc1子组必须启用Raft和路由。登录集群任意节点,以postgres用户使用psql连接bdrdb数据库。执行:

    bdrdb=# SELECT bdr.alter_node_group_option('dc1', 'enable_raft', 'true');
    bdrdb=#SELECT bdr.alter_node_group_option('dc1', 'enable_proxy_routing', 'true');
    alter_node_group_option
    -------------------------

    (1 row)


    bdrdb=# SELECT bdr.alter_node_group_option('dc1', 'enable_proxy_routing', 'true');
    alter_node_group_option
    -------------------------

    (1 row)

    使用 bdr.node_group_summary视图检查设置选项的状态:

      bdrdb=# SELECT node_group_name, enable_proxy_routing, enable_raft
      bdrdb-#             FROM bdr.node_group_summary
      bdrdb-#            WHERE parent_group_name IS NOT NULL;
      node_group_name | enable_proxy_routing | enable_raft
      -----------------+----------------------+-------------
      dc1             | t                    | t
      (1 row)

      接下来,使用bdr.create_proxy函数在集群内创建PGD代理。此函数采用两个参数:代理的唯一名称和您希望其作为代理的组。本示例中,我们希望dc1子组中的每个主机上都有一个代理:

        SELECT bdr.create_proxy('pgd-proxy-one','dc1');
        SELECT bdr.create_proxy('pgd-proxy-two','dc1');
        SELECT bdr.create_proxy('pgd-proxy-three','dc1');

        可以使用 bdr.proxy_config_summary 视图来检查代理是否已创建:

          bdrdb=# SELECT proxy_name, node_group_name
          bdrdb-#              FROM bdr.proxy_config_summary;
            proxy_name    | node_group_name
          -----------------+-----------------
          pgd-proxy-one   | dc1
          pgd-proxy-two   | dc1
          pgd-proxy-three | dc1
          (3 rows)


          7.3 在数据库上创建 pgdproxy 用户

          创建名为pgdproxy的用户并为其设置密码proxysecret并授权bdr_superuser。在任意节点上以postgres/postgres身份登录bdrdb数据库。

            bdrdb=# CREATE USER pgdproxy PASSWORD 'proxysecret';
            CREATE ROLE
            bdrdb=# GRANT bdr_superuser TO pgdproxy;
            GRANT ROLE


            7.4 配置代理路由到每个节点

            代理连接后,会从集群获取其dsn值(连接字符串)。集群需要知道代理对子群组中每个节点应使用的连接详情。具体做法是将每个节点的route_dsn选项设置为代理可用于连接该节点的连接字符串。

            当代理启动时,它会从代理的配置文件中获取初始dsn。此步骤中设置的route_dsn值和配置文件中的值应该匹配。

            在任意节点上,以postgres/postgres身份登录bdrdb数据库。

              SELECT bdr.alter_node_option('node-one', 'route_dsn', 'host=pgd-node1 dbname=bdrdb port=5432 user=pgdproxy');
              SELECT bdr.alter_node_option('node-two', 'route_dsn', 'host=pgd-node2 dbname=bdrdb port=5432 user=pgdproxy');
              SELECT bdr.alter_node_option('node-three', 'route_dsn', 'host=pgd-node3 dbname=bdrdb port=5432 user=pgdproxy');


              7.5 在每台主机上创建 pgdproxy 用户

                sudo adduser pgdproxy

                该用户需要凭据才能连接到服务器。创建一个.pgpass 文件,其中包含 proxysecret 密码。然后锁定.pgpass 文件,以便只有其所有者才能访问它。

                  echo -e "*:*:*:pgdproxy:proxysecret" | sudo tee /home/pgdproxy/.pgpass
                  sudo chown pgdproxy /home/pgdproxy/.pgpass
                  sudo chmod 0600 /home/pgdproxy/.pgpass


                  7.6 在每台主机上配置 systemd 服务

                  将服务文件从使用 root 切换为使用 pgdproxy 用户。

                    sudo sed -i s/root/pgdproxy/ /usr/lib/systemd/system/pgd-proxy.service

                    重新加载systemd守护进程。

                      sudo systemctl daemon-reload


                      7.7 为每台主机创建代理配置文件

                      每台主机的代理配置文件略有不同。它是一个 YAML 文件,包含一个群集对象。群集对象有三个属性:

                      • PGD 集群顶级组的名称(如name)

                      • 数据库端点数组(如endpoints)

                      • 具有名称和端点的代理定义对象(如 proxy )

                      前两个属性对于所有主机都相同:

                        cluster:
                         name: pgd
                         endpoints:
                           - "host=pgd-node1 dbname=bdrdb port=5432 user=pgdproxy"
                           - "host=pgd-node2 dbname=bdrdb port=5432 user=pgdproxy"
                           - "host=pgd-node3 dbname=bdrdb port=5432 user=pgdproxy"

                        第三个属性proxy有一个name属性。name属性是用 bdr.create_proxy 创建的名称,在每台主机上都不同。代理不能与Postgres服务器使用相同的端口,最好使用不同于直接连接的常用端口,即使主机上没有运行Postgres服务器。通常情况下,PGD 代理使用6432 端口。

                            proxy:
                             name: pgd-proxy-one


                          7.8 在每台主机上安装 PGD 代理配置

                          对于每个主机,创建/etc/edb/pgd-proxy目录:

                            sudo mkdir -p /etc/edb/pgd-proxy

                            然后,在每个主机上,将适当的配置写入 /etc/edb/pgd-proxy 目录中的 pgd-proxy-config.yml 文件。节点pgd-node1上的配置如下所示:

                              [nuser@pgd-node1 pgd-proxy]$ cat pgd-proxy-config.yml 
                              cluster:
                               name: pgd-demo
                               endpoints:
                                 - host=pgd-node1 dbname=bdrdb port=5432
                                 - host=pgd-node2 dbname=bdrdb port=5432
                                 - host=pgd-node3 dbname=bdrdb port=5432
                               proxy:
                                 name: pgd-proxy-one
                                 endpoint: "host=localhost dbname=bdrdb port=6432"

                              节点pgd-node2和节点pgd-node3配置类似,只是name值不同,分别为pgd-proxy-two和pgd-proxy-three。


                              7.9 重启 pgd-proxy 服务

                              安装代理的每台主机上,重启pgd-proxy服务。

                                sudo systemctl restart pgd-proxy
                                sudo systemctl status pgd-proxy


                                7.10 测试代理

                                此时,连接到集群中任何主机上的 PGD 代理端口都会导致连接被路由到当前的写入引导节点(write lead node)。

                                假设已在所有三台主机上安装了代理,则连接到主机三pgd-node3上的代理会导致连接路由到节点一pgd-node2。

                                  [nuser@pgd-node3 ~]$ sudo -iu postgres psql -d "host=pgd-node3 dbname=bdrdb port=6432"
                                  psql (16.3)
                                  Type "help" for help.


                                  bdrdb=#

                                  连接到代理后,我们可以查询服务器,了解代理连接到了哪个节点:

                                    bdrdb=# select node_name from bdr.local_node_summary;
                                    node_name
                                    -----------
                                    node-two
                                    (1 row)

                                    通过代理,无论连接host到哪个节点,返回都是路由到node-two节点(write lead node)。

                                    可以通过查询哪个节点是所连接子群的写领导者来确认这一点:

                                      bdrdb=# SELECT node_group_name, write_lead FROM bdr.node_group_routing_summary;
                                      node_group_name | write_lead
                                      -----------------+------------
                                      dc1             | node-two
                                      (1 row)
                                        printf("hello world!");


                                        八、 使用 PGD CLI


                                        PGD CLI命令使用配置文件来确定要连接的主机。有一些选项允许覆盖此设置以使用替代配置文件或显式指向服务器。但是,默认情况下,PGD CLI在预设位置查找配置文件。

                                        与数据库的连接的身份验证方式与其他命令行实用程序(如psql命令)的身份验证方式相同。

                                        与其他命令不同,PGD CLI不会以交互方式提示您输入密码。因此,您必须使用以下方法之一传递密码:

                                        • 将条目添加到您的 .pgpass 密码文件中,其中包括主机、端口、数据库名称、用户名和密码

                                        • 在PGPASSWORD环境变量中设置密码

                                        • 在连接字符串中包含密码

                                        多数情况下,建议选择第一种方式,这样还可以很好地适应多个数据库集群。


                                        8.1 配置和连接 PGD CLI

                                        前面的步骤中我们已经安装了edb-pgd5-cli软件包。所以只需要创建其配置文件,pgd-cli的配置文件也是一个YAML格式文件,指定PGD CLI要使作的集群和端点。PGD CLI的配置文件与PGD代理配置文件类似。它有两个属性:

                                        • PGD 集群顶级组的名称(如 name )

                                        • 数据库端点排列(如 endpoints )

                                        创建pgd-cli目录和配置文件

                                          sudo mkdir -p /etc/edb/pgd-cli
                                          sudo touch /etc/edb/pgd-cli/pgd-cli-config.yml

                                          所有节点上的pgd-cli-config.yml配置完全相同,内容如下:

                                            cluster:
                                             name: pgd-demo
                                             endpoints:
                                               - host=pgd-node1 dbname=bdrdb port=5432
                                               - host=pgd-node2  dbname=bdrdb port=5432
                                               - host=pgd-node3 dbname=bdrdb port=5432

                                            设置pgd-cli目录属主为postgres。

                                              sudo chown -R postgres:postgres /etc/edb/pgd-cli


                                              8.2 运行和测试 PGD CLI

                                              pgd cli配置完成后,可以以postgre用户运行gpd cli相应命令来查看和观察PGD集群状态。

                                              显示PGD集群节点:

                                                [postgres@pgd-node1 ~]$ pgd show-nodes
                                                Node       Node ID    Group Type Current State Target State Status Seq ID
                                                ----       -------    ----- ---- ------------- ------------ ------ ------
                                                node-one   2824718320 dc1   data ACTIVE        ACTIVE       Up     1      
                                                node-three 1954860017 dc1   data ACTIVE        ACTIVE       Up     3      
                                                node-two   2299992455 dc1   data ACTIVE        ACTIVE       Up     2      

                                                检查pgd健康状态:

                                                  [postgres@pgd-node1 ~]$ pgd check-health
                                                  Check      Status Message                                                    
                                                  -----      ------ -------                                                    
                                                  ClockSkew  Ok     All BDR node pairs have clockskew within permissible limit
                                                  Connection Ok     All BDR nodes are accessible                              
                                                  Raft       Ok     Raft Consensus is working correctly                        
                                                  Replslots  Ok     All BDR replication slots are working correctly            
                                                  Version    Ok     All nodes are running same BDR versions          

                                                  显示集群组(node-two为写领导者):

                                                    [postgres@pgd-node1 ~]$ pgd show-groups
                                                    Group Group ID   Type   Parent Group Location Raft Routing Raft Leader Write Leader
                                                    ----- --------   ----   ------------ -------- ---- ------- ----------- ------------
                                                    pgd   1850374637 global                       true false   node-one                
                                                    dc1   4269540889 data   pgd                   true true    node-three  node-two    

                                                    显示代理及其组和端口:

                                                      [postgres@pgd-node1 ~]$ pgd show-proxies
                                                      Proxy           Group Listen Addrs Listen Port Read Listen Addrs Read Listen Port
                                                      -----           ----- ------------ ----------- ----------------- ----------------
                                                      pgd-proxy-one   dc1   [0.0.0.0]    6432        [ ]                                
                                                      pgd-proxy-three dc1   [0.0.0.0]    6432        [ ]                                
                                                      pgd-proxy-two   dc1   [0.0.0.0]    6432        [ ]                

                                                      设置组选项

                                                        [postgres@pgd-node1 ~]$ pgd set-group-options --group-name dc1 --option "location=Shanghai"
                                                        [postgres@pgd-node1 ~]$ pgd show-groups
                                                        Group Group ID   Type   Parent Group Location Raft Routing Raft Leader Write Leader
                                                        ----- --------   ----   ------------ -------- ---- ------- ----------- ------------
                                                        pgd   1850374637 global                                      true false   node-one                
                                                        dc1   4269540889 data   pgd          Shanghai      true true    node-three  node-two    

                                                        切换写领导者(从节点二手工切换到节点三)

                                                          [postgres@pgd-node1 ~]$ pgd switchover --group-name dc1 --node-name node-three
                                                          switchover is complete
                                                          [postgres@pgd-node1 ~]$ pgd show-groups
                                                          Group Group ID   Type   Parent Group Location Raft Routing Raft Leader Write Leader
                                                          ----- --------   ----   ------------ -------- ---- ------- ----------- ------------
                                                          pgd   1850374637 global                       true false   node-one                
                                                          dc1   4269540889 data   pgd          Shanghai true true    node-three  node-three  

                                                          更多的参数可以通过 pgd -h获得帮助。


                                                          九、 手动安装与 TPA 安装总结


                                                          通过手动安装与前期介绍的TPA安装PGD方式对比,很明显可以看到TPA安装只需简单几个步骤就可以完成复杂的PGD多站点集群部署和安装。

                                                          而手动安装则需要对每个组件及名称进行提前规划,还要防止在psql创建集群时输入错误,本人就在创建节点是手误敲错了节点名称,费了很大周折才恢复到设定状态。但手动安装可以了解到PGD的深层的内容,对深入学习和理解PGD有更大的帮助。

                                                          但从EDB官方声明,建议用TPA方式来进行PGD的安装。TPA基于最佳实践和标准配置,提供了安全性、性能优化和可维护性方面的建议和预设配置。这有助于减少配置错误和遵循最佳安全实践。



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


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

                                                          评论