如何在 Ubuntu 20.04 上使用 PostgreSQL 12 设置物理流复制

作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。

介绍

流式复制是一种流行的方法,你可以用来横向扩展你的关系数据库。它使用两个或多个相同的数据库集群在单独的机器上运行的副本。 一个数据库集群被称为主,并服务于读写操作; 其他,被称为复制,只服务于读操作。 您也可以使用流式复制提供系统的高可用性。 如果主数据库集群或服务器意外失败,复制件可以继续服务于读操作,或者(复制件之一)成为新的主集群。

PostgreSQL是一个广泛使用的 关系数据库支持逻辑和物理复制。 Logical replication 流从主要数据库集群到复制数据库的高级别的更改。 使用逻辑复制,您可以流到数据库中的单个数据库或表的更改。 然而,在 physical replication 中,对 WAL (Write-Ahead-Logging)日志文件的更改被流和复制到复制数据库集群中。 因此,您无法复制主要数据库集群的特定区域,但相反,所有对主要的更改都被复制。

在本教程中,您将使用 Ubuntu 20.04 使用两个独立的机器运行两个独立的 PostgreSQL 12 集群来设置 PostgreSQL 12 的物理流式复制。

前提条件

要完成本教程,您将需要以下内容:

步骤 1 — 配置主数据库以接受连接

在此第一步中,您将配置 ** primary** 数据库以允许您的 ** replica** 数据库(s)连接. 默认情况下,PostgreSQL 只会听取连接的 localhost(127.0.0.1)。

在您的主服务器上,打开 PostgreSQL 配置文件 postgresql.conf,位于 /etc/postgresql/12/main/ 目录中:

1sudo nano /etc/postgresql/12/main/postgresql.conf

一旦文件被打开,查找listen_addresses变量,并将值从localhost更改为您的 主要服务器的IP地址,您还需要从行开始删除#字符如下:

1[label /etc/postgresql/12/main/postgresql.conf]
2. . .
3listen_addresses = 'your_primary_IP_address'
4. . .

保存和退出文件。

一旦完成,您的 ** primary** 数据库将准备接受您输入的 IP 地址上的其他机器的连接,然后您将创建具有适当权限的角色,以便 ** replica** 连接到 ** primary**。

步骤 2 — 使用复制权限创建特殊角色

现在,您需要在 ** primary** 数据库中创建具有复制数据库权限的角色。您的 ** replica** 在连接到 ** primary** 时会使用这个角色。

首先,以以下命令作为postgres用户连接到数据库集群:

1sudo -u postgres psql

要创建一个角色,您需要在集群上运行CREATE ROLE命令如下:

1CREATE ROLE test WITH REPLICATION PASSWORD 'testpassword' LOGIN;

您将收到以下输出:

1[secondary_label Output]
2CREATE ROLE

此命令创建一个名为test的角色,并使用密码testpassword,该角色具有复制数据库集群的权限。

PostgreSQL 有一個特殊的複製假資料庫,其中 replica 連接,但你必須先編輯 /etc/postgresql/12/main/pg_hba.conf 配置檔案,以便你的 replica 可以存取它。

1\q

现在你回到终端命令提示,打开 /etc/postgresql/12/main/pg_hba.conf 配置文件使用 nano:

1sudo nano /etc/postgresql/12/main/pg_hba.conf

将下列行附加到 pg_hba.conf 文件的末尾:

1[label /etc/postgresql/12/main/pg_hba.conf]
2. . .
3host replication test your-replica-IP/32 md5

这确保您的 ** primary** 允许您的 ** replica** 使用您之前创建的角色, test 连接到复制假数据库。 host 值意味着通过简单或 SSL 加密的 TCP/IP 接口接受非本地连接。 replica 是 PostgreSQL 用于复制的特殊假数据库的名称。 最后,值 md5 是使用的身份验证类型。 如果您想要有一个以上的 ** replica**,只需在文件末尾再添加相同的行,以您的其他 ** replica** 的 IP 地址。

要确保对配置文件的这些更改实现,您需要使用以下方式重新启动 ** primary**集群:

1sudo systemctl restart postgresql@12-main

如果您的 ** 原始集群成功重新启动,它将正确设置,并在您的 ** 复制品连接后开始播放。

步骤 3 – 在复制件上备份主要集群

當您在本教程中設定物理複製使用 PostgreSQL 時,您需要將 primary群集資料檔案的物理備份執行到 replica的資料目錄中。 要做到這一點,您將首先清除 replica的資料目錄中的所有檔案。 Ubuntu 上 PostgreSQL 的默認資料目錄是 /var/lib/postgresql/12/main/

您也可以通过在 replica 数据库上运行以下命令来查找 PostgreSQL 的数据目录:

1[environment second]
2SHOW data_directory;

一旦您有数据目录的位置,运行以下命令删除所有内容:

1[environment second]
2sudo -u postgres rm -r /var/lib/postgresql/12/main/*

由于目录中的文件的默认所有者是 postgres用户,您将需要使用sudo -u postgres将命令运行为postgres

<$>[注] 注: 如果在极为罕见的情况下,目录中的一个文件被破坏,并且命令不起作用,请将主要目录全部删除,并以相应的权限重新创建,如下:

1[environment second]
2sudo -u postgres rm -r /var/lib/postgresql/12/main
3sudo -u postgres mkdir /var/lib/postgresql/12/main
4sudo -u postgres chmod 700 /var/lib/postgresql/12/main

美元

现在,复制的数据目录是空的,你可以对主要的数据文件进行物理备份。PostgreSQL方便地具有pg_basebackup的实用程序,这简化了过程,甚至允许你使用-R选项将服务器放入备用模式。

replica上执行 pg_basebackup 命令如下:

1[environment second]
2sudo -u postgres pg_basebackup -h primary-ip-addr -p 5432 -U test -D /var/lib/postgresql/12/main/ -Fp -Xs -R
  • 联合国 " h " 选项指定了非当地东道方。 在这里,您需要输入您的服务器的 IP 地址 。 ( )* `-p'选项指定它连接在服务器上的端口号码。 默认情况下,PostgreSQL使用":5432".
  • -U' 选项允许您指定您连接到 ** prime ** 组的用户为 。 这是您在前一步中创建的角色 。 ( _) ( )* " D " 旗是备份的输出目录。 这是您的**replica的**数据目录, 您刚刚空出 。 (_) ( )* -Fp'指定了以平面格式而不是以tar'文件输出的数据。 (_) ( )* -Xs' 将WAL日志的内容作为主要的备份来进行。
  • 终于, -R'在**replica'**数据目录中创建一个名为standby.signal'的空文件。 此文件允许您的 ** replica ** 集群知道它应该作为备用服务器运行 。 -R ' 选项还将**主要**服务器的连接信息添加到postgresql.auto.conf'文件中。 这是一个特殊配置文件,每当读取正则的"postgresql.conf"文件时都会被读取,但".auto"文件中的值超过了正则配置文件中的值. (_) (英语)

pg_basebackup命令连接到 ** primary**时,您将被要求输入您在上一步创建的角色的密码。

您的 replika 现在将拥有从 replika 开始复制所需的所有数据文件,然后将 replika 放入备用模式并开始复制。

步骤 4 – 重新启动和测试集群

现在, ** primary群集中的数据文件已成功备份到 ** replica中,下一步是重新启动 ** replica**数据库群集以将其放入待机模式。

1[environment second]
2sudo systemctl restart postgresql@12-main

如果您的 replica集群在待机模式中成功重新启动,则该集群应该已经连接到您另一台机器的 primary数据库集群. 若要检查 replica是否已连接到 primaryprimary正在流媒体中,请运行连接到 primary数据库集群:

1sudo -u postgres psql

现在请查询 ** primary** 数据库集群上的 pg_stat_replication 表如下:

1SELECT client_addr, state FROM pg_stat_replication;

在 ** 主要** 集群上运行此查询将产生类似于以下的结果:

1[secondary_label Output]
2   client_addr    |  state
3------------------+-----------
4 your_replica_IP | streaming

如果你有类似的输出,那么 ** primary** 正在正确地流到 ** replica**。

结论

您现在有两个Ubuntu 20.04服务器,每个都有一个PostgreSQL 12数据库集群,在它们之间进行物理流。

如果您的数据库需要处理更多流量,您还可以将更多复制件添加到设置中。

如果您想了解更多关于物理流式复制的信息,包括如何设置同步复制以确保任何关键任务数据丢失的机会为零,您可以阅读官方PostgreSQL docs的条目。

您可以查看我们的 PostgreSQL 主题页面(https://andsky.com/tags/postgresql)以获取更多教程和内容。

Published At
Categories with 技术
comments powered by Disqus