在 CentOS 6.9 上进行 PostgreSQL 12 离线安装的步骤
一、在 CentOS 6.9 离线安装 PostgreSQL 12 所需的依赖软件包
需要在 CentOS 6.9 离线安装 PostgreSQL 12 所需的依赖软件包,可以按照以下步骤操作:
- 在具有 Internet 连接的计算机上,使用以下命令下载所有依赖软件包及其依赖项:
yum install --downloadonly --downloaddir=<下载目录> openssl-devel readline-devel zlib-devel libicu-devel
注意:<下载目录>
是你想要下载软件包的目录路径。
或者可以找到系统安装的ISO镜像找到rpm安装包。
- 将下载的软件包传输到目标 CentOS 6.9 计算机,可以使用 USB 或其他可移动存储设备,或使用 scp 命令将软件包上传到目标服务器。
- 在目标 CentOS 6.9 计算机上,使用以下命令安装这些离线软件包:
rpm -Uvh <软件包名称>.rpm
注意:<软件包名称>
是你下载的每个 RPM 软件包的名称,例如 openssl-devel-1.0.x-x.el6.x86_64.rpm
。
二、安装完依赖软件包后, PostgreSQL 12 的离线安装
注意:为了确保所有依赖关系都得到满足,请务必按照正确的顺序安装依赖软件包,并检查每个软件包的依赖项。
- 下载二进制包:从 PostgreSQL 官方网站 https://www.postgresql.org/download/linux/redhat/ 下载适用于 CentOS 6.9 的 PostgreSQL 12 二进制包。你需要下载4个二进制包,分别是
postgresql12-12.14-1PGDG.rhel6.x86_64.rpm
、postgresql12-libs-12.x-x.rhel6.x86_64.rpm
、postgresql12-server-12.x-x.rhel6.x86_64.rpm
和postgresql12-contrib-12.x-x.rhel6.x86_64.rpm
。 - 安装依赖软件包:PostgreSQL 12 需要安装一些依赖的软件包,例如 libpq.so.5、libicui18n.so.42 等。你可以使用以下命令安装这些软件包:
yum install -y openssl-devel readline-devel zlib-devel libicu-devel
- 解压并安装二进制包:通过以下命令解压下载的二进制包,并将其安装到 /usr/local/pgsql 目录下:
mkdir -p /usr/local/pgsql/data
rpm -ivh postgresql12-libs-12.x-x.rhel6.x86_64.rpm
rpm -ivh postgresql12-12.14-1PGDG.rhel6.x86_64.rpm
rpm -ivh postgresql12-server-12.x-x.rhel6.x86_64.rpm
rpm -ivh postgresql12-contrib-12.x-x.rhel6.x86_64.rpm
- 初始化数据库:使用以下命令初始化一个空的 PostgreSQL 数据库实例:
service postgresql-12 initdb
chkconfig postgresql-12 on
- 启动 PostgreSQL:运行以下命令启动 PostgreSQL 服务器:
service postgresql-12 start
此时,你已经成功地在 CentOS 6.9 上完成了 PostgreSQL 12 的离线安装。
三、创建用于备份用户
replicauser
用户是用于从主服务器上访问复制数据的。你需要在主服务器上创建此用户,并授予它适当的权限。
可以使用以下步骤创建 replicauser
用户:
- 在主服务器上登录到 PostgreSQL 数据库,例如:
psql -U postgres
- 使用以下命令创建一个名为
replicauser
的新用户:
CREATE USER replicauser REPLICATION LOGIN PASSWORD 'password';
这里,我们将用户名称设置为 replicauser
,密码设置为 password
。请确保密码足够强和安全!
- 授予
replicauser
用户访问复制数据所需的权限,例如:
ALTER ROLE replicauser WITH REPLICATION;
这会授予 replicauser
用户具有流复制权限。
完成上述步骤后,在主服务器的 pg_hba.conf
文件中添加以下行,以允许 replicauser
用户使用 md5
认证方法通过 IP 地址连接到该服务器:
host replication replicauser <从服务器IP>/32 md5
这里,<从服务器IP>
是指允许连接到主服务器的从服务器的 IP 地址或域名,replication
是要连接到主服务器的从服务器的名称。
四、在 PostgreSQL 中配置主从流复制需要执行以下步骤:
- 配置主服务器
在主服务器上修改postgresql.conf
文件。找到以下行并取消注释:
listen_addresses = '*'
wal_level = replica
max_wal_senders = 5
archive_mode = on
archive_command = 'cp %p /path/to/archive/%f'
这里,我们将 listen_addresses
参数设置为*
,以便允许所有 IP 地址连接到该服务器。wal_level
参数设置为 replica
,表示 WAL 日志将包含足够的信息可用于回放新建从服务器时已提交的事务。max_wal_senders
参数控制可以同时运行的流复制进程数量。archive_mode
参数启用归档模式,它会将 WAL 日志文件保存在另一个地方。archive_command
指定了如何处理 WAL 文件的命令。
修改 pg_hba.conf
文件,添加从服务器的 IP 地址或域名。例如:
host replication replicauser <从服务器IP>/32 md5
其中,replication
是要连接到主服务器的从服务器的名称。replicauser
是用于认证的用户名,<从服务器IP>
是从服务器的 IP 地址或域名。
- 配置从服务器
在从机上,创建复制段文件:
pg_basebackup -D /var/lib/postgresql/12/data -h 主机IP -U replicator -v -P
在从服务器上修改 postgresql.conf
文件。找到以下行并取消注释:
listen_addresses = '*'
hot_standby = on
这里,我们将 listen_addresses
参数设置为 *
,以允许从服务器接收来自任何 IP 地址的连接。hot_standby
参数启用热备,使从服务器可以读取 WAL 日志并进行流复制。
在从服务器上创建 recovery.conf
文件,并添加以下内容:
standby_mode = 'on'
primary_conninfo = 'host=<主服务器IP> port=5432 user=replicauser password=password'
restore_command = 'cp /path/to/archive/%f "%p"'
trigger_file = '/tmp/postgresql.trigger'
其中,standby_mode
表示从服务器是一个备用服务器。primary_conninfo
指定要连接的主服务器的 IP 地址、端口、用户名和密码。restore_command
指定如何从归档中检索数据文件。trigger_file
是一个文件路径,如果此文件存在,则从服务器将停止从主服务器复制。
- 启动主服务器和从服务器
在主服务器上启动 PostgreSQL 服务,然后在从服务器上启动 PostgreSQL 服务。从服务器将开始接收来自主服务器的日志流,并将其应用于本地数据库。
这样,你就成功地配置了 PostgreSQL 主从流复制。
主备切换
PostgreSQL 12支持流复制,因此,在主备切换期间,您可以使用从服务器(备服务器)来提供服务。在从服务器成为新的主服务器之前,需要进行一些准备工作。
以下是在 PostgreSQL 12 中进行主备切换的步骤:
- 确认主服务器已经宕机并不会再恢复。
- 在从服务器上检查复制状态:
SELECT * FROM pg_stat_replication;
- 停止客户端连接到从服务器;
- 将从服务器设置为独立模式,以防止从服务器尝试重新连接到已经挂掉的主服务器:
SELECT pg_wal_replay_pause();
- 带有参数 “-w” 的 pg_ctl promote 命令,将从服务器提升为主服务器:
sudo pg_ctl -D /path/to/postgresql/data promote -w
- 再次在从服务器上检查复制状态,并确保其已成为新的主服务器:
SELECT * FROM pg_stat_replication;
- 更新客户端连接信息以连接到新的主服务器。
- 最后,恢复从服务器的复制流程,以便将未同步的更改从新主服务器复制到其他从服务器:
SELECT pg_wal_replay_resume();
以上是基于流复制的主备切换方法。请注意,在实际生产环境中执行此操作之前,请务必先备份数据库,以防止数据丢失。