Skip to content

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. 日志复制流程

  1. 主数据库执行事务并写入本地日志缓冲
  2. 日志缓冲刷新到磁盘日志文件
  3. HADR守护进程读取日志文件
  4. 通过TCP/IP连接将日志发送到备数据库
  5. 备数据库接收日志并写入本地日志文件
  6. 备数据库应用日志,更新数据库状态

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_TIMEOUTHADR超时时间(秒)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 NEARSYNC

HADR状态管理

1. 启动HADR

bash
# 启动备数据库HADR
db2 start hadr on database <dbname> as standby

# 启动主数据库HADR
db2 start hadr on database <dbname> as primary

2. 查看HADR状态

bash
# 查看HADR状态
db2 get snapshot for database on <dbname> | grep -i hadr

# 或使用更简洁的命令
db2pd -db <dbname> -hadr

3. 停止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)
  • 部署步骤

    1. 在两个数据中心分别部署DB2实例
    2. 配置网络连接,确保低延迟
    3. 在主库和备库上配置HADR参数
    4. 初始化备库:
      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
    5. 启动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 同步模式性能优化

  • 问题:使用同步模式导致主库性能下降
  • 调优策略
    1. 优化网络:
      bash
      # 调整TCP/IP参数
      echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf
      echo "net.core.wmem_max = 16777216" >> /etc/sysctl.conf
      sysctl -p
    2. 调整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
    3. 考虑使用近同步模式(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_FILE

3.2 集成监控系统

  • 与Prometheus+Grafana集成
    1. 开发导出器脚本,定期收集HADR指标
    2. 配置Prometheus抓取指标
    3. 在Grafana中创建HADR监控仪表盘
    4. 设置告警规则,如:
      • HADR状态异常
      • 日志延迟超过阈值
      • HADR连接断开

4. HADR故障处理实践

4.1 主库故障恢复流程

  • 故障场景:主库服务器崩溃
  • 恢复步骤
    1. 确认主库故障:
      bash
      ping primary_host
    2. 在备库上执行强制接管:
      bash
      db2 takeover hadr on database <dbname> by force
    3. 更新客户端连接配置(如果未配置ACR)
    4. 恢复主库服务器
    5. 将原主库配置为新备库:
      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 网络故障处理

  • 故障场景:主备库之间网络中断
  • 处理方法
    1. 检查网络状态:
      bash
      ping standby_host
      traceroute standby_host
    2. 检查HADR状态:
      bash
      db2pd -db <dbname> -hadr
    3. 网络恢复后,HADR会自动重新连接并追赶日志
    4. 如果自动恢复失败,手动重启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集群

  • 升级步骤
    1. 停止备库HADR:
      bash
      db2 stop hadr on database <dbname>
    2. 升级备库DB2版本
    3. 重启备库实例:
      bash
      db2stop force
      db2start
    4. 启动备库HADR:
      bash
      db2 start hadr on database <dbname> as standby
    5. 等待主备同步(HADR_STATE=PEER)
    6. 执行故障切换,将备库切换为主库:
      bash
      db2 takeover hadr on database <dbname>
    7. 升级原主库(现在是备库)
    8. 重启原主库实例
    9. 启动原主库HADR作为备库
    10. 可选择再次执行故障切换,恢复原角色

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自动故障切换

  • 实施步骤
    1. 安装并配置TSA(Tivoli System Automation)
    2. 创建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
    3. 配置资源依赖关系
    4. 启用资源组自动启动

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> -hadrdb2 get snapshot for database on <dbname>
  • 使用IBM Data Studio或IBM Cloud Pak for Data
  • 配置HADR告警,监控日志延迟和连接状态
  • 使用第三方监控工具,如Nagios或Zabbix