外观
DB2 HADR 架构
HADR概述
DB2 High Availability Disaster Recovery (HADR) 是DB2数据库的高可用性和灾难恢复解决方案,通过日志复制技术实现主数据库与备数据库之间的数据同步,提供自动故障切换和手动故障切换能力,确保数据库服务的连续性和数据的完整性。
HADR架构组件
1. 主数据库(Primary)
- 处理所有客户端连接和事务
- 生成事务日志并发送到备数据库
- 监控备数据库状态
- 支持读写操作
2. 备数据库(Standby)
- 接收并应用主数据库发送的日志
- 保持与主数据库的数据同步
- 处于只读状态(DB2 11.5之前)或支持只读操作(DB2 11.5及之后)
- 准备在主数据库故障时接管服务
3. HADR守护进程(HADR Daemon)
- 运行在主数据库和备数据库上
- 负责日志的发送和接收
- 管理HADR连接和状态监控
- 处理故障检测和切换请求
4. 共享存储(可选)
- 用于存储数据库备份和日志归档
- 支持快速恢复和故障切换
- 通常使用SAN或NAS存储
5. 虚拟IP(可选)
- 提供单一的数据库访问地址
- 故障切换时自动漂移到活动数据库
- 减少应用程序的重新配置需求
HADR工作原理
1. 日志复制流程
- 主数据库执行事务并写入本地日志缓冲
- 日志缓冲刷新到磁盘日志文件
- HADR守护进程读取日志文件
- 通过TCP/IP连接将日志发送到备数据库
- 备数据库接收日志并写入本地日志文件
- 备数据库应用日志,更新数据库状态
2. 同步模式
DB2 HADR支持三种同步模式,用于平衡性能和数据保护:
同步模式(SYNC)
- 主数据库等待备数据库确认已接收并写入日志后,才向应用程序返回事务提交确认
- 提供最高的数据保护级别
- 对主数据库性能影响较大
近同步模式(NEARSYNC)
- 主数据库等待备数据库确认已接收日志后,才向应用程序返回事务提交确认
- 备数据库不需要确认已写入磁盘
- 提供较好的数据保护和性能平衡
异步模式(ASYNC)
- 主数据库写入本地日志后立即向应用程序返回事务提交确认
- 日志异步发送到备数据库
- 提供最佳性能
- 可能存在数据丢失风险
超级异步模式(SUPERASYNC)
- 主数据库将日志放入发送队列后立即返回
- 日志发送优先级较低
- 提供最高性能
- 数据丢失风险最高
3. 故障检测与切换
自动故障切换(Automatic Failover)
- 需要配置HADR自动客户端重新路由(ACR)
- 备数据库检测到主数据库故障
- 备数据库自动接管为主数据库
- 客户端自动连接到新的主数据库
手动故障切换(Manual Failover)
- 管理员手动触发切换
- 适用于计划维护或自动切换失败的情况
- 支持两种模式:
- 接管(Takeover):正常切换,主数据库处于可用状态
- 强制接管(Takeover with Force):强制切换,主数据库不可用
HADR部署模式
1. 标准HADR
- 一个主数据库和一个备数据库
- 简单易用,部署成本低
- 适用于中小型数据库环境
2. 级联HADR
- 一个主数据库、一个级联备数据库和一个或多个远程备数据库
- 级联备数据库同时作为主数据库的备库和远程备库的主库
- 减少主数据库的网络负载
- 适用于跨地域部署
3. HADR with Read-on-Standby
- DB2 11.5及以上版本支持
- 备数据库可以处理只读查询
- 提高资源利用率
- 减少主数据库的查询负载
4. HADR with Multiple Standbys
- DB2 10.5及以上版本支持
- 一个主数据库和最多3个备数据库
- 提供更高的可用性和灾难恢复能力
- 支持不同的同步模式配置
HADR配置参数
核心配置参数
| 参数名称 | 描述 | 默认值 |
|---|---|---|
| HADR_LOCAL_HOST | 本地主机名或IP地址 | 无 |
| HADR_LOCAL_SVC | 本地HADR服务端口 | 无 |
| HADR_REMOTE_HOST | 远程主机名或IP地址 | 无 |
| HADR_REMOTE_SVC | 远程HADR服务端口 | 无 |
| HADR_REMOTE_INST | 远程实例名 | 无 |
| HADR_SYNCMODE | 同步模式 | NEARSYNC |
| HADR_TIMEOUT | HADR超时时间(秒) | 120 |
| HADR_PEER_WINDOW | 对等窗口大小(秒) | 0 |
配置示例
bash
# 在主数据库上配置
db2 update db cfg for <dbname> using HADR_LOCAL_HOST primary_host
db2 update db cfg for <dbname> using HADR_LOCAL_SVC 50000
db2 update db cfg for <dbname> using HADR_REMOTE_HOST standby_host
db2 update db cfg for <dbname> using HADR_REMOTE_SVC 50001
db2 update db cfg for <dbname> using HADR_REMOTE_INST db2inst1
db2 update db cfg for <dbname> using HADR_SYNCMODE NEARSYNC
# 在备数据库上配置
db2 update db cfg for <dbname> using HADR_LOCAL_HOST standby_host
db2 update db cfg for <dbname> using HADR_LOCAL_SVC 50001
db2 update db cfg for <dbname> using HADR_REMOTE_HOST primary_host
db2 update db cfg for <dbname> using HADR_REMOTE_SVC 50000
db2 update db cfg for <dbname> using HADR_REMOTE_INST db2inst1
db2 update db cfg for <dbname> using HADR_SYNCMODE NEARSYNCHADR状态管理
1. 启动HADR
bash
# 启动备数据库HADR
db2 start hadr on database <dbname> as standby
# 启动主数据库HADR
db2 start hadr on database <dbname> as primary2. 查看HADR状态
bash
# 查看HADR状态
db2 get snapshot for database on <dbname> | grep -i hadr
# 或使用更简洁的命令
db2pd -db <dbname> -hadr3. 停止HADR
bash
# 停止HADR
db2 stop hadr on database <dbname>4. 执行故障切换
bash
# 在备数据库上执行手动接管
db2 takeover hadr on database <dbname>
# 强制接管(主数据库不可用)
db2 takeover hadr on database <dbname> by force版本差异
| 版本 | HADR功能差异 |
|---|---|
| DB2 9.7 | 支持基本的HADR功能,包括同步、近同步和异步模式 |
| DB2 10.1 | 引入级联HADR和多个备数据库支持(最多3个) |
| DB2 10.5 | 增强了故障切换性能,支持自动客户端重新路由(ACR) |
| DB2 11.1 | 改进了HADR监控和管理功能,支持更多的同步选项 |
| DB2 11.5 | 引入HADR只读备库功能,支持在备库上执行只读查询 |
生产实践
1. HADR部署最佳实践
1.1 跨地域部署架构
案例背景:企业需要在不同数据中心部署HADR,实现灾难恢复
实施架构:
- 主数据库:北京数据中心
- 备数据库:上海数据中心
- 网络:使用专线连接,带宽1Gbps
- 同步模式:近同步(NEARSYNC)
部署步骤:
- 在两个数据中心分别部署DB2实例
- 配置网络连接,确保低延迟
- 在主库和备库上配置HADR参数
- 初始化备库:bash
# 备份主库 db2 backup database <dbname> to /backup # 将备份传输到备库 scp /backup/*.001 standby_host:/backup # 在备库上恢复 db2 restore database <dbname> from /backup replace existing db2 rollforward database <dbname> to end of logs and stop - 启动HADR:bash
# 先启动备库 db2 start hadr on database <dbname> as standby # 再启动主库 db2 start hadr on database <dbname> as primary
1.2 多备库部署策略
应用场景:需要同时实现本地高可用和异地灾难恢复
部署模式:
- 主数据库:本地数据中心
- 备库1:本地数据中心(同步模式,用于高可用)
- 备库2:异地数据中心(异步模式,用于灾难恢复)
配置示例:
bash# 配置主库连接到两个备库 db2 update db cfg for <dbname> using HADR_TARGET_LIST "standby1:50001,standby2:50002" # 启动所有备库 db2 start hadr on database <dbname> as standby on standby1 db2 start hadr on database <dbname> as standby on standby2 # 启动主库 db2 start hadr on database <dbname> as primary
2. HADR性能调优实践
2.1 同步模式性能优化
- 问题:使用同步模式导致主库性能下降
- 调优策略:
- 优化网络:bash
# 调整TCP/IP参数 echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf echo "net.core.wmem_max = 16777216" >> /etc/sysctl.conf sysctl -p - 调整HADR参数:bash
# 增加HADR缓冲区大小 db2 update db cfg for <dbname> using HADR_BUF_SIZE 65536 # 调整HADR超时时间 db2 update db cfg for <dbname> using HADR_TIMEOUT 300 - 考虑使用近同步模式(NEARSYNC)平衡性能和数据保护
- 优化网络:
2.2 日志应用性能优化
- 问题:备库日志应用速度慢,导致主备延迟增大
- 调优方法:bash
# 增加备库日志应用线程数 db2 update db cfg for <dbname> using NUM_LOG_SPOOL_AGENTS 8 # 调整日志缓冲区大小 db2 update db cfg for <dbname> using LOGBUFSZ 65536 # 启用并行日志应用 db2 update db cfg for <dbname> using HADR_PARALLEL_LOG_APPLY ON
3. HADR监控与告警实践
3.1 实时监控脚本
bash
#!/bin/bash
# hadr_monitor.sh - 监控HADR状态
DB_NAME="mydb"
LOG_FILE="/var/log/hadr_monitor.log"
ALERT_EMAIL="admin@example.com"
# 记录监控时间
echo "=== HADR监控 - $(date) ===" >> $LOG_FILE
# 获取HADR状态
HADR_STATUS=$(db2pd -db $DB_NAME -hadr)
echo "$HADR_STATUS" >> $LOG_FILE
# 检查HADR状态
if echo "$HADR_STATUS" | grep -q "HADR_ROLE = PRIMARY"; then
# 主库,检查备库状态
if ! echo "$HADR_STATUS" | grep -q "HADR_STATE = PEER"; then
ALERT_SUBJECT="HADR告警:主库与备库不同步"
echo "主库$DB_NAME的HADR状态异常,当前状态:$(echo "$HADR_STATUS" | grep "HADR_STATE")" | mail -s "$ALERT_SUBJECT" $ALERT_EMAIL
fi
else
# 备库,检查同步状态
if ! echo "$HADR_STATUS" | grep -q -E "HADR_STATE = (PEER|CATCHUP)"; then
ALERT_SUBJECT="HADR告警:备库同步异常"
echo "备库$DB_NAME的HADR状态异常,当前状态:$(echo "$HADR_STATUS" | grep "HADR_STATE")" | mail -s "$ALERT_SUBJECT" $ALERT_EMAIL
fi
fi
# 检查日志延迟
LOG_GAP=$(echo "$HADR_STATUS" | grep "LOG_GAP" | awk '{print $3}')
if [ "$LOG_GAP" -gt 1000 ]; then
ALERT_SUBJECT="HADR告警:日志延迟过大"
echo "库$DB_NAME的HADR日志延迟过大,当前延迟:$LOG_GAP个日志文件" | mail -s "$ALERT_SUBJECT" $ALERT_EMAIL
fi
echo "=== 监控结束 ===" >> $LOG_FILE3.2 集成监控系统
- 与Prometheus+Grafana集成:
- 开发导出器脚本,定期收集HADR指标
- 配置Prometheus抓取指标
- 在Grafana中创建HADR监控仪表盘
- 设置告警规则,如:
- HADR状态异常
- 日志延迟超过阈值
- HADR连接断开
4. HADR故障处理实践
4.1 主库故障恢复流程
- 故障场景:主库服务器崩溃
- 恢复步骤:
- 确认主库故障:bash
ping primary_host - 在备库上执行强制接管:bash
db2 takeover hadr on database <dbname> by force - 更新客户端连接配置(如果未配置ACR)
- 恢复主库服务器
- 将原主库配置为新备库:bash
# 恢复原主库 db2 restore database <dbname> from /backup replace existing db2 rollforward database <dbname> to end of logs and stop # 重新配置HADR参数 db2 update db cfg for <dbname> using HADR_ROLE STANDBY # 启动HADR作为备库 db2 start hadr on database <dbname> as standby
- 确认主库故障:
4.2 网络故障处理
- 故障场景:主备库之间网络中断
- 处理方法:
- 检查网络状态:bash
ping standby_host traceroute standby_host - 检查HADR状态:bash
db2pd -db <dbname> -hadr - 网络恢复后,HADR会自动重新连接并追赶日志
- 如果自动恢复失败,手动重启HADR:bash
# 在备库上停止并重启HADR db2 stop hadr on database <dbname> db2 start hadr on database <dbname> as standby # 在主库上停止并重启HADR db2 stop hadr on database <dbname> db2 start hadr on database <dbname> as primary
- 检查网络状态:
5. HADR维护实践
5.1 滚动升级HADR集群
- 升级步骤:
- 停止备库HADR:bash
db2 stop hadr on database <dbname> - 升级备库DB2版本
- 重启备库实例:bash
db2stop force db2start - 启动备库HADR:bash
db2 start hadr on database <dbname> as standby - 等待主备同步(HADR_STATE=PEER)
- 执行故障切换,将备库切换为主库:bash
db2 takeover hadr on database <dbname> - 升级原主库(现在是备库)
- 重启原主库实例
- 启动原主库HADR作为备库
- 可选择再次执行故障切换,恢复原角色
- 停止备库HADR:
5.2 HADR备份策略
- 最佳实践:
- 在备库上执行离线备份,减少对主库的影响
- 实施差异化备份策略:bash
# 每周日执行全量备份 0 2 * * 0 db2 backup database <dbname> to /backup # 其他日期执行增量备份 0 2 * * 1-6 db2 backup database <dbname> online incremental to /backup - 定期验证备份完整性:bash
db2ckbkp /backup/*.001 - 测试恢复流程,确保备份可用
6. HADR与其他高可用方案结合
6.1 HADR+TSA自动故障切换
- 实施步骤:
- 安装并配置TSA(Tivoli System Automation)
- 创建TSA资源组:bash
# 创建数据库资源 mkrsrc -t IBM.Application Name=db2_<dbname>_app NodeNameList="primary_node,standby_node" StartCommand="/home/db2inst1/start_db.sh" StopCommand="/home/db2inst1/stop_db.sh" # 创建虚拟IP资源 mkrsrc -t IBM.ServiceIP Name=db2_<dbname>_ip NodeNameList="primary_node,standby_node" Address="192.168.1.100" Network="eth0" # 创建资源组 mkrg db2_<dbname>_rg # 将资源添加到资源组 addrgmbr db2_<dbname>_rg db2_<dbname>_app db2_<dbname>_ip - 配置资源依赖关系
- 启用资源组自动启动
6.2 HADR与PureScale结合
- 应用场景:需要同时实现本地高可用集群和异地灾难恢复
- 架构设计:
- 本地:PureScale集群(主)
- 异地:单实例DB2(HADR备库)
- 同步模式:异步(考虑网络延迟)
- 优势:结合了PureScale的本地高可用和HADR的异地灾难恢复能力
常见问题(FAQ)
Q1: HADR支持哪些DB2版本?
A1: HADR从DB2 9.1版本开始支持,建议使用DB2 10.5或更高版本以获得最佳性能和功能。
Q2: HADR可以用于跨平台部署吗?
A2: 是的,HADR支持跨平台部署,只要主数据库和备数据库使用相同的DB2版本和位数(32位或64位)。
Q3: HADR如何处理网络故障?
A3: 当网络故障发生时,HADR会进入断开状态。一旦网络恢复,HADR会自动重新连接并追赶日志。如果网络故障持续时间超过HADR_TIMEOUT设置,备数据库会考虑主数据库故障。
Q4: HADR备库可以用于备份吗?
A4: 是的,HADR备库可以执行离线备份,而不影响主数据库的性能。这是HADR的一个重要优势,可以减少备份对生产系统的影响。
Q5: DB2 11.5的HADR只读备库有什么限制?
A5: DB2 11.5的HADR只读备库支持大多数只读操作,但仍有一些限制:
- 不支持DDL操作
- 不支持LOB和XML数据类型的某些操作
- 性能可能受到日志应用的影响
- 需要额外的系统资源来处理只读查询
Q6: 如何选择合适的HADR同步模式?
A6: 选择HADR同步模式需要平衡性能和数据保护:
- 对数据保护要求极高的关键业务系统,建议使用同步模式(SYNC)
- 大多数业务系统,建议使用近同步模式(NEARSYNC)
- 对性能要求极高,数据丢失风险可接受的系统,可使用异步模式(ASYNC)或超级异步模式(SUPERASYNC)
Q7: HADR与DB2 pureScale有什么区别?
A7: HADR和DB2 pureScale都是DB2的高可用性解决方案,但它们的设计目标和架构不同:
- HADR主要用于灾难恢复和站点级故障切换,支持跨地域部署
- DB2 pureScale主要用于高可用性和负载均衡,支持多个节点同时处理事务
- HADR提供主备架构,而DB2 pureScale提供共享磁盘集群架构
Q8: 如何监控HADR状态?
A8: 可以使用以下方法监控HADR状态:
- 使用DB2命令:
db2pd -db <dbname> -hadr或db2 get snapshot for database on <dbname> - 使用IBM Data Studio或IBM Cloud Pak for Data
- 配置HADR告警,监控日志延迟和连接状态
- 使用第三方监控工具,如Nagios或Zabbix
