如何在 Ubuntu 22.04 上设置多主 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
输出“防火墙处于活动状态并在系统启动时启用”确认 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
输出“活动(正在运行)”确认 PostgreSQL 服务器正在运行。输出“enabled”确认 PostgreSQL 将在系统启动时自动运行。
最后,您还需要安装 Bucardo 软件需要的 PostgreSQL 扩展“plperl”。输入以下“apt install”命令来安装“plperl”扩展。
sudo apt install postgresql-plperl-15
安装应该会自动开始。
至此,您现在已经在两台 Ubuntu 22.04 服务器上安装了 PostgreSQL 15,并且还安装了 Bucardo 将使用的 PostgreSQL 扩展“plperl”。在下一步中,您将设置 Bucardo 将使用的 PostgreSQL 用户和数据库,并设置将用于复制测试的数据库测试。
设置数据库和用户
在本部分中,您将创建用于 Bucardo 安装的新数据库和用户。您还将使用用于测试 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”参数运行内部 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 的监听地址和身份验证。
在下一步中,您将编译并安装 Bucardo 作为一个应用程序,该应用程序允许您创建多主 PostgreSQL 复制。
安装布卡多
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 。
安装 Bucaro 后,接下来您将使用两个 PostgreSQL 服务器 postgres01 和 postgres02 设置 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 安装成功后,您应该会收到一条输出消息,例如“安装现已完成”。
输入以下命令来定义要复制的数据库服务器和数据库名称。该信息将存储为 PostgreSQL 服务器 ppstgres01 的“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 添加所有表”命令添加数据库中的所有表。这样,您还将创建一个 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 服务器的同步过程。输入以下命令创建新的同步“testdbSrv1”,它将同步“server1”和“server2”。同步称为“testdbSrv2”,它将在“server2”和“server1”之间同步。
bucardo add sync testdbSrv1 relgroup=testdbSrv1 db=server1,server2
bucardo add sync testdbSrv2 relgroup=testdbSrv2 db=server2,server1
现在,通过输入以下命令来验证布卡多上的同步列表。
bucardo list sync
您将看到状态为“活动”的同步“testdbSrv1”,并且同步来自作为源的“server1”和“server2' 作为目标节点。对于“testdbSrv2”同步,状态也是“Active”,但同步是从“server2”作为源进行的目标“server1”。
接下来,输入以下命令以重新启动同步过程。成功后,您应该会看到输出“Starting Bucardo”。
bucardo restart sync
最后,使用以下“bucardo”命令验证同步状态。
bucardo status
您应该收到与此类似的输出 - 状态“Good”上的同步“testdbSrv1”和“testdbSrv2”,确认同步正在运行并且您的配置成功。
至此,您已经通过 Bucardo 在 PostgreSQL 上配置了多主复制。接下来,您将通过从两台服务器添加新数据来验证多主复制,并验证 PostgreSQL 服务器之间的复制。
验证多主复制 PostgreSQL 服务器
配置 PostgreSQL Multi-Master 后,这意味着两个 PostgreSQL 将相互同步,并且机器人服务器接受读取和写入操作。在此示例中,您将通过将新数据插入数据库“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 count(*) from users;
select * from users;
输入“quit”退出 PostgreSQL shell。
然后,使用下面的“bucardo”命令验证 Bucardo 同步状态。
bucardo status
在“最后 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。您可以在“最后一个 I/D” 部分看到这一点。
现在再次登录 PostgreSQL shell 并连接到数据库“testdb”。
sudo -u postgres psql
\c testdb
然后验证表“用户”上的可用数据列表。您应该会看到从 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 官方文档。