如何在Ubuntu12.04VPS上的PostgreSQL上设置主从复制

来自菜鸟教程
跳转至:导航、​搜索

状态: 已弃用

本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:

原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.

请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。


介绍


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”。

通过键入以下内容将密钥传输到其他服务器:

ssh-copy-id IP_address_of_opposite_server

您现在应该能够以 postgres 用户的身份在两台服务器之间自由 ssh。

配置主服务器


我们将从配置我们的主服务器开始。 所有这些命令都应该使用 postgres 用户执行。

首先,我们将创建一个名为“rep”的用户,该用户仅可用于复制:

psql -c“创建用户代表复制登录连接限制1加密密码'你的密码';”

将密码更改为您想要使用的任何密码。

接下来,我们将移动到 postgres 配置目录:

cd /etc/postgresql/9.1/main

我们将使用我们刚刚创建的用户修改访问文件:

nano pg_hba.conf

在文件底部的 not 的任意位置,添加一行以让新用户访问此服务器:

主机复制代表IP_address_of_slave /32 md5

保存并关闭文件。

接下来,我们将打开主要的 postgres 配置文件:

nano postgresql.conf

找到这些参数。 如果它们被注释,请取消注释它们,并根据我们在下面列出的内容修改值:

 listen_addresses = 'localhost, IP_address_of_THIS_host ' wal_level = 'hot_standby' archive_mode = on archive_command = 'cd '  max_wal_senders = 1 hot_standby = on

保存并关闭文件。

重新启动主服务器以实施您的更改:

service postgresql restart

配置从服务器


通过关闭 postgres 数据库软件在从服务器上开始:

service postgresql stop

我们将对 postgres 文件进行一些类似的配置更改,因此更改到配置目录:

cd /etc/postgresql/9.1/main

调整访问文件以允许其他服务器连接到此。 这是为了以防我们以后需要将奴隶变成主人。

nano pg_hba.conf

同样,将此行添加到文件末尾的某个位置:

主机复制代表IP_address_of_master /32 md5

保存并关闭文件。

接下来,打开 postgres 配置文件:

nano postgresql.conf

您可以使用为主服务器设置的相同配置选项,仅修改 IP 地址以反映从服务器的地址:

 listen_addresses = 'localhost, IP_address_of_THIS_host ' wal_level = 'hot_standby' archive_mode = on archive_command = 'cd '  max_wal_senders = 1 hot_standby = on

保存并关闭文件。

复制初始数据库:


在slave可以复制master之前,我们需要给它一个初始数据库来构建。 这是因为它从主服务器读取日志并将更改应用到自己的数据库。 我们需要该数据库来匹配主数据库。

在主服务器上,我们可以使用内部 postgres 备份启动命令来创建备份标签命令。 然后我们将数据库数据传输到我们的从站,然后发出内部备份停止命令进行清理:

 psql -c “选择 pg_start_backup('initial_backup');”  rsync -cva --inplace --exclude=  pg_xlog  /var/lib/postgresql/9.1/main/ slave_IP_address :/var/lib/postgresql/9.1/main/ psql -c “select pg_stop_backup();”

rsync 命令在修改证书文件时可能有错误,但这对我们来说是可以使用的。 主站的数据现在应该在从站上。

我们现在必须在我们的奴隶上配置一个恢复文件。 在从站上导航到数据目录:

cd /var/lib/postgresql/9.1/main

在这里,我们需要创建一个名为 recovery.conf 的恢复文件:

nano recovery.conf

填写以下信息。 确保更改您的主服务器的 IP 地址和您创建的 rep 用户的密码:

待机模式 = 'on' primary_conninfo = 'host= master_IP_address port=5432 user=rep password= yourpassword ' trigger_file = '/tmp/postgresql.trigger.5432'

文件中的最后一行 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 服务器。 如果您有一个将写入和查询数据库的应用程序,您可以设置一个负载平衡方案以始终写入主服务器,但在主服务器和从服务器之间拆分读取。 这可以提高数据库交互的性能。

贾斯汀·艾林伍德