如何在 Ubuntu 15.04 上使用热备安装和配置 PostgreSQL 复制
本教程适用于这些操作系统版本
- Ubuntu 16.04(Xenial Xerus)
- Ubuntu 15.04(Vivid Vervet)
在此页
- 第 1 步 - 设置主机名
- 第 2 步 - 在主服务器和从服务器上安装 PostgreSQL
- 第 3 步 - 配置主服务器
- 第 4 步 - 从属服务器配置
- 第 5 步 - 将数据从主服务器同步到从服务器
- 第 6 步 - 测试
- 参考资料
PostgreSQL 或 Postgres 是一个开源对象关系数据库管理系统 (ORDBMS),拥有超过 15 年的积极发展。它是一个功能强大的数据库服务器,可以处理高工作负载。 PostgreSQL 可以在 Linux、Unix、BSD 和 Windows 服务器上使用。
主/从数据库复制是将数据从一台服务器(主服务器)上的数据库复制(同步)到另一台服务器(从服务器)上的数据库的过程。这个过程的主要好处是将数据库分布到多台机器上,所以当主服务器出现问题时,有一台具有相同数据的备份机器可以不间断地处理请求。
PostgreSQL 提供了几种复制数据库的方法。它可用于备份目的并提供高可用性数据库服务器。在本教程中,我们将向您展示如何使用热备份模式安装和配置 PostgreSQL 复制。双机热备模式易于配置,是深入学习 PostgreSQL 的一个很好的起点。
双机热备模式需要两台数据库服务器,我们将在两台服务器上使用 Ubuntu 作为操作系统。
- 主服务器 - 接受来自具有读写权限的客户端的连接。
- 从服务器 - 备用服务器以只读权限运行来自主服务器的数据副本。
先决条件
- 2 台 Ubuntu 服务器 - 1 台主服务器,1 台从服务器。
- 服务器的根权限。
- 一些关于 Ubuntu、apt 等的基础知识。
第 1 步 - 设置主机名
使用 ssh 登录到两台服务器:
ssh
现在使用 hostnamectl 命令为两台服务器(主服务器和从服务器)设置主机名。
在主服务器上:
sudo hostnamectl set-hostname master-server
在从服务器上:
sudo hostnamectl set-hostname slave-server
接下来,使用 vim 编辑器编辑 /etc/hosts 文件:
sudo vim /etc/hosts
为主服务器粘贴此配置:
192.168.1.249 master-server
为从服务器粘贴此配置:
192.168.1.248 slave-server
保存文件并退出编辑器。
第 2 步 - 在主从服务器上安装 PostgreSQL
在我们开始安装 PostgreSQL 之前,更新 Ubuntu 存储库:
sudo apt-get update
接下来,安装 PostgreSQL 及其所有依赖项:
sudo apt-get install postgresql postgresql-client postgresql-contrib
安装 Postgres 后,为 postgres 用户提供一个新密码(安装时自动创建)。
passwd postgres
输入您的 postgres 用户密码。
现在测试 PostgreSQL:
su - postgres
psql
\conninfo
您将看到以下结果:

第 3 步 - 配置主服务器
在此步骤中,我们将配置 IP 地址为 192.168.1.249 的主服务器。我们将创建一个具有特殊权限的新用户/角色来执行复制,然后我们编辑 PostgreSQL 配置文件以启用热备份复制模式。
从 root 权限,使用 su 命令切换到 PostgreSQL 用户:
su - postgres
使用 psql 命令访问 Postgres shell 并输入此 PostgreSQL 查询以创建新用户/角色:
psql
CREATE USER replica REPLICATION LOGIN ENCRYPTED PASSWORD '';
使用以下 PostgreSQL 命令检查新的副本用户:
\du
已创建新的副本用户。

接下来进入PostgreSQL目录/etc/postgresql/9.4/main编辑配置文件。
cd /etc/postgresql/9.4/main/
用 vim 打开 postgresql.conf 文件:
vim postgresql.conf
取消注释第 59 行并添加服务器 IP 地址。
listen_addresses = 'localhost,192.168.1.249'
在 WAL(Write Ahead Log)设置第 175 行,取消注释并将值更改为 hot_standby。
wal_level = hot_standby
在检查点部分第 199 行中,取消注释 checkpoint_segments 并将值更改为 8。
checkpoint_segments = 8
在归档部分第 206 和 208 行中,打开归档选项并添加归档命令。
archive_mode = on
archive_command = 'cp -i %p /var/lib/postgresql/9.4/main/archive/%f'
在复制部分第 224 和 226 行中,将值更改为 WAL 发送进程的最大数量。
max_wal_senders = 3
wal_keep_segments = 8
保存文件并退出 vim。
现在在主目录中为存档配置创建一个新目录 - 以 postgres 用户身份运行以下命令:
mkdir -p /var/lib/9.4/main/archive/
接下来,编辑 pg_hba.conf 文件以允许复制连接。
vim pg_hba.conf
在该行的末尾,为用户副本添加一个新配置以建立连接。
host replication replica 192.168.1.248/24 md5
#192.168.1.248 is slave-server ip address
保存并退出。
第 4 步 - 从属服务器配置
像主服务器一样配置从服务器。使用 su 成为 postgres 用户并转到 PostgreSQL 配置目录。
su - postgres
cd /etc/postgresql/9.4/main/
使用 vim 编辑 postgresql.conf:
vim postgresql.conf
取消注释第 59 行并添加从属服务器 IP 地址。
listen_addresses = 'localhost,192.168.1.248'
转到第 175 行并取消 wal_level 设置的注释,将值更改为 hot_standby。
wal_level = hot_standby
取消注释检查点部分的第 199 行。
checkpoint_segments = 8
取消注释行 224 和 226 以配置 max_wal_sender 进程。
max_wal_senders = 3
wal_keep_segments = 8
取消注释行 245 以在从属服务器上启用 hot_standby 模式。
hot_standby = on
保存并退出。
第 5 步 - 将数据从主服务器同步到从服务器
在这一步中,我们将 PostgreSQL 数据目录 /var/lib/postgresql/9.4/main 移动到一个备份文件夹,然后使用 pg_basebackup 命令将其替换为最新的主数据。
仅在从服务器上运行以下所有命令!
在从服务器上停止 PostgreSQL:
systemctl stop postgresql
现在登录到 postgres 用户并将主目录重命名为 main_original 作为备份。
su - postgres
mv 9.4/main 9.4/main_original
运行以下命令将数据从主服务器复制到从服务器:
pg_basebackup -h 192.168.1.249 -D /var/lib/postgresql/9.4/main -U replica -v -P

笔记:
- 192.168.1.249 是主服务器 IP 地址。
- 系统将提示您输入复制用户副本的密码。
转到新的主目录并使用 vim 创建新的恢复文件 recovery.conf:
cd /var/lib/postgresql/9.4/main/
vim recovery.conf
粘贴下面的配置:
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.249 port=5432 user=replica '
restore_command = 'cp //var/lib/postgresql/9.4/main/archive/%f %p'
trigger_file = '/tmp/postgresql.trigger.5432'
现在使用 exit 返回到 root 用户并使用 systemctl 命令启动 PostgreSQL:
exit
systemctl start postgresql
运行启动命令后确保没有错误。
第 6 步 - 测试
转到主服务器并登录到 postgres 用户,然后运行以下命令以查看复制信息。
su - postgres
psql -x -c "select * from pg_stat_replication;"
您将在下面看到复制信息:

接下来,测试从主服务器创建一个新的数据库,然后检查该数据库是否存在于从服务器上。
su - postgres
psql
create database howtoforge;

现在登录从服务器,查看howtoforge数据库是否已经自动镜像到从服务器。
su - postgres
psql
\list

数据库已从主服务器复制到从服务器。
参考
- <李>
- https://cloud.google.com/solutions/setup-postgres-hot-standby