本页内容
- 准备工作
- 配置 /etc/hosts 与 UFW
- 安装 PostgreSQL 服务器
- 创建数据库与用户
- 配置 PostgreSQL 服务器
- 安装 Bucardo
- 使用 Bucardo 配置多主复制
- 验证多主复制 PostgreSQL 服务器
- 总结
PostgreSQL 是一个开源的数据库管理系统,注重可扩展性与 SQL 标准兼容。PostgreSQL 是一款先进的企业级 RDBMS(关系型数据库管理系统),同时支持 SQL(关系型)和 JSON(非关系型)查询。
它是一款高度稳定、企业级的数据库管理系统,提供多种解决方案,使你能够搭建高可用与故障转移。PostgreSQL 被用作 Web、移动和分析应用的主数据库。它以可靠性、灵活性、功能强健性和性能而享有盛誉。
本教程将在 Ubuntu 22.04 服务器上安装 PostgreSQL 数据库服务器,并通过 Bucardo(一个异步 PostgreSQL 复制系统)在多个服务器之间搭建多主复制。你将通过官方 PostgreSQL 软件源安装 PostgreSQL,编译并安装 bucardo,然后在 PostgreSQL 服务器之间配置多主复制。
Bucardo 是一个 Perl 应用程序,可实现异步 PostgreSQL 复制系统,并允许你配置多主与多源操作。Bucardo 是免费的开源软件,遵循 BSD 许可证。
准备工作
完成本教程需要两台或更多 Ubuntu 22.04 服务器。你还需要一个具备 sudo/root 管理员权限的非 root 用户。
本示例将使用两台具有以下详细信息的 Ubuntu 22.04 服务器:
Hostname IP Address --------------------------- postgres01 192.168.5.121 postgres02 192.168.5.122
当所有前置条件就绪后,你就可以开始安装 PostgreSQL 服务器了。
配置 /etc/hosts 与 UFW
在本节中,你将配置 '/etc/hosts' 与 UFW 防火墙,以开放默认的 PostgreSQL 端口 5432,并允许特定的网络子网访问它。你必须在两台服务器上都配置 /etc/hosts 文件与 UFW。
使用以下 nano 编辑器命令打开 /etc/hosts 文件。
sudo nano /etc/hosts
将以下行添加到文件中,并务必根据你的实际工作环境修改对应的 IP 地址与主机名。
192.168.5.121 postgres01 192.168.5.122 postgres02
完成后保存并关闭文件。
接下来,执行以下 'ufw' 命令以开放 OpenSSH 端口与 PostgreSQL 服务器端口 5432。这样你将开放默认的 OpenSSH 端口 22,同时开放 PostgreSQL 服务器端口 5432,并指定仅允许来自可信网络 ' 192.168.5.0/24 ' 的访问。
sudo ufw allow OpenSSH
sudo ufw allow from 192.168.5.0/24 to any port 5432
现在执行以下命令以启动并启用 UFW。当提示出现时,输入 y 确认并按 ENTER 继续。
sudo ufw enable
出现 ' Firewall is active and enabled on system startup '(防火墙已激活并在系统启动时启用)的输出,即表明 UFW 正在运行,并会在系统启动时自动启用。

最后,使用以下命令验证 UFW 防火墙的状态。
sudo ufw status
你应该会收到类似这样的输出——已添加 OpenSSH 服务,并在 UFW 规则列表中可用。同时,PostgreSQL 服务器端口 5432 仅允许来自 ' 192.168.5.0/24 ' 的访问。

安装 PostgreSQL 服务器
首先,执行 'apt install' 命令安装一些基础依赖。提示出现时输入 y 并按 ENTER 继续。
sudo apt install wget gnupg2 lsb-release curl apt-transport-https ca-certificates

接下来,执行以下 'curl' 命令下载 PostgreSQL 软件源的 GPG 密钥,通过 'gpg --dearmor' 命令将 .asc 文件转换为 .gpg,然后添加 PostgreSQL 软件源。
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/pgdg.gpg > /dev/null 2>&1
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

现在更新并刷新你的 Ubuntu 软件包索引,以应用你新添加的 PostgreSQL 软件源。
sudo apt update

现在你可以通过下面的 'apt install' 命令安装 PostgreSQL 服务器。这样你将安装最新版本的 PostgreSQL 服务器,即 PostgreSQL 15。
sudo apt install postgresql
提示出现时,输入 y 确认并按 ENTER 继续。

PostgreSQL 服务器安装完成后,请执行以下 systemctl 命令工具来验证 PostgreSQL 服务,确保其处于运行并已启用状态。
sudo systemctl is-enabled postgresql
sudo systemctl status postgresql
出现 ' active (running) ' 输出表明 PostgreSQL 服务器正在运行。而 ' enabled ' 输出表明 PostgreSQL 会在系统启动时自动运行。

最后,你还需要安装 PostgreSQL 扩展 ' plperl ',Bucardo 软件会用到它。执行以下 'apt install' 命令安装 'plperl' 扩展。
sudo apt install postgresql-plperl-15
安装将自动开始。

至此,你已在两台 Ubuntu 22.04 服务器上安装了 PostgreSQL 15,并安装了 Bucardo 将使用的 PostgreSQL 扩展 'plperl'。下一步,你将创建供 Bucardo 使用的 PostgreSQL 用户与数据库,同时创建用于复制测试的 test 数据库。
创建数据库与用户
在本节中,你将创建一个供 Bucardo 安装使用的新数据库与用户。你还将创建一个带有模式(schema)的新数据库,用于测试 PostgreSQL 复制。务必在两台 PostgreSQL 服务器上都执行以下命令与查询。
在开始之前,将工作目录切换到 ' /var/lib/postgresql '。
cd /var/lib/postgresql
现在通过以下命令登录 PostgreSQL shell。
sudo -u postgres psql
登录 PostgreSQL shell 后,执行以下查询创建一个名为 'bucardo' 的新用户与数据库。该数据库将用于存储 Bucardo 数据,且 ' bucardo ' 用户应具有 SUPERUSER 权限。
CREATE USER bucardo WITH SUPERUSER;
CREATE DATABASE bucardo OWNER bucardo;

现在执行以下查询验证 PostgreSQL 上的数据库与用户列表。若成功,你应在输出中看到 'bucardo' 数据库与用户。
\l
\du
PostgreSQL 服务器上的数据库列表。

PostgreSQL 服务器上的用户列表。

为 Bucardo 创建好数据库与用户后,接下来你将在 PostgreSQL 服务器上创建一个用于测试复制的新数据库。
执行以下查询创建新数据库 ' testdb '。然后,通过 ' \c ' 查询连接到 ' testdb ' 数据库。
CREATE DATABASE testdb;
\c testdb;
现在执行以下查询创建新表 'users'。
CREATE TABLE users (
id SERIAL PRIMARY KEY,
first_name VARCHAR(255),
last_name VARCHAR(255) NOT NULL,
city VARCHAR(255)
);

表创建完成后,执行以下查询验证 'users' 表的结构,然后验证表中的数据列表。
\dt
select * from users;

配置 PostgreSQL 服务器
在本节中,你将配置两台 PostgreSQL 服务器运行在内部 IP 地址上。同时,你将配置 PostgreSQL 认证,使服务器之间的连接被 PostgreSQL 视为可信连接。
使用以下 nano 编辑器命令打开默认的 PostgreSQL 配置文件 '/etc/postgresql/15/main/postgresql.conf'。
sudo nano /etc/postgresql/15/main/postgresql.conf
取消注释 'listen_addresses ' 参数,并添加你 PostgreSQL 服务器的内部 IP 地址。这样你将使 PostgreSQL 在每台服务器上都运行于内部 IP 地址。
以下是 postgres01 服务器的配置。
listen_addresses = 'localhost, 192.168.5.121'

以下是 postgres02 服务器的配置。
listen_addresses = 'localhost, 192.168.5.122'

完成后保存并关闭文件。
接下来,使用以下 nano 编辑器命令打开默认的 PostgreSQL 认证配置文件 ' /etc/postgresql/15/main/pg_hba.conf'。
sudo nano /etc/postgresql/15/main/pg_hba.conf
在 postgres01 服务器上,添加以下配置,并务必将 IP 地址替换为 postgres02 服务器的 IP 地址。这样,任何本地连接以及来自 bucardo 用户的连接都将被信任。同时,来自 postgres02 的 postgres 与 bucardo 用户的连接也将被信任。
# local connection and bucardo user local all all trust local all bucardo trust # Bucardo user remote connections host all postgres 192.168.5.122/24 trust host all bucardo 192.168.5.122/24 trust

以下是 postgres02 服务器的配置。务必将 IP 地址替换为 postgres01 服务器的 IP 地址。
# local connection and bucardo user local all all trust local all bucardo trust # Bucardo user remote connections host all postgres 192.168.5.121/24 trust host all bucardo 192.168.5.121/24 trust

完成后保存并关闭文件。
现在执行以下 systemctl 命令工具重启 PostgreSQL 服务以使更改生效。
sudo systemctl restart postgresql
至此,PostgreSQL 服务器应通过 ' listen_addresses ' 参数运行在 localhost 与内部 IP 地址上。执行以下命令验证每台服务器上开放的端口。你应该能看到 PostgreSQL 运行在 postgres01 与 postgres02 服务器的内部 IP 地址上。
ss -tulpn | grep postgres

最后,为了验证认证,你可以执行以下命令连接到 PostgreSQL shell。
在 postgres01 服务器上,执行以下命令。成功后,你应该无需任何认证即可登录到 postgres02 服务器的 PostgreSQL shell,因为你位于受信任的主机与用户上。
sudo -u postgres psql
sudo -u postgres psql -U bucardo -h 192.168.5.122
对于 postgres02 服务器,你可以执行以下命令连接到运行在 postgres01 服务器上的 PostgreSQL shell。你将得到类似的结果:无需密码认证即可登录 postgres01 服务器,因为用户与连接来源都是受信任的。
sudo -u postgres psql
sudo -u postgres psql -U bucardo -h 192.168.5.121
至此,你已完成 PostgreSQL 15 服务器的安装,配置了供 Bucardo 使用的数据库与用户,并配置了 PostgreSQL 的 listen_addresses 与认证。
下一步,你将编译并安装 Bucardo,作为一款可用于创建 PostgreSQL 多主复制的应用程序。
安装 Bucardo
Bucardo 是一款用于创建 PostgreSQL 多源与多主复制系统的免费开源应用程序。在本节中,你将从源码手动安装 Bucardo,并且无需在所有节点上都安装 Bucardo。
你只需在 'postgres01' 服务器上安装 Bucardo。因此务必在 postgres01 服务器上执行以下所有命令。
首先,执行以下 apt 命令安装 Bucardo 所需的软件包依赖。提示出现时输入 y 并按 ENTER 继续。
sudo apt install make libdbix-safe-perl libboolean-perl libdbd-mock-perl libdbd-pg-perl libanyevent-dbd-pg-perl libpg-hstore-perl libpgobject-perl libpod-parser-perl libencode-locale-perl

现在通过下面的 wget 命令下载 Bucardo 源码。
wget -q https://bucardo.org/downloads/Bucardo-5.6.0.tar.gz
下载完成后,解压 Bucardo 源码,并将其移动到 Bucardo 工作目录。
tar xf Bucardo-5.6.0.tar.gz
cd Bucardo-*/

现在执行以下命令,将 Bucardo 编译并安装到 postgres01 服务器。
perl Makefile.PL
sudo make install

通过以下命令验证 'bucardo' 应用程序的二进制路径,并验证 Bucardo 的版本。
which bucardo
bucardo --version
' bucardo ' 二进制文件位于 '/usr/local/bin/bucardo',当前安装的版本为 v5.6.0。

Bucardo 安装完成后,接下来你将使用 postgres01 与 postgres02 两台 PostgreSQL 服务器配置 PostgreSQL 多主复制。
使用 Bucardo 配置多主复制
以下命令必须在 postgres01 服务器上执行。
在开始之前,执行以下命令为 Bucardo 创建新的数据与日志目录。
sudo mkdir -p /var/run/bucardo /var/log/bucardo
touch /var/log/bucardo/log.bucardo
执行以下 'bucardo' 命令开始安装。检查到 PostgreSQL 的连接设置,然后输入 P 继续。
bucardo install
Bucardo 安装成功后,你应该会看到类似 ' Installation is now complete '(安装已完成)的输出信息。

执行以下命令定义将被复制的数据库服务器与数据库名。这些信息将被保存为 PostgreSQL 服务器 postgres01 的 ' server1 ',以及 PostgreSQL 服务器 postgres02 的 ' server2 '。
bucardo add database server1 dbname=testdb
bucardo add database server2 dbname=testdb host=192.168.5.122

添加你想要复制的表结构。在本示例中,名为 ' users ' 的表将在各 PostgreSQL 服务器之间进行复制与同步。
bucardo add table public.users db=server1
bucardo add table public.users db=server2

你也可以通过 ' bucardo add all tables ' 命令添加数据库中的所有表。这样,如果 relgroup 尚不存在,还会创建一个 relgroup。
bucardo add all tables --her=testdbSrv1 db=server1
bucardo add all tables --her=testdbSrv2 db=server2

执行以下命令验证可用的 relgroup 列表。
bucardo list relgroup
然后验证 relgroup 列表,你应该会看到类似以下的详细输出。在每个 relgroup 上,你会看到 relgroup 名称,后跟 PostgreSQL 服务器以及已添加到该 relgroup 的可用表。

添加好 relgroup 与表后,你现在将启动两台 PostgreSQL 服务器的同步过程。执行以下命令创建一个新的 sync ' testdbSrv1 ',用于同步 ' server1 ' 与 ' server2 '。另一个 sync 名为 ' testdbSrv2 ',将在 ' server2 ' 与 ' server1 ' 之间进行同步。
bucardo add sync testdbSrv1 relgroup=testdbSrv1 db=server1,server2
bucardo add sync testdbSrv2 relgroup=testdbSrv2 db=server2,server1

现在通过以下命令验证 Bucardo 上的 sync 列表。
bucardo list sync
你将看到 sync ' testdbSrv1 ' 的状态为 ' Active ',同步方向为从源 ' server1 ' 到目标节点 ' server2 '。至于 ' testdbSrv2 ' sync,状态同样为 ' Active ',但同步方向为从源 ' server2 ' 到目标 ' server1 '。

接下来,执行以下命令重启同步过程。成功时你应该会看到 ' Starting Bucardo ' 的输出。
bucardo restart sync

最后,使用以下 ' bucardo ' 命令验证同步状态。
bucardo status
你应该会收到类似这样的输出——sync ' testdbSrv1 ' 与 ' testdbSrv2 ' 的状态均为 ' Good ',这表明同步正在工作,且你的配置是成功的。

至此,你已通过 Bucardo 在 PostgreSQL 上配置了多主复制。接下来,你将通过从两台服务器分别添加新数据来验证多主复制,并验证 PostgreSQL 服务器之间的复制情况。
验证多主复制 PostgreSQL 服务器
配置好 PostgreSQL 多主复制后,这意味着两台 PostgreSQL 会彼此同步,且两台服务器都接受读(READ)与写(WRITE)操作。在本示例中,你将通过向 'test' 数据库插入新数据来验证 PostgreSQL 多主部署。
首先,在 postgres01 服务器上登录 PostgreSQL shell,并连接到 ' testdb ' 数据库。
sudo -u postgres psql
\c testdb
执行以下查询向 'users' 表插入新数据。
INSERT INTO users(id, first_name, last_name, city)
VALUES
(1, 'Alice', 'Wonderland', 'Sweden'),
(2, 'Bob', 'Rista', 'Romania'),
(3, 'John', 'Bonas', 'England');

通过下面的 select 查询验证并检索你的数据。你应该会看到数据已存在。
select count(*) from users;
select * from users;

输入 ' quit ' 退出 PostgreSQL shell。
然后,使用下面的 ' bucardo ' 命令验证 Bucardo 的同步状态。
bucardo status
在 ' Last I/D ' 部分,你将看到 PostgreSQL 服务器之间最后一次数据同步的情况。

现在切换到 postgres02 服务器,进入 PostgreSQL shell,然后连接到 ' testdb ' 数据库。
sudo -u postgres psql
\c testdb
使用以下查询检索 ' users ' 表上可用的数据。你应该会看到数据已存在,且已从 postgres01 服务器复制过来。
select count(*) from users;
select * from users;

接下来,执行以下查询添加另一条数据,并输入 ' quit ' 退出 PostgreSQL shell。
INSERT INTO users(id, first_name, last_name, city)
VALUES
(4, 'Ian', 'Gibson', 'Liverpool'),
(5, 'Tom', 'Riddle', 'Paris'),
(6, 'Jared', 'Dunn', 'New York');
quit

现在回到 postgres01 服务器,运行以下 bucardo 命令验证同步状态。
bucardo status
你应该会看到 ' testdbSrv2 ' 上最后一次同步的序号为 3。你可以在 ' Last I/D' 部分看到这一点。

现在再次登录 PostgreSQL shell,并连接到 'testdb' 数据库。
sudo -u postgres psql
\c testdb
然后验证 ' users ' 表上可用的数据列表。你应该会看到从 postgres02 服务器添加的额外数据。
select count(*) from users;
select * from users;

至此,你已在 Ubuntu 22.04 服务器上通过 Bucardo 配置好了 PostgreSQL 多主复制。
总结
在本教程中,你已在 Ubuntu 22.04 服务器上安装了 PostgreSQL 服务器,并使用两台 PostgreSQL 服务器通过 Bucardo 配置了多主复制。你学习了如何将 PostgreSQL 配置为运行在本地 IP 地址上、为 PostgreSQL 用户配置认证、编译并安装 Bucardo,以及如何使用 Bucardo 配置多主复制。
此外,你通过从 PostgreSQL 服务器插入新数据验证了 PostgreSQL 上的多主复制,确保数据库与表已被复制并同步。
至此,你现在可以向当前环境中添加更多 PostgreSQL 服务器,并且还可以通过第三方应用程序(如 HAPROXY)或使用 pgPool 来管理客户端连接,从而配置负载均衡与故障转移。要了解 PostgreSQL 的详细信息,请访问 PostgreSQL 官方文档。有关 Bucardo,请访问 Bucardo 官方文档。