如何在 Ubuntu 12.04 VPS 上的 PostgreSQL 上设置主从复制
状态:已弃用
本文涵盖不再受支持的 Ubuntu 版本。如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
- 升级到 Ubuntu 14.04。
- 从 Ubuntu 14.04 升级到 Ubuntu 16.04
- 将服务器数据迁移到支持的版本
原因:
请参阅:
介绍
PostreSQL 或 postgres 是一种流行的数据库管理系统,可以组织和管理与网站或应用程序相关的数据。复制是一种将数据库信息复制到第二个系统以创建高可用性和冗余的方法。
有很多方法可以在 postgres 系统上设置复制。在本教程中,我们将介绍如何使用热备份配置复制,其优点是配置相对简单。
为此,我们需要两个 Ubuntu 12.04 VPS 实例。一个将作为主数据库服务器,另一个将充当从服务器,后者将进行复制。
安装 PostgreSQL 软件
本节中的步骤应在主服务器和从服务器上执行。
postgres 软件在 Ubuntu 的默认存储库中可用。使用这些命令安装适当的包。
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib postgresql-client
PostgreSQL 创建一个名为 \postgres 的用户来处理其初始数据库。我们将在我们的服务器之间配置 ssh 访问,以便更轻松地传输文件。
我们需要为 postgres 用户设置密码,以便我们可以最初传输密钥文件。如果需要,您可以稍后删除密码:
sudo passwd postgres
像这样切换到 postgres 用户:
sudo su - postgres
为 postgres 用户生成一个 ssh 密钥:
ssh-keygen
对随后的所有提示按 \ENTER。
通过键入以下内容将密钥传输到其他服务器:
<前>
您现在应该能够以 postgres 用户的身份在两台服务器之间自由 ssh。
配置主服务器
我们将从配置主服务器开始。所有这些命令都应使用 postgres 用户执行。
首先,我们将创建一个名为 \rep 的用户,它只能用于复制:
<前>
将密码更改为您想要使用的任何内容。
接下来,我们将移动到 postgres 配置目录:
cd /etc/postgresql/9.1/main
我们将使用刚刚创建的用户修改访问文件:
nano pg_hba.conf
在文件底部以外的任何地方,添加一行以让新用户访问此服务器:
<前>
保存并关闭文件。
接下来,我们将打开主 postgres 配置文件:
nano postgresql.conf
找到这些参数。如果它们被注释,请取消注释,并根据我们在下面列出的内容修改值:
<前>
保存并关闭文件。
重新启动主服务器以实施您的更改:
service postgresql restart
配置从服务器
通过关闭 postgres 数据库软件在从属服务器上开始:
service postgresql stop
我们将对 postgres 文件进行一些类似的配置更改,因此更改到配置目录:
cd /etc/postgresql/9.1/main
调整访问文件以允许其他服务器连接到此。这是为了以防我们需要在以后将奴隶变成主人。
nano pg_hba.conf
同样,将此行添加到文件末尾以外的某个位置:
<前>
保存并关闭文件。
接下来,打开 postgres 配置文件:
nano postgresql.conf
您可以使用为主服务器设置的相同配置选项,仅修改 IP 地址以反映从服务器的地址:
<前>
保存并关闭文件。
复制初始数据库:
在 slave 可以复制 master 之前,我们需要给它一个初始数据库来构建。这是因为它从主服务器读取日志并将更改应用到它自己的数据库。我们需要那个数据库来匹配 master 数据库。
在主服务器上,我们可以使用内部的 postgres 备份启动命令来创建备份标签命令。然后我们将数据库数据传输到我们的从站,然后发出一个内部备份停止命令来清理:
<前>
rsync 命令可能在修改证书文件时出错,但这对我们的使用来说是没问题的。 master 的数据现在应该在 slave 上了。
我们现在必须在我们的奴隶上配置一个恢复文件。在奴隶导航到数据目录:
cd /var/lib/postgresql/9.1/main
在这里,我们需要创建一个名为 recovery.conf
的恢复文件:
nano recovery.conf
填写以下信息。确保更改主服务器的 IP 地址和您创建的 rep
用户的密码:
<前>
文件的最后一行 trigger_file
是整个配置中最有趣的部分之一。如果您在从机上的那个位置创建一个文件,您的从机将重新配置自己以充当主机。
这将破坏您当前的复制,特别是如果主服务器仍在运行,但如果您的主服务器出现故障,您将需要这样做。这将允许从站开始接受写入。然后您可以修复主服务器并将其变成从属服务器。
您现在应该已经准备好启动您的从服务器。类型:
service postgresql start
您需要检查日志以查看是否有任何问题。它们位于两台机器上:
less /var/log/postgresql/postgresql-9.1-main.log
您应该看到它已成功连接到主服务器。
测试复制
我们将通过在主服务器上进行一些更改然后查询从属服务器来亲眼看到我们的服务器是否正确复制。
在主服务器上,作为 postgres 用户,通过键入以下内容登录到 postgres 系统:
psql
您的提示将更改为表明您现在正在与数据库软件通信。
我们将创建一个测试表来创建一些更改:
CREATE TABLE rep_test (test varchar(40));
现在,我们可以使用以下命令将一些值插入表中:
INSERT INTO rep_test VALUES ('data one');
INSERT INTO rep_test VALUES ('some more words');
INSERT INTO rep_test VALUES ('lalala');
INSERT INTO rep_test VALUES ('hello there');
INSERT INTO rep_test VALUES ('blahblah');
您现在可以通过键入以下内容退出此界面:
\q
现在,在slave上,以同样的方式进入数据库界面:
psql
现在,我们可以查看我们在主数据库中输入的数据是否已复制到从数据库中:
SELECT * FROM rep_test;
test
-----------------
data one
some more words
lalala
hello there
blahblah
(5 rows)
出色的!我们的数据已经写入了主从服务器。
让我们看看我们是否可以将更多数据插入到我们的奴隶的表中:
INSERT INTO rep_test VALUES ('oops');
ERROR: cannot execute INSERT in a read-only transaction
如您所见,我们无法将数据插入从站。这是因为数据仅在一个方向上传输。为了保持数据库的一致性,postgres 必须使从数据库只读。
结论
您现在应该有一个配置为有效通信的主从 PostgreSQL 服务器。如果您有一个将写入和查询数据库的应用程序,您可以设置一个负载平衡方案以始终写入主服务器,但在主服务器和从服务器之间拆分读取。这可以提高数据库交互的性能。