
点击蓝字关注我们
PGD(EDB Postgres Distributed)可以通过多种方式进行安装和配置, 主要有四种的安装和配置方法:
手动部署和管理:如何在一组服务器上手动部署和配置EDB PGD。
TPA(Trusted Postgres Architect):如何使用 TPA 将 EDB Postgres Distributed 部署和配置到 Docker 环境、Linux 主机或 AWS。
PGD for Kubernetes:如何在 Kubernetes 环境中部署和配置 EDB Postgres Distributed。
EDB BigAnimal:如何在EDB 云平台BigAnimal上部署和配置EDB Postgres Distributed。
其中,使用TPA部署PGD在前面的文章中已做过介绍,本文学习和测试通过手动方式来部署和配置PGD。
手工部署和配置通过几个步骤完成:
部署主机以运行集群
安装选定的postgres版本并初始化Postgres库
配置存储库repositories
安装和配置PGD
创建集群
检查集群
配置PGD代理
PGD CLI命令行工具安装和使用
一、 部署主机
可以部署到安装了 Linux 的云中虚拟机实例、安装了 Linux 的本地虚拟机或安装了 Linux 的本地物理主机。本例采用本地虚拟机做为测试环境。
无论选择哪种受支持的 Linux 操作系统和部署平台,配置的结果都必须是一个可以通过具有超级用户、管理员或 sudo 权限的用户使用 SSH 访问的 Linux 系统。配置的每台计算机都必须能够连接到为集群配置的任何其他计算机。在云部署中,可以通过公共网络或 VPC 执行此操作。
1.1 创建系统管理员
首先要为每个配置的实例配置一个管理员。管理员必须具有超级用户或 sudo(超级用户)权限。我们还建议将管理员配置为使用证书进行无密码 SSH 访问。
创建管理员用户后,确保每台计算机都可以与您正在配置的其他计算机进行通信。
特别地,PostgreSQL TCP/IP端口(对于EDB Postgres Advanced Server为5444,对于EDB Postgres Extended和社区PostgreSQL为5432)必须对集群中的所有主机开放。如果计划部署PGD代理,则其端口必须对将连接到集群的所有应用程序开放。端口6432通常用于PGD代理。
本实验我们选nuser作为系统管理员并配置了正确的sudo及ssh无密码访问证书。
1.2 主机环境
对于本示例,配置了三台装有 Oracle Linux 8的主机:
pgd-node1 192.168.31.41
pgd-node2 192.168.31.42
pgd-node3 192.168.31.43
分别添加ip到各自的hosts文件中。

二、 安装PostgreSQL
如果安装EDB的EDB Postgres Advanced Server (EPAS)或EDB Postgres Extended Server (PGE),则需要EDB帐户才得访问和获取相应版本的数据库。如果要安装社区版的PostgreSQL则导入repo配置即可。
但后续获取PGD安装包时一定需要EDB帐户,所以注册一个EDB帐户是必须的步骤。
本示例计划选用社区版PostgreSQL作为数据库,所以只需配置PostgreSQL资源库repo。选择PG v16版本。在三台主机分别安装PG v16数据库。
对PGD运行在社区版PG环境时,PGD的有些功能是不可用的(如DTE数据透明加密技术、CAMO、Lag Control等)。详细见官方对比列表。
https://www.enterprisedb.com/docs/pgd/latest/planning/choosing_server/
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpmsudo dnf -qy module disable postgresqlsudo dnf install -y postgresql16-serversudo usr/pgsql-16/bin/postgresql-16-setup initdbsudo systemctl enable postgresql-16sudo systemctl start postgresql-16
默认PG data数据目录为/var/lib/pgsql/16/data/。
如果安装EPAS或PGE或EDB postgres,请参看前期EPAS安装文章或EDB官方文档配置EDB token、repositories及数据库安装。
三、 配置 PGD 存储库
3.1 EDB帐号
安装PGD 都需要一个EDB账户。如果没有EDB账户,可以注册一个免费账户。注册后,您就可以试用EDB软件库。注册后,进入EDB Repos 2.0页面,您可以在其中获取您的repo token。第一次访问此页面时,选择请求访问权限以生成您的存储库令牌。使用复制令牌图标复制令牌,并将其安全存储。

3.2 设置环境变量
将EDB_SUBSCRIPTION_TOKEN环境变量设置为在 EDB 账户步骤中获得的EDB repo Token。
在.bash_profile中或类似的shell配置文件中添加变量
export EDB_SUBSCRIPTION_TOKEN=<your-repo-token>
3.3 配置存储库
所需的所有软件都可以从PGD软件包存储库中获取。下载并运行脚本来配置PGD存储库。
curl -1sLf "https://downloads.enterprisedb.com/$EDB_SUBSCRIPTION_TOKEN/postgres_distributed/setup.rpm.sh" | sudo -E bash
四、 安装和配置 PGD
4.1 安装PGD软件包
配置PGD存储库后,现在可以安装PGD软件。必须在每个主机上执行这些步骤,然后才能继续下一步。
安装 PGD 软件包,其中包括特定于服务器的BDR软件包以及通用PGD代理和CLI软件包。(edb-bdr5-、edb-pgd5-proxy 和 edb-pgd5-cli)。
sudo dnf -y install edb-bdr5-pg16 edb-pgd5-proxy edb-pgd5-cli
4.2 确保数据库已初始化并启动
确保 Postgres 数据库服务器已初始化并启动,使用 systemctl status 检查服务是否正在运行。如果服务未运行,请初始化数据库并启动服务。
sudo systemctl status postgresql-16
4.3 配置 BDR 扩展
系统管理员
安装PG时创建的系统用户postgres,其在连接到数据库时具有管理员功能。我们将使用该用户配置BDR扩展。
配置PGD扩展
PGD的集群实现是通过PG扩展功能bdr来完成,所以在PG启动时要预加载bdr扩展库。
shared_preload_libraries = '\$libdir/bdr'
设置wal_level为logical
wal_level = logical
启用提交时间戳跟踪track_commit_timestamp为on
track_commit_timestamp = on
增加工作进程
增加max_worker_processes为16,为了在多个节点之间进行通信,PGD节点比平常运行更多的工作进程。即使对于小型集群,默认限制(8)也太低。
max_worker_processes = 16 # (change requires restart)
监听地址
监听地址接受来自所有节点的访问,listen_address修改为'*',
listen_addresses = '*' # what IP address(es) to listen on;
postgresql.conf的配置修改项:
listen_addresses = '*' # what IP address(es) to listen on;max_worker_processes = 16 # (change requires restart)wal_level = logical # minimal, replica, or logicaltrack_commit_timestamp = on # collect timestamp of transaction commitshared_preload_libraries = '$libdir/bdr' # (change requires restart)
测试环境,其它选项不作改动。
· 为postgres用户添加密码:
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'postgres'"
· 在 pg_hba.conf 中启用节点间身份验证
Postgres开箱即用,允许本地身份验证和与数据库的连接,但不允许外部网络连接。要启用此功能,需要编辑pg_hba.conf并添加适当的规则,包括复制用户的规则。
echo -e "host all all all md5\nhost replication all all md5" | sudo tee -a var/lib/pgsql/16/data/pg_hba.conf
启用节点之间的身份验证
作为连接节点进行复制过程的一部分,PGD登录到其他节点。它以运行 Postgres 的用户身份执行该登录。对PG而言,它就是postgres用户。该用户需要凭据才能登录其他节点。使用.pgpass文件提供这些凭据,该文件需要驻留在用户的主目录中。PG 的主目录是 var/lib/pgsql。
echo -e "*:*:*:postgres:postgres" | sudo -u postgres tee var/lib/pgsql/.pgpass; sudo chmod 0600 var/lib/pgsql/.pgpass
重新启动服务器
sudo systemctl restart postgresql-16
检查扩展是否已安装
检查扩展是否实际可用以及配置是否已正确加载。
查询pg_available_extensions 表中的 BDR 扩展。
[nuser@pgd-node1 ~]$ sudo -u postgres psql -c "select * from pg_available_extensions where name like 'bdr'"name | default_version | installed_version | comment------+-----------------+-------------------+-------------------------------------------bdr | 5.5.1 | | Bi-Directional Replication for PostgreSQL(1 row)
确保3个节点的PGD扩展、环境和配置都一致。
4.4 创建复制数据库
PGD服务器的基本环境已经就绪,接下来,需要创建一个名为 bdrdb(也可为其它名称) 的数据库,登录后,安装 BDR 扩展:
sudo -u postgres psql -c "CREATE DATABASE bdrdb"sudo -u postgres psql bdrdb -c "CREATE EXTENSION bdr"

三个服务器节点都需要分别执行。
4.5 验证bdr扩展已安装
sudo -u postgres psql bdrdb -c "\dx"

表中列出了 BDR 扩展,表明它已安装
4.6 PGD安装汇总
上面的各步骤汇总如下:
sudo dnf -y install edb-bdr5-pg16 edb-pgd5-proxy edb-pgd5-clisudo PGSETUP_INITDB_OPTIONS="-E UTF-8" /usr/pgsql-16/bin/postgresql-16-setup initdbsudo systemctl start postgresql-16echo -e "shared_preload_libraries= '\$libdir/bdr'"|sudo -u postgres tee -a /var/lib/pgsql/16/data/postgresql.conf >/dev/nullecho -e "wal_level = 'logical'" | sudo -u postgres tee -a /var/lib/pgsql/16/data/postgresql.conf >/dev/nullecho -e "track_commit_timestamp = 'on'" | sudo -u postgres tee -a /var/lib/pgsql/16/data/postgresql.conf >/dev/nullecho -e "max_worker_processes = '16'" | sudo -u postgres tee -a /var/lib/pgsql/16/data/postgresql.conf >/dev/nullsudo -u postgres psql postgres -c "ALTER USER postgres WITH PASSWORD 'postgres'"echo -e "host all all all md5\nhost replication all all md5" | sudo tee -a /var/lib/pgsql/16/data/pg_hba.conf >/dev/nullecho -e "*:*:*:postgres:postgres" | sudo -u postgres tee /var/lib/pgsql/.pgpass; sudo chmod 0600 /var/lib/pgsql/.pgpasssudo systemctl restart postgresql-16sudo -u postgres psql postgres -c "CREATE DATABASE bdrdb"sudo -u postgres psql bdrdb -c "CREATE EXTENSION bdr"sudo -u postgres psql bdrdb
五、 创建 PGD 集群
到目前为止,本例已经:
创建了三个主机
在每台主机上安装 了Postgres 服务器
在每台主机上安装了PGD
在每台主机上配置了Postgres 服务器与PGD配合使用。
要创建集群,需要告诉pgd-node1的 Postgres 实例它是一个 PGD 节点(node-one),并在该节点上创建PGD组。然后,您告诉主机二pgd-node2和主机三pgd-node3的 Postgres 实例,它们是PGD节点(节点二和节点三),并且它们必须加入节点一pgd-node1上创建的组。
5.1 为每个节点创建连接字符串
以下是此 3 个节点的连接字符串:
主机名 | 节点名 | IP地址 | 连接字符串 |
pgd-node1 | node-one | 192.168.31.41 | host=pgd-node1 dbname=bdrdb port=5432 |
pgd-node2 | node-two | 192.168.31.42 | Host=pgd-node2 dbname=bdrdb port=5432 |
pgd-node3 | node-three | 192.168.31.43 | host=pgd-node3 dbname=bdrdb port=5432 |
5.2 创建第一个节点
登录到pgd-node1主机的Postgres服务器。
ssh nuser@pgd-node1sudo -iu postgres psql bdrdb
调用bdr.create_node函数来创建一个节点,并向其传递节点名称和其他节点可用于连接的“字符串”。
select bdr.create_node('node-one','host=host-one dbname=bdrdb port=5432');create_node-------------2824718320(1 row)
5.3 创建顶级组
调用bdr.create_node_group函数为PGD集群创建顶级组。传递单个字符串参数将创建具有该名称的顶及组,示例创建一个名为pgd的顶级组。
bdrdb=# select bdr.create_node_group('pgd');create_node_group-------------------1850374637(1 row)
5.4 创建子组
首选使用子组来组织节点,因为它允许 PGD 代理(稍后将配置)等服务来协调它们的操作。在较大的 PGD 安装中,可以存在多个子组。这些子组提供了组织分组,可以实现集群的地理映射和本地化弹性。因此,本示例为第一个节点创建一个子组,以实现更简单的扩展和 PGD 代理的使用。
再次调用bdr.create_node_group函数来创建顶级组的子组。第一个参数是子组名称,第二个参数是父组名称。此示例创建一个子组dc1作为pgd的子组。
bdrdb=# select bdr.create_node_group('dc1','pgd');create_node_group-------------------4269540889(1 row)
5.5 添加第二个节点
登录到pgd-node2的Postgres服务器,
ssh nuser@pgd-node2sudo -iu postgres psql bdrdb
5.6 创建第二个节点
调用bdr.create_node函数创建此节点,并向其传递节点名称和其他节点可用于连接到该节点的连接字符串。
bdrdb=# select bdr.create_node('node-two','host=pgd-node2 dbname=bdrdb port=5432');create_node-------------2299992455(1 row)
5.7 将第二个节点加入集群
使用bdr.join_node_group可以要求节点二加入节点一的dc1组。该函数的第一个参数是已在组中的节点的连接字符串,第二个参数是组名。
bdrdb=# select bdr.join_node_group('host=pgd-node1 dbname=bdrdb port=5432','dc1');join_node_group-----------------(1 row)
5.8 将第三个节点加入集群
和节点二加入的操作一样,将节点三加入集群。
ssh nuser@pgd-node3sudo -iu postgres psql bdrdb
bdrdb=# select bdr.create_node('node-three','host=pgd-node3 dbname=bdrdb port=5432');create_node-------------1954860017(1 row)
bdrdb=# select bdr.join_node_group('host=pgd-node1 dbname=bdrdb port=5432','dc1');join_node_group-----------------(1 row)
至此,一个PGD群组已经创建完成。
六、 检查集群
集群启动并运行后,值得运行一些基本检查以查看其复制的效率。
在节点一上创建一个表:
bdrdb=# CREATE TABLE quicktest ( id SERIAL PRIMARY KEY, value INT );CREATE TABLE
给表quicktest插入一些值:
bdrdb=# INSERT INTO quicktest (value) SELECT random()*10000 FROM generate_series(1,10000);INSERT 0 10000
在节点一上获取校验和:
bdrdb=# select COUNT(*),SUM(value) from quicktest;count | sum-------+----------10000 | 50454884(1 row)
在节点二上,运行相同sql获取校验和
ssh admin@pgd-node2sudo -iu postgres psql bdrdbbdrdb=# select COUNT(*),SUM(value) from quicktest;count | sum-------+----------10000 | 50454884(1 row)
结果与节点一相同。
同理在节点三运行相同sql获取校验和,也应该返回与节点一和节点二相同的值。
说明三个节点的集群数据实现快速复制与同步。
---< 待续 >---

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




