作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分接受捐款。
介绍
流式复制是一种流行的方法,你可以用来横向扩展你的关系数据库。它使用两个或多个相同的数据库集群在单独的机器上运行的副本。 一个数据库集群被称为主,并服务于读写操作; 其他,被称为复制,只服务于读操作。 您也可以使用流式复制提供系统的高可用性。 如果主数据库集群或服务器意外失败,复制件可以继续服务于读操作,或者(复制件之一)成为新的主集群。
PostgreSQL是一个广泛使用的 关系数据库支持逻辑和物理复制。 Logical replication 流从主要数据库集群到复制数据库的高级别的更改。 使用逻辑复制,您可以流到数据库中的单个数据库或表的更改。 然而,在 physical replication 中,对 WAL (Write-Ahead-Logging)日志文件的更改被流和复制到复制数据库集群中。 因此,您无法复制主要数据库集群的特定区域,但相反,所有对主要的更改都被复制。
在本教程中,您将使用 Ubuntu 20.04 使用两个独立的机器运行两个独立的 PostgreSQL 12 集群来设置 PostgreSQL 12 的物理流式复制。
前提条件
要完成本教程,您将需要以下内容:
两个独立的机器Ubuntu 20.04机器;一个被称为 ** primary**,另一个被称为 ** replica**. 您可以使用我们的 初始服务器设置指南设置这些,包括具有 sudo权限和防火墙的非根用户。
您的防火墙配置为允许 HTTP/HTTPS 和在端口上的流量
5432
- PostgreSQL 12 使用的默认端口。 您可以遵循 如何在 Ubuntu 20.04 上设置与 ufw 的防火墙 来配置这些防火墙设置PostgreSQL 12 运行在 Ubuntu 20.04 服务器上。 遵循 如何在 Ubuntu 20.04 上安装和使用 PostgreSQL 教程的 步骤 1 涵盖在 Ubuntu 20.04. 上安装和基本使用 PostgreSQL
步骤 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是否已连接到 primary和 primary正在流媒体中,请运行连接到 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)以获取更多教程和内容。