在数据库系统中,构建高可用架构是保障业务连续性的关键。本文将详细介绍在CentOS 7系统上,搭建基于PostgreSQL 15的流复制主从架构,并整合Keepalived实现虚拟IP漂移,最终形成一个具备自动故障转移能力的高可用数据库集群。
一、PostgreSQL 15安装与基础配置
本次安装以PostgreSQL 15版本为例。
1. 通过YUM安装
使用以下命令添加官方仓库并安装PostgreSQL 15服务器及必要工具。
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql15-server
yum install net-tools -y
2. 验证安装
安装完成后,可通过以下命令确认软件包是否成功安装。
rpm -qa | grep postg
3. 初始化与启动服务
初始化数据库,设置服务开机自启并启动。
# 初始化数据库
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
# 启动PostgreSQL服务
sudo systemctl start postgresql-15
# 设置开机启动
sudo systemctl enable postgresql-15
4. 核心配置文件调整
为了后续主从配置及远程连接,需要修改PostgreSQL的主要配置文件。这通常涉及基本的Linux系统操作和配置文件管理。
5. 迁移数据目录并重启服务(可选)
若更改了数据目录,需迁移数据并更新服务配置。
# 创建新数据目录并迁移数据
mkdir -p /data/pgsql_data/
cp -r /var/lib/pgsql/15/data/* /data/pgsql_data/
chown -R postgres:postgres /data/pgsql_data/
mv /var/lib/pgsql/15/data /tmp/data
# 修改服务配置文件中的环境变量
vi /usr/lib/systemd/system/postgresql-15.service
# 将 `Environment=PGDATA=/var/lib/pgsql/15/data/` 修改为:
Environment=PGDATA=/data/pgsql_data/
# 重载系统守护进程并重启PostgreSQL
chmod 700 /data/pgsql_data
systemctl daemon-reload
systemctl restart postgresql-15
6. 修改默认用户密码
# 切换至postgres用户并进入SQL Shell
su - postgres
psql
# 修改postgres用户密码
ALTER USER postgres WITH PASSWORD 'YourStrongPassword';
\q
完成后,可使用客户端工具(如Navicat)或命令行测试连接,验证安装成功。
二、配置PostgreSQL 15主从流复制
1. 主库(Master)配置
- 创建复制专用账号:在主库执行SQL,创建一个用于流复制的用户。
CREATE ROLE repl login replication password 'ReplStrongPassword';
- 配置访问权限:编辑主库的
pg_hba.conf文件,添加从库的访问权限。
vi /data/pgsql_data/pg_hba.conf
host replication repl 主节点IP/32 md5
host replication repl 从节点IP/32 md5
- 调整主库参数:编辑主库的
postgresql.conf文件,开启并配置流复制相关参数。
vi /data/pgsql_data/postgresql.conf
wal_level = replica
max_wal_senders = 10
wal_sender_timeout = 60s
synchronous_standby_names = '' # 异步复制,若需同步则填写从库名称
archive_mode = on
archive_command = 'cp %p /data/pgsql_data/arch_dir/%f; find /data/pgsql_data/arch_dir -type f -mtime +7 |xargs rm -f'
- 创建归档目录并重启主库:
mkdir -p /data/pgsql_data/arch_dir
chown -R postgres:postgres /data/pgsql_data
systemctl restart postgresql-15
2. 从库(Standby)配置
- 准备从库环境:停止从库服务并清空数据目录。
systemctl stop postgresql-15
rm -rf /data/pgsql_data/*
- 从主库基础备份:使用
pg_basebackup工具从主库拉取全量数据。
/usr/pgsql-15/bin/pg_basebackup -h 主节点IP -U repl -F p -P -R -D /data/pgsql_data
# 根据提示输入repl用户的密码
- 调整从库参数并启动:设置从库允许更多连接(需大于主库),然后启动服务。
chown -R postgres:postgres /data/pgsql_data
vi /data/pgsql_data/postgresql.conf
# 添加或修改:max_connections = 1200
systemctl start postgresql-15
3. 验证主从复制状态
在主库中查询复制状态视图,确认从库已连接并处于流复制状态。
SELECT pid, state, client_addr, sync_priority, sync_state FROM pg_stat_replication;
若看到从库的IP地址且state为streaming,则表明主从同步建立成功。你可以通过在主库创建/删除数据库或表,在从库观察是否同步来进一步验证。
三、主备切换操作步骤
当主库发生故障需要将备库提升为新主库时,可手动执行以下操作(以下步骤以模拟故障为例):
1. 停止原主库服务
在原主库服务器上执行:
systemctl stop postgresql-15
2. 提升备库为新主库
在备库服务器上执行:
# 切换至postgres用户
su - postgres
# 检查当前集群状态(应为“in archive recovery”)
/usr/pgsql-15/bin/pg_controldata -D /data/pgsql_data | grep cluster
# 执行提升命令
/usr/pgsql-15/bin/pg_ctl promote -D /data/pgsql_data/
# 再次检查状态,应变为“in production”
/usr/pgsql-15/bin/pg_controldata -D /data/pgsql_data | grep cluster
3. 将原主库降级为新备库
原主库修复后,需将其重新加入集群作为新的从库。
- 停止服务并清空数据目录。
- 使用
pg_basebackup从新的主库(即刚提升的服务器)拉取数据。
- 修改
postgresql.conf(如调整max_connections)。
- 启动服务,此时它应作为从库运行。
此手动切换流程是数据库运维中的重要环节,确保在故障时能快速恢复服务。
四、集成Keepalived实现高可用VIP
为了给应用提供统一的访问入口并实现自动故障转移,我们在主从节点上配置Keepalived。
1. 安装Keepalived
在两台服务器上均执行:
yum install keepalived -y
systemctl start keepalived
systemctl enable keepalived
2. 配置Keepalived
3. 配置健康检查脚本
在主从节点创建相同的检测脚本,用于监控PostgreSQL服务状态,这是实现自动化运维监控的基础。
mkdir -p /etc/keepalived/scripts /etc/keepalived/log
vi /etc/keepalived/scripts/check_pg.sh
脚本内容:
#!/bin/bash
# 检测5432端口是否在监听
A=$(netstat -lnp | grep LISTEN | grep :5432 | wc -l)
if [ $A -eq 0 ]; then
echo "$(date "+%Y-%m-%d--%H:%M:%S") postgresql stop so vip stop " >> /etc/keepalived/log/check_pg.log
systemctl stop keepalived
fi
赋予脚本执行权限:
chmod +x /etc/keepalived/scripts/check_pg.sh
4. 启动并验证
重启Keepalived服务,并在主节点上使用ip addr命令查看虚拟IP(192.168.0.11)是否已绑定。
systemctl restart keepalived
五、高可用方案使用与维护说明
整套高可用方案的工作逻辑如下:
- 正常情况:VIP绑定在主库节点,所有应用通过VIP连接至主库进行读写。从库通过流复制同步数据。
- 主库故障:当主库的PostgreSQL服务宕机,该节点的Keepalived健康检查脚本会检测到并自动停止本机Keepalived服务,导致VIP飘移至从库节点。
- 故障处理:
- 快速恢复:若主库能迅速修复,只需启动主库的PostgreSQL和Keepalived服务,VIP会自行飘回。
- 主从角色切换:若主库无法短时间恢复,需手动执行第三部分的主备切换步骤,将已获得VIP的从库提升为可读写的新主库。待原主库修复后,再将其作为新从库加入集群。
重要提示:本方案中Keepalived仅负责VIP漂移,实现网络层的高可用。PostgreSQL主从的角色切换(写权限变更)仍需根据上述第三部分的步骤手动或通过更高级的脚本管理工具完成。在实施任何切换操作前,务必对数据进行备份。