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

金钱(警告)

** 状态:** 被贬值

如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:

** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。

** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。

介绍


PostreSQL,或postgres,是一个流行的数据库管理系统,可以组织和管理与网站或应用程序相关的数据。

在本教程中,我们将涵盖如何使用热待机配置复制,这具有相对简单的配置的优点。

要做到这一点,我们需要两个Ubuntu 12.04 VPS实例,一个将作为主数据库服务器,另一个将作为一个奴隶,它将复制。

安装 PostgreSQL 软件


本节中的步骤应在主和奴隶服务器上执行。

postgres 软件在 Ubuntu 的默认存储库中可用. 使用这些命令安装相应的包。

1sudo apt-get update
2sudo apt-get install postgresql postgresql-contrib postgresql-client

PostgreSQL创建了一个名为postgres的用户,以便处理其初始数据库。

我们将需要为postgres用户设置密码,以便我们可以首先传输关键文件. 如果您愿意,您可以稍后删除密码:

1sudo passwd postgres

转到 postgres 用户如下:

1sudo su - postgres

為 postgres 使用者生成 ssh 鍵:

1ssh-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配置目录:

1cd /etc/postgresql/9.1/main

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

1nano pg_hba.conf

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

host replication rep     IP_address_of_slave/32 md5

保存并关闭文件。

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

1nano 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

保存并关闭文件。

重新启动主服务器以实现更改:

1service postgresql restart

配置奴隶服务器


在奴隶服务器上开始关闭postgres数据库软件:

1service postgresql stop

我们将对postgres文件做一些类似的配置更改,所以更改到配置目录:

1cd /etc/postgresql/9.1/main

调整访问文件,以允许其他服务器连接到这个。

1nano pg_hba.conf

再次,添加这个行在某个地方,而不是文件的末尾:

host replication rep     IP_address_of_master/32 md5

保存并关闭文件。

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

1nano 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

保存并关闭文件。

复制初始数据库:


在奴隶能够复制主人之前,我们需要给它构建的初始数据库,这是因为它读取主服务器的日志,并将更改应用到自己的数据库。

在主服务器上,我们可以使用内部postgres备份开始命令创建备份标签命令,然后将数据库数据传输给我们的奴隶,然后发出内部备份停止命令来清理:

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 命令可能在修改证书文件时出现了错误,但这对我们的使用是好的。

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

1cd /var/lib/postgresql/9.1/main

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

1nano 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’,是整个配置中最有趣的部分之一. 如果你在你的奴隶机器上在那个位置创建一个文件,你的奴隶会重新配置自己作为一个主人。

这会破坏当前的复制,特别是如果主服务器仍在运行,但如果主服务器崩溃,您需要做的事情。

您现在应该有部件的位置来启动你的奴隶服务器。

1service postgresql start

你想检查日志,看看是否有任何问题. 它们位于这两个机器上:

1less /var/log/postgresql/postgresql-9.1-main.log

您应该看到它正在成功连接到主服务器。

测试复制


我们将从第一手看到我们的服务器是否正确地复制,通过对主服务器进行一些更改,然后查询奴隶。

在主服务器上,作为postgres用户,通过键入登录postgres系统:

1psql

您的提示将更改,表示您现在正在与数据库软件进行通信。

我们将创建一个测试表来创建一些更改:

1CREATE TABLE rep_test (test varchar(40));

现在,我们可以使用以下命令将一些值插入表中:

1INSERT INTO rep_test VALUES ('data one');
2INSERT INTO rep_test VALUES ('some more words');
3INSERT INTO rep_test VALUES ('lalala');
4INSERT INTO rep_test VALUES ('hello there');
5INSERT INTO rep_test VALUES ('blahblah');

您现在可以通过键入离开这个界面:

1\q

现在,在奴隶上,以相同的方式输入数据库界面:

1psql

现在,我们可以看到我们在主数据库中输入的数据是否已在奴隶上复制:

1SELECT * FROM rep_test;

1test       
2-----------------
3 data one
4 some more words
5 lalala
6 hello there
7 blahblah
8(5 rows)

我们的数据已被写到主和奴隶服务器。

让我们看看我们是否可以将更多数据插入我们的奴隶表中:

1INSERT INTO rep_test VALUES ('oops');

1ERROR:  cannot execute INSERT in a read-only transaction

正如你所看到的,我们无法将数据插入到奴隶中,这是因为数据只向一个方向传输,以保持数据库的一致性,后者必须使奴隶只读。

结论


你现在应该有一个主和奴隶 PostgreSQL 服务器配置,以便有效地通信. 如果你有一个应用程序,将写入和查询数据库,你可以设置一个负载平衡方案,总是写给主,但在主和奴隶之间分割读取。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus