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

news/2025/1/5 15:59:19/文章来源:https://www.cnblogs.com/mugetsukun/p/18649912

(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 ]; thenlog "PostgreSQL full backup restore completed successfully."
elselog "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 ]; thenlog "PostgreSQL incremental backup restore completed successfully."
elselog "PostgreSQL incremental backup restore failed."exit 1
filog "PostgreSQL test database restore process completed."

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

chmod +x /usr/local/bin/pg_restore_test.shcorntab -e
0 3 * * * /usr/local/bin/pg_restore_test.sh

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

更新流程

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

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

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

回滚步骤:

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

更新制度

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863340.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Listary 6.3.1.85 Windows文件管理:高效文件管理工具

点击上方蓝字关注我 前言 Listary是一个非常实用的Windows文件管理小帮手,它能让找文件和管理文件变得更快更容易。用了它,你可以更快地搜索到想要的文件或程序,还能通过一些快捷操作快速到达文件所在的位置。更重要的是,Listary能和Windows自带的文件管理器以及其他常用的…

断点输出大法快速定位编程错误

断点&输出大法快速定位编程错误 1、断点法 点红框位置就可以加每行代码的断点 再按F5进行debug断点&输出大法快速定位编程错误 1、断点法 点红框位置就可以加每行代码的断点再按F5进行debug操作,在下面的窗口看各函数的值 这种方法经常用在循环出现问题时进行处理 举个…

Nginx的referer参数的用法和原理

​ Nginx的referer参数是用于控制HTTP请求中的Referer字段的相关配置。这个参数的主要作用是限制或允许特定来源网站的访问,以加强安全性或控制流量。 用法:限制特定来源网站的访问: 可以使用referer参数来配置Nginx,使其只允许来自指定来源网站的请求。这有助于防止盗链或…

.Net程序员机会来了,微软官方新推出一个面向Windows开发者本地运行AI模型的开源工具

想要开发AI产品的.Net程序员机会来了,这个项目应该好好研究。 虽然说大模型基本都有提供网络API,但肯定没有直接使用本地模型速度快。 最近微软官方新推出AI Dev Gallery开源项目,可以帮助Windows开发人员学习如何将具有本地模型和API的AI添加到Windows应用程序中。01 项目简…

ABB工业机器人SIB-V板维修细节分享

要判断ABB机器人SIB-v板是否需要更换,可以从以下几个方面进行评估: - 检查SIB-v板的状态:查看SIB-v板是否有明显的物理损坏,如烧焦、裂纹或其他损坏迹象。 - 检查连接情况:确保SIB-v板与其他组件的连接牢固,没有松动或腐蚀。 - 检查电池状态:如果SIB-v板上有…

KUKA机械臂驱动器600-20 1X64 UL故障维修细节

库卡机器人作为工业自动化的重要设备,其稳定性和可靠性对于生产线的正常运转至关重要。然而,在使用过程中,KUKA机械臂驱动器故障是不可避免的问题之一。 一、常见KUKA机械手驱动器故障及原因分析 1. 过热故障 过热是常见的库卡工业机器人驱动器600-20 1X64 UL故障之一。这通…

PostgreSQL技术大讲堂 - 第77讲:DB4AI 搭建PG向量数据库AI机器人

PostgreSQL技术大讲堂 - 第77讲,主题:DB4AI 搭建PG向量数据库AI机器人 讲课内容: 1、 向量搜索引擎(PGVector)介绍 2、 向量与Embeddings的定义 3、 向量间的相似度计算方法演示 4、检索增强生成模型(RAG)介绍 5、PG向量数据库+通义千问大模型实现AI机器人 目前主流的关系型…

ABAP excel上传时,数字带文本逗号 转ABAP数量QUAN金额CURR 格式

主要使用 函数MOVE_CHAR_TO_NUM 或者 UNITS_STRING_CONVERT 第二个需要限制客户SU3 参数配置X 或者函数入参默认X, excel导出默认时X格式, 样例参考代码*&---------------------------------------------------------------------* *& Report YWWZ_TEST57 *&…

11 个必备 Docker 工具

​ 1. LazyDocker命令行下的 Docker 管理利器LazyDocker 是一个为命令行用户设计的友好型终端工具,用于管理 Docker 容器、镜像和存储卷。它适合那些习惯于命令行操作但又希望拥有直观界面的用户。 通过 LazyDocker,你可以一站式查看容器的状态、资源消耗、日志等详细信息,并…

大语言模型提示技巧(三)-迭代式提示

大语言模型还没有达到能够准确猜测人类意图的程度,此时它不能立即反馈出令人满意的答复,我们需要做的是对大语言模型进行迭代式提示,反复推进,直至大语言模型给出了令人满意的答案。我们与大语言模型交互时,往往给出的提示过于简略,而大语言模型还没有达到能够准确猜测你…

spring 中 Bean 的生命周期

spring 中 Bean 的生命周期是怎样的?原文 连环18问 https://mp.weixin.qq.com/s/liWn2Dn91cmuiqHSxVO_fASpringBean 生命周期大致分为4个阶段:1.「实例化」,实例化该 Bean 对象2.「填充属性」,给该 Bean 赋值3.「初始化」如果实现了 Aware 接口,会通过其接口获取容器资源如…