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