
点击蓝字关注我们
七、 配置代理
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_raftbdrdb-# FROM bdr.node_group_summarybdrdb-# 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_namebdrdb-# FROM bdr.proxy_config_summary;proxy_name | node_group_name-----------------+-----------------pgd-proxy-one | dc1pgd-proxy-two | dc1pgd-proxy-three | dc1(3 rows)
7.3 在数据库上创建 pgdproxy 用户
创建名为pgdproxy的用户并为其设置密码proxysecret并授权bdr_superuser。在任意节点上以postgres/postgres身份登录bdrdb数据库。
bdrdb=# CREATE USER pgdproxy PASSWORD 'proxysecret';CREATE ROLEbdrdb=# 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/.pgpasssudo chown pgdproxy /home/pgdproxy/.pgpasssudo 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: pgdendpoints:- "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.ymlcluster:name: pgd-demoendpoints:- host=pgd-node1 dbname=bdrdb port=5432- host=pgd-node2 dbname=bdrdb port=5432- host=pgd-node3 dbname=bdrdb port=5432proxy:name: pgd-proxy-oneendpoint: "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-proxysudo 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-clisudo touch /etc/edb/pgd-cli/pgd-cli-config.yml
所有节点上的pgd-cli-config.yml配置完全相同,内容如下:
cluster:name: pgd-demoendpoints:- 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-nodesNode Node ID Group Type Current State Target State Status Seq ID---- ------- ----- ---- ------------- ------------ ------ ------node-one 2824718320 dc1 data ACTIVE ACTIVE Up 1node-three 1954860017 dc1 data ACTIVE ACTIVE Up 3node-two 2299992455 dc1 data ACTIVE ACTIVE Up 2
检查pgd健康状态:
[postgres@pgd-node1 ~]$ pgd check-healthCheck Status Message----- ------ -------ClockSkew Ok All BDR node pairs have clockskew within permissible limitConnection Ok All BDR nodes are accessibleRaft Ok Raft Consensus is working correctlyReplslots Ok All BDR replication slots are working correctlyVersion Ok All nodes are running same BDR versions
显示集群组(node-two为写领导者):
[postgres@pgd-node1 ~]$ pgd show-groupsGroup Group ID Type Parent Group Location Raft Routing Raft Leader Write Leader----- -------- ---- ------------ -------- ---- ------- ----------- ------------pgd 1850374637 global true false node-onedc1 4269540889 data pgd true true node-three node-two
显示代理及其组和端口:
[postgres@pgd-node1 ~]$ pgd show-proxiesProxy 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-groupsGroup Group ID Type Parent Group Location Raft Routing Raft Leader Write Leader----- -------- ---- ------------ -------- ---- ------- ----------- ------------pgd 1850374637 global true false node-onedc1 4269540889 data pgd Shanghai true true node-three node-two
切换写领导者(从节点二手工切换到节点三)
[postgres@pgd-node1 ~]$ pgd switchover --group-name dc1 --node-name node-threeswitchover is complete[postgres@pgd-node1 ~]$ pgd show-groupsGroup Group ID Type Parent Group Location Raft Routing Raft Leader Write Leader----- -------- ---- ------------ -------- ---- ------- ----------- ------------pgd 1850374637 global true false node-onedc1 4269540889 data pgd Shanghai true true node-three node-three
更多的参数可以通过 pgd -h获得帮助。
九、 手动安装与 TPA 安装总结
通过手动安装与前期介绍的TPA安装PGD方式对比,很明显可以看到TPA安装只需简单几个步骤就可以完成复杂的PGD多站点集群部署和安装。
而手动安装则需要对每个组件及名称进行提前规划,还要防止在psql创建集群时输入错误,本人就在创建节点是手误敲错了节点名称,费了很大周折才恢复到设定状态。但手动安装可以了解到PGD的深层的内容,对深入学习和理解PGD有更大的帮助。
但从EDB官方声明,建议用TPA方式来进行PGD的安装。TPA基于最佳实践和标准配置,提供了安全性、性能优化和可维护性方面的建议和预设配置。这有助于减少配置错误和遵循最佳安全实践。

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




