首页 > 数据库 >实践项目-数据库主从高可用(PostgreSQL、Pgpool2、pg_dumpall)

实践项目-数据库主从高可用(PostgreSQL、Pgpool2、pg_dumpall)

时间:2025-01-03 12:56:58浏览次数:1  
标签:dumpall postgresql Pgpool2 192.168 更新 PostgreSQL backup pg

(250103)

实践目标

备份策略:定期全量备份和增量备份,备份文件异地存储。
恢复测试:定期在测试库上恢复备份,确保备份文件可用。
权限管理:严格控制数据库访问权限,避免误操作。
变更管理:所有数据库变更需经过审批,并在非高峰时段执行。
监控告警:实时监控数据库状态,设置告警机制,及时发现并处理问题。
同步延迟:监控主从同步延迟,确保数据一致性。
备份验证:定期验证备份文件的完整性和可恢复性。
安全防护:加强数据库安全防护,防止数据泄露和攻击。

环境

操作系统:Debian 12.8
节点规划:
主库:192.168.100.1
从库1:192.168.100.2
从库2:192.168.100.3
MHA 管理节点:192.168.100.4
读写分离中间件:192.168.100.5
备份服务器:192.168.100.6
测试库:192.168.100.7
(默认进行过ssh-copy-id)

PostgreSQL编译安装

(所有节点)

# 安装编译 PostgreSQL 所需的依赖
sudo apt-get update
sudo apt-get install -y build-essential libreadline-dev zlib1g-dev flex bison libxml2-dev libxslt-dev libssl-dev

# 下载 PostgreSQL 源码包
wget https://ftp.postgresql.org/pub/source/v17.2/postgresql-17.2.tar.gz
tar -zxvf postgresql-17.2.tar.gz
cd postgresql-17.2

# 编译安装 PostgreSQL
./configure --prefix=/usr/local/postgresql --with-openssl
make
sudo make install

# 创建 PostgreSQL 用户和目录
sudo adduser postgres
sudo mkdir -p /usr/local/postgresql/data
sudo chown postgres:postgres /usr/local/postgresql/data

(主库)
初始化数据库

sudo -u postgres /usr/local/postgresql/bin/initdb -D /usr/local/postgresql/data

启动PostgreSQL

sudo -u postgres /usr/local/postgresql/bin/pg_ctl -D /usr/local/postgresql/data -l logfile start

主从搭建

配置从库
在从库1(192.168.100.2)和从库2(192.168.100.3)上,停止 PostgreSQL 服务并清空数据目录:

sudo systemctl stop postgresql
sudo rm -rf /var/lib/postgresql/15/main/*

使用pg_basebackup从主库同步数据:

pg_basebackup -h 192.168.100.1 -U replica -D /var/lib/postgresql/15/main -P -R

编辑配置文件/etc/postgresql/15/main/postgresql.conf确保从库处于只读模式:

hot_standby = on

启动 PostgreSQL 服务:

sudo systemctl start postgresql

检查复制状态

在主库上检查复制状态:

SELECT * FROM pg_stat_replication;

在从库上检查复制状态:

SELECT * FROM pg_stat_wal_receiver;

读写分离

编译安装 Pgpool2
在读写分离中间件节点(192.168.100.5)上编译安装 Pgpool2。

# 安装依赖
sudo apt-get install -y libpq-dev libssl-dev

#下载 Pgpool-II 源码包:
wget https://www.pgpool.net/download.php?f=pgpool-II-4.5.2.tar.gz
tar -xvf pgpool-II-4.5.2.tar.gz
cd pgpool-II-4.5.2

# 编译并安装 Pgpool2
./configure --prefix=/usr/local/pgpool
make
sudo make install

配置 Pgpool-II
/usr/local/pgpool/etc/pgpool.conf

listen_addresses = '*'
backend_hostname0 = '192.168.100.1'
backend_port0 = 5432
backend_weight0 = 0
backend_hostname1 = '192.168.100.2'
backend_port1 = 5432
backend_weight1 = 1
backend_hostname2 = '192.168.100.3'
backend_port2 = 5432
backend_weight2 = 1

启动 Pgpool-II 服务

/usr/local/pgpool/bin/pgpool -n -D -d > /var/log/pgpool.log 2>&1 &

测试读写分离

通过 Pgpool-II 连接 PostgreSQL:

psql -h 192.168.100.5 -U postgres

执行以下 SQL 语句,验证读写分离是否生效
写操作(应路由到主库):

INSERT INTO test_table (name) VALUES ('test');

读操作(应路由到从库):

SELECT * FROM test_table;

备份与恢复方案

全量备份
使用pg_dumpall进行全量备份:

pg_dumpall -U postgres -f /backup/postgresql/full_backup_$(date +%F).sql

增量备份
通过 WAL 日志实现增量备份。
/etc/postgresql/15/main/postgresql.conf

archive_mode = on
archive_command = 'cp %p /backup/postgresql/wal/%f'

恢复备份

全量恢复

psql -U postgres -f /backup/postgresql/full_backup_{{date}}.sql

增量恢复
将 WAL 日志文件复制到 pg_wal 目录,PostgreSQL 会自动应用这些日志。

将备份数据定期恢复到测试库

恢复流程
将全量备份文件恢复到测试库:

psql -U postgres -f /backup/postgresql/full_backup_{{date}}.sql

将增量备份文件(WAL 日志)恢复到测试库:

cp /backup/postgresql/wal/* /var/lib/postgresql/15/main/pg_wal/

自动化恢复脚本
/usr/local/bin/pg_restore_test.sh:

#!/bin/bash
# PostgreSQL 测试库恢复脚本


# 定义变量
BACKUP_DIR="/backup/postgresql"
TEST_DB_HOST="192.168.100.7"
TEST_DB_USER="postgres"
LOG_FILE="/var/log/pg_restore_test.log"

# 记录日志
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - \$1" >> $LOG_FILE
}

# 恢复全量备份
log "Starting PostgreSQL full backup restore..."
psql -h $TEST_DB_HOST -U $TEST_DB_USER -f $BACKUP_DIR/full_backup_$(date +%F).sql

# 检查恢复结果
if [ $? -eq 0 ]; then
    log "PostgreSQL full backup restore completed successfully."
else
    log "PostgreSQL full backup restore failed."
    exit 1
fi

# 恢复增量备份
log "Starting PostgreSQL incremental backup restore..."
cp $BACKUP_DIR/wal/* /var/lib/postgresql/15/main/pg_wal/

# 检查恢复结果
if [ $? -eq 0 ]; then
    log "PostgreSQL incremental backup restore completed successfully."
else
    log "PostgreSQL incremental backup restore failed."
    exit 1
fi

log "PostgreSQL test database restore process completed."

设置定时任务,每天凌晨 3 点执行:

chmod +x /usr/local/bin/pg_restore_test.sh

corntab -e
0 3 * * * /usr/local/bin/pg_restore_test.sh

人工更新数据库的流程及制度

更新流程

更新申请
申请人:开发人员或运维人员。
申请内容:包括更新的 SQL 语句、更新原因、更新时间等。
申请方式:通过工单系统或邮件提交申请。

更新审批
审批人:数据库管理员(DBA)或相关负责人。
审批内容:审核 SQL 语句的正确性、更新对系统的影响等。
审批方式:通过工单系统或邮件进行审批。

更新执行
执行人:数据库管理员(DBA)或授权人员。
执行步骤:
备份数据:在执行更新前,先对相关表或数据库进行备份。
执行更新:在非高峰时段执行更新操作。
验证更新:检查更新结果,确保数据一致性和业务正常运行。
记录日志:记录更新操作的详细信息,包括执行时间、执行人、更新内容等。
更新回滚
回滚条件:如果更新导致数据不一致或业务异常,立即执行回滚操作。

回滚步骤:

  • 停止更新:立即停止所有相关操作。
  • 恢复数据:使用备份文件恢复数据。
  • 验证恢复:检查数据恢复结果,确保业务正常运行。
  • 记录日志:记录回滚操作的详细信息,包括回滚时间、回滚人、回滚内容等。

更新制度

更新权限
权限分配:只有经过授权的数据库管理员(DBA)或相关人员才能执行更新操作。
权限管理:定期审查和更新权限分配,确保权限最小化。
更新时间
非高峰时段:更新操作应在非高峰时段进行,避免影响业务正常运行。
紧急更新:对于紧急更新,需经过特别审批,并在执行前通知相关人员。
更新记录
记录内容:每次更新操作都需详细记录,包括更新内容、执行时间、执行人、审批人等。
记录保存:更新记录应长期保存,便于后续审计和查询。
更新培训
培训内容:定期对相关人员进行数据库更新操作的培训,确保操作规范和安全。
培训记录:记录培训内容和参与人员,确保培训效果。

标签:dumpall,postgresql,Pgpool2,192.168,更新,PostgreSQL,backup,pg
From: https://www.cnblogs.com/mugetsukun/p/18649912

相关文章

  • PostgreSQL技术大讲堂 - 第77讲:DB4AI 搭建PG向量数据库AI机器人
     PostgreSQL技术大讲堂-第77讲,主题:DB4AI搭建PG向量数据库AI机器人讲课内容:1、向量搜索引擎(PGVector)介绍2、向量与Embeddings的定义3、向量间的相似度计算方法演示4、检索增强生成模型(RAG)介绍5、PG向量数据库+通义千问大模型实现AI机器人目前主流的关系型数据......
  • 浅谈以 Oracle 为基准,GaussDB、达梦数据库(DM)和 PostgreSQL 的差异以及信创前景
    随着国内信息技术的快速发展,尤其是在“信息技术自主可控”(即信创)政策的推动下,国内企业和政府部门逐渐对数据库技术提出了自主可控的需求。尤其在数据库领域,国产数据库技术的崛起,正逐步替代传统的国际主流数据库系统(如Oracle等),成为我国数字化转型和数据安全战略中的关键一环。本......
  • 掌握 PostgreSQL 的 psql 命令行工具
    title:掌握PostgreSQL的psql命令行工具date:2024/12/30updated:2024/12/30author:cmdragonexcerpt:psql是PostgreSQL关系数据库管理系统的交互式命令行工具,是数据库管理员和开发人员进行数据库管理和操作的主要接口。熟练使用psql工具,不仅能够提高对P......
  • PostgreSQL小技巧
    在字符串中添加换行符在PostgreSQL中如果想在字符串中添加特殊符号,是不等直接在字符串中显示的,如:select'\n',最后查出来的就是\n而不是换行符。这是需要借用E。在PostgreSQL中,字符串前面的E表示该字符串是一个转义字符串(escapestring)。转义字符串可以包含用于表示特殊字符或......
  • 掌握 PostgreSQL 的 psql 命令行工具
    title:掌握PostgreSQL的psql命令行工具date:2024/12/30updated:2024/12/30author:cmdragonexcerpt:psql是PostgreSQL关系数据库管理系统的交互式命令行工具,是数据库管理员和开发人员进行数据库管理和操作的主要接口。熟练使用psql工具,不仅能够提高对Postgre......
  • PostgreSQL中FIRST_VALUE、LAST_VALUE、LAG 和 LEAD是窗口函数,允许返回在数据集的特
    在PostgreSQL中,FIRST_VALUE、LAST_VALUE、LAG和LEAD是窗口函数(windowfunctions),它们允许你在数据集的特定窗口(或分区)内访问行的相对位置。以下是对这些函数的详细解释和用法:1.FIRST_VALUEFIRST_VALUE函数返回在指定窗口或分区内的第一行的值。它常用于获取每个组的起......
  • PostgreSQL 数据库连接
    title:PostgreSQL数据库连接date:2024/12/29updated:2024/12/29author:cmdragonexcerpt:PostgreSQL是一款功能强大的开源关系数据库管理系统,在现代应用中广泛应用于数据存储和管理。连接到数据库是与PostgreSQL进行交互的第一步,这一过程涉及到多个方面,包括连接的基本......
  • .Net Core 8 NLog连接PostgreSQL数据库
    最近在做的项目需要把日志记录到本地和数据库,我使用的是NLog,主要参考博文链接:.NET项目中NLog的配置与使用-追逐时光者-博客园,下面是NLog连接PostgreSQL数据库的步骤,网上关于NLog连接PostgreSQL数据库的实例比较少,大多数都是mysql的。1、创建Nlog.config配置文件,将下面配置文......
  • PostgreSQL 初始化配置设置
    title:PostgreSQL初始化配置设置date:2024/12/27updated:2024/12/27author:cmdragonexcerpt:PostgreSQL是一款广泛应用于企业级应用、数据仓库以及Web应用程序的强大数据库管理系统。在完成数据库的安装后,进行合理而有效的初始配置是确保数据库性能和安全性的......
  • 在不同操作系统上安装 PostgreSQL
    title:在不同操作系统上安装PostgreSQLdate:2024/12/26updated:2024/12/26author:cmdragonexcerpt:PostgreSQL是当今最受欢迎的开源关系数据库管理系统之一,由于其强大的功能和灵活性,广泛应用于不同的行业和应用场景。在开始使用PostgreSQL之前,用户需要了解......