如何在Ubuntu 12.04 VPS上的PostgreSQL上设置主从复制

PostgreSQL或postgres是一种流行的数据库管理系统,通常用于管理来自网站和应用程序的信息。在本指南中,我们将配置一个主服务器postgres复制设置,这将允许我们复制ch

介绍


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 "CREATE USER rep REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD 'yourpassword';"

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

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

cd /etc/postgresql/9.1/main

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

nano pg_hba.conf

在任何地点不是在文件的底部,添加一行,让新用户可以访问该服务器:

host    replication     rep     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

调整访问文件以允许其他服务器连接到此。 这是在我们需要把Minion变成主人后来在路上的情况下。

nano pg_hba.conf

再次,将此行添加到不在文件末尾的地方:

host    replication     rep     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

保存并关闭文件。

复制初始数据库:


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

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

psql -c "select 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您创建的用户:

standby_mode = '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

现在,我们可以看到我们在master数据库中输入的数据是否已经复制到slave上:

SELECT * FROM rep_test;

      test       
-----------------
 data one
 some more words
 lalala
 hello there
 blahblah
(5 rows)

优秀! 我们的数据已写入主服务器和从服务器。

让我们看看我们是否可以在我们的slave上的表中插入更多的数据:

INSERT INTO rep_test VALUES ('oops');

ERROR:  cannot execute INSERT in a read-only transaction

正如您所看到的,我们无法将数据插入从站。 这是因为数据仅在一个方向上传输。 为了保持数据库的一致性,postgres必须使slave成为只读。

结论


您现在应该有一个主和从PostgreSQL服务器配置为有效地通信。 如果有一个应用程序将写入和查询数据库,您可以设置负载平衡方案始终写入主机,但在主机和从机之间分割读取。 这可以提高数据库交互的性能。

作者:Justin Ellingwood