本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
通过高可用性灾难恢复将 Db2 for LUW 迁移到 Amazon EC2
Feng Cai、Aruna Gangireddy 和 Venkatesan Govindan,Amazon Web Services
Summary
如果客户要将 IBM Db2 LUW(Linux、UNIX 和 Windows)工作负载迁移至 Amazon Web Services(AWS),采用 Amazon Elastic Compute Cloud(Amazon EC2)并结合自带许可(BYOL)模式是最快捷的途径。不过,将大量数据从本地 Db2 迁移到 AWS 可能是一项挑战,尤其是在停机窗口很短的情况下。许多客户尝试将停机窗口设置为 30 分钟以下,这样留给数据库本身的时间就很少了。
此模式涵盖如何使用 Db2 高可用性灾难恢复 (HADR) 在较短的中断窗口内完成 Db2 迁移。此方法适用于小端 Linux 平台上且不使用数据分区功能 (DPF) 的 Db2 数据库。
先决条件和限制
先决条件
一个有效的 Amazon Web Services account
在 Amazon EC2 实例上运行且与本地文件系统布局匹配的 Db2 实例
EC2 实例可访问的 Amazon Simple Storage Service (Amazon S3) 存储桶
用于向 Amazon S3 进行程序化调用的 AWS Identity and Access Management(IAM)策略和角色
Amazon EC2 和本地服务器上的同步时区和系统时钟
通过 AWS Site-to-SiteVPN 或 AWS Di rect Connect 连接到 AWS 的本地网络
本地服务器与 Amazon EC2 在 HADR 端口上的通信
限制
Db2 本地实例和 Amazon EC2 必须位于同一平台系列上。
分区数据库环境不支持 HADR。
HADR 不支持对数据库日志文件使用原始 I/O (直接磁盘访问)。
HADR 不支持无限的日志记录。
LOGINDEXBUILD 必须设置为 YES,这将增加重建索引的日志使用量。
必须记录 Db2 本地工作负载。在数据库配置中设置 blocknonlogged=yes 以阻止任何未记录的事务。
产品版本
架构
源技术堆栈
目标技术堆栈
目标架构
在下图中,本地 Db2 作为主服务器在 db2-server1 运行。它包含两个 HADR 备用目标。一个备用目标位于本地,并且是可选。另一个备用目标 db2-ec2 位于 Amazon EC2 上。将数据库割接到 AWS 后,db2-ec2 成为主数据库。
日志从主本地数据库流式传输至备用本地数据库。
使用 Db2 HADR,日志通过 Site-to-Site VPN 从主本地数据库流式传输到 Amazon EC2 上的 Db2。
Db2 备份和存档日志从主本地数据库发送至 AWS 上的 S3 存储桶。
Amazon Web Services
其他工具
最佳实践
操作说明
| Task | 说明 | 所需技能 |
|---|
设置环境变量。 | 此模式使用以下名称和端口: Db2 本地主机名:db2-server1 HADR 备用主机名:db2-server2(如果 HADR 当前在本地运行) Amazon EC2 主机名:db2-ec2 实例名称:db2inst1 数据库名称:SAMPLE HADR 端口: db2-server1: 50010
db2-server2: 50011
db2-ec2: 50012
您可更改它们以适应您的环境。 | 数据库管理员 |
| Task | 说明 | 所需技能 |
|---|
设置 AWS CLI。 | 要下载并安装最新版本的 AWS CLI,请运行以下命令: $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
| Linx 管理员 |
设置 Db2 归档日志的本地目标。 | 大量更新批处理作业和网络速度减慢等情况可能会导致 HADR 备用服务器出现延迟。为了赶上进度,备用服务器需要来自主服务器的事务日志。请求日志位置顺序如下: 在此设置中,/db2logs 由 LOGARCHMETH2 在源上设置作为暂存区域。此目录中的存档日志将同步至 Amazon S3 中,并由 Amazon EC2 上的 Db2 访问。此模式使用 LOGARCHMETH2,因为 LOGARCHMETH1 可能已配置为使用 AWS CLI 命令无法访问的第三方供应商工具: db2 connect to sample
db2 update db cfg for SAMPLE using LOGARCHMETH2 disk:/db2logs
| 数据库管理员 |
运行在线数据库备份。 | 运行在线数据库备份,并将其保存至本地备份文件系统: db2 backup db sample online to /backup
| 数据库管理员 |
| Task | 说明 | 所需技能 |
|---|
创建 S3 存储桶。 | 为本地服务器创建 S3 存储桶,以便将备份 Db2 映象和日志文件发送到 AWS 上。Amazon EC2 将访问此存储桶: aws s3api create-bucket --bucket hadrmig-db2 --region us-east-1
| AWS 管理员 |
创建一个 IAM 策略。 | db2bucket.json 文件包含用于访问 S3 存储桶的 IAM 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:GenerateDataKey",
"kms:Decrypt",
"s3:PutObject",
"s3:GetObject",
"s3:AbortMultipartUpload",
"s3:ListBucket",
"s3:DeleteObject",
"s3:GetObjectVersion",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::hadrmig-db2/*",
"arn:aws:s3:::hadrmig-db2"
]
}
]
}
要创建策略,请使用以下 AWS CLI 命令: aws iam create-policy \
--policy-name db2s3hapolicy \
--policy-document file://db2bucket.json
JSON 输出显示策略的 Amazon 资源名称(ARN),其中 aws_account_id 代表您的账户 ID: "Arn": "arn:aws:iam::aws_account_id:policy/db2s3hapolicy"
| AWS 管理员、AWS 系统管理员 |
将 IAM 策略附加到 IAM 角色。 | 通常,运行 Db2 的 EC2 实例将具有系统管理员分配的 IAM 角色。如果未分配 IAM 角色,可以在 Amazon EC2 控制台上选择修改 IAM 角色。 将 IAM 策略附加到与 EC2 实例关联的 IAM 角色。附加策略后,EC2 实例可以访问 S3 存储桶。 aws iam attach-role-policy --policy-arn "arn:aws:iam::aws_account_id:policy/db2s3hapolicy" --role-name db2s3harole
| |
| Task | 说明 | 所需技能 |
|---|
在本地 Db2 服务器配置 AWS CLI。 | 使用之前生成的 Access Key ID 和 Secret Access Key 配置 AWS CLI: $ aws configure
AWS Access Key ID [None]: *************
AWS Secret Access Key [None]: ***************************
Default region name [None]: us-east-1
Default output format [None]: json
| AWS 管理员、AWS 系统管理员 |
将备份映象发送到 Amazon S3。 | 早些时候,联机数据库备份已保存至 /backup 本地目录中。要将备份映象发送到 S3 存储桶,请运行以下命令: aws s3 sync /backup s3://hadrmig-db2/SAMPLE_backup
| AWS 管理员、AWS 系统管理员 |
将 Db2 存档日志发送至 Amazon S3。 | 将本地 Db2 存档日志与 Amazon EC2 上的目标 Db2 实例可以访问的 S3 存储桶同步: aws s3 sync /db2logs s3://hadrmig-db2/SAMPLE_LOGS
使用 cron 或其他计划工具定期以运行此命令。频率取决于源数据库归档事务日志文件的频率。 | |
| Task | 说明 | 所需技能 |
|---|
创建 PKCS12 密钥库。 | Db2 使用公钥加密标准 (PKCS) 加密密钥库,保障 AWS 访问密钥的安全。创建密钥库并配置源 Db2,以进行使用: gsk8capicmd_64 -keydb -create -db "/home/db2inst1/.keystore/db2s3.p12" -pw "<password>" -type pkcs12 -stash
db2 "update dbm cfg using keystore_location /home/db2inst1/.keystore/db2s3.p12 keystore_type pkcs12"
| 数据库管理员 |
创建 Db2 存储访问别名。 | Db2 使用存储访问别名通过 INGEST、LOAD、BACKUP DATABASE 或 RESTORE DATABASE 命令直接访问 Amazon S3。 因为您为 EC2 实例分配了 IAM 角色,USER 和 PASSWORD 并非必需: db2 "catalog storage access alias <alias_name> vendor S3 server <S3 endpoint> container '<bucket_name>'"
例如,您的脚本可能如下所示: db2 "catalog storage access alias DB2AWSS3 vendor S3 server s3.us-east-1.amazonaws.com container 'hadrmig-db2'"
| 数据库管理员 |
设置暂存区域。 | 我们建议使用 DB2_ENABLE_COS_SDK=ON、DB2_OBJECT_STORAGE_SETTINGS=EnableStreamingRestore 和 awssdk 库链接,绕过 Amazon S3 暂存区进行数据库备份和恢复: #By root:
cp -rp /home/db2inst1/sqllib/lib64/awssdk/RHEL/7.6/* /home/db2inst1/sqllib/lib64/
#By db2 instance owner:
db2set DB2_OBJECT_STORAGE_LOCAL_STAGING_PATH=/db2stage
db2set DB2_ENABLE_COS_SDK=ON
db2set DB2_OBJECT_STORAGE_LOCAL_STAGING_PATH=/db2stage
db2stop
db2start
| 数据库管理员 |
从备份映象恢复数据库。 | 从 S3 存储桶中的备份映象恢复 Amazon EC2 上的目标数据库: db2 create db sample on /data1
db2 restore db sample from DB2REMOTE://DB2AWSS3/hadrmig-db2/SAMPLE_backup replace existing
| 数据库管理员 |
| Task | 说明 | 所需技能 |
|---|
配置本地 Db2 服务器为主服务器。 | 将 db2-server1(本地源)的 HADR 的数据库配置设置为主数据库。将 HADR_SYNCMODE 设置为 SUPERASYNC 模式,其事务响应时间最短: db2 update db cfg for sample using HADR_LOCAL_HOST db2-server1 HADR_LOCAL_SVC 50010 HADR_REMOTE_HOST db2-ec2 HADR_REMOTE_SVC 50012 HADR_REMOTE_INST db2inst1 HADR_SYNCMODE SUPERASYNC
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully
本地数据中心与 AWS 之间预计会有一些网络延迟。(您可根据网络可靠性设置不同 HADR_SYNCMODE 值。有关更多信息,请参阅相关资源部分)。 | 数据库管理员 |
更改目标数据库日志归档目标。 | 更改目标数据库日志存档目标以匹配 Amazon EC2 环境: db2 update db cfg for SAMPLE using LOGARCHMETH1 'DB2REMOTE://DB2AWSS3//SAMPLE_LOGS/' LOGARCHMETH2 OFF
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully
| 数据库管理员 |
在Amazon EC2 服务器上为 Db2 配置 HADR。 | 更新 db2-ec2 HADR 的数据库配置,使其处于待机状态: db2 update db cfg for sample using HADR_LOCAL_HOST db2-ec2 HADR_LOCAL_SVC 50012 HADR_REMOTE_HOST db2-server1 HADR_REMOTE_SVC 50010 HADR_REMOTE_INST db2inst1 HADR_SYNCMODE SUPERASYNC
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully
| 数据库管理员 |
验证 HADR 设置。 | 验证源 Db2 服务器和目标 Db2 服务器上的 HADR 参数。 若要验证 db2-server1 上的设置,请运行以下命令: db2 get db cfg for sample|grep HADR
HADR database role = PRIMARY
HADR local host name (HADR_LOCAL_HOST) = db2-server1
HADR local service name (HADR_LOCAL_SVC) = 50010
HADR remote host name (HADR_REMOTE_HOST) = db2-ec2
HADR remote service name (HADR_REMOTE_SVC) = 50012
HADR instance name of remote server (HADR_REMOTE_INST) = db2inst1
HADR timeout value (HADR_TIMEOUT) = 120
HADR target list (HADR_TARGET_LIST) =
HADR log write synchronization mode (HADR_SYNCMODE) = NEARSYNC
HADR spool log data limit (4KB) (HADR_SPOOL_LIMIT) = AUTOMATIC(52000)
HADR log replay delay (seconds) (HADR_REPLAY_DELAY) = 0
HADR peer window duration (seconds) (HADR_PEER_WINDOW) = 0
HADR SSL certificate label (HADR_SSL_LABEL) =
HADR SSL Hostname Validation (HADR_SSL_HOST_VAL) = OFF
若要验证 db2-ec2 上的设置,请运行以下命令: db2 get db cfg for sample|grep HADR
HADR database role = STANDBY
HADR local host name (HADR_LOCAL_HOST) = db2-ec2
HADR local service name (HADR_LOCAL_SVC) = 50012
HADR remote host name (HADR_REMOTE_HOST) = db2-server1
HADR remote service name (HADR_REMOTE_SVC) = 50010
HADR instance name of remote server (HADR_REMOTE_INST) = db2inst1
HADR timeout value (HADR_TIMEOUT) = 120
HADR target list (HADR_TARGET_LIST) =
HADR log write synchronization mode (HADR_SYNCMODE) = SUPERASYNC
HADR spool log data limit (4KB) (HADR_SPOOL_LIMIT) = AUTOMATIC(52000)
HADR log replay delay (seconds) (HADR_REPLAY_DELAY) = 0
HADR peer window duration (seconds) (HADR_PEER_WINDOW) = 0
HADR SSL certificate label (HADR_SSL_LABEL) =
HADR SSL Hostname Validation (HADR_SSL_HOST_VAL) = OFF
HADR_LOCAL_HOST、HADR_LOCAL_SVC、HADR_REMOTE_HOST、和 HADR_REMOTE_SVC 参数表示一个主 HADR 设置和一个备用 HADR 设置。
| 数据库管理员 |
启动 Db2 HADR 实例。 | 首先在备用服务器 db2-ec2 上启动 Db2 HADR 实例: db2 start hadr on db sample as standby
DB20000I The START HADR ON DATABASE command completed successfully.
在主(源)服务器 db2-server1 上启动 Db2 HADR: db2 start hadr on db sample as primary
DB20000I The START HADR ON DATABASE command completed successfully.
本地 Db2 和 Amazon EC2 上的 HADR 连接现已成功建立。Db2 主服务器 db2-server1 开始将事务日志记录实时传输至 db2-ec2。 | 数据库管理员 |
| Task | 说明 | 所需技能 |
|---|
在 Amazon EC2 添加 Db2 作为辅助备用。 | 如果 HADR 正在本地 Db2 实例上运行,则可以通过在 db2-ec2 上运行以下命令,使用 HADR_TARGET_LIST 将 Amazon EC2 上的 Db2 添加为辅助备用实例: db2 update db cfg for sample using HADR_LOCAL_HOST db2-ec2 HADR_LOCAL_SVC 50012 HADR_REMOTE_HOST db2-server1 HADR_REMOTE_SVC 50010 HADR_REMOTE_INST db2inst1 HADR_SYNCMODE SUPERASYNC
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully.
db2 update db cfg for sample using HADR_TARGET_LIST "db2-server1:50010|db2-server2:50011"
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully.
| 数据库管理员 |
将辅助备用信息添加至本地服务器。 | 更新 HADR_TARGET_LIST 两台本地服务器(主服务器和备用服务器)。 在 db2-server1 上,运行以下代码: db2 update db cfg for sample using HADR_TARGET_LIST "db2-server2:50011|db2-ec2:50012"
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully. SQL1363W One or more of the parameters submitted for immediate modification were not changed dynamically. For these configuration parameters, the database must be shutdown and reactivated before the configuration parameter changes become effective.
在 db2-server2 上,运行以下代码: db2 update db cfg for sample using HADR_TARGET_LIST "db2-server1:50010|db2-ec2:50012"
DB20000I The UPDATE DATABASE CONFIGURATION command completed successfully. SQL1363W One or more of the parameters submitted for immediate modification were not changed dynamically. For these configuration parameters, the database must be shutdown and reactivated before the configuration parameter changes become effective.
| 数据库管理员 |
验证 HADR 设置。 | 验证源 Db2 服务器和目标 Db2 服务器上的 HADR 参数。 在 db2-server1 上,运行以下代码: db2 get db cfg for sample|grep HADR
HADR database role = PRIMARY
HADR local host name (HADR_LOCAL_HOST) = db2-server1
HADR local service name (HADR_LOCAL_SVC) = 50010
HADR remote host name (HADR_REMOTE_HOST) = db2-server2
HADR remote service name (HADR_REMOTE_SVC) = 50011
HADR instance name of remote server (HADR_REMOTE_INST) = db2inst1
HADR timeout value (HADR_TIMEOUT) = 120
HADR target list (HADR_TARGET_LIST) = db2-server2:50011|db2-ec2:50012
HADR log write synchronization mode (HADR_SYNCMODE) = NEARSYNC
HADR spool log data limit (4KB) (HADR_SPOOL_LIMIT) = AUTOMATIC(52000)
HADR log replay delay (seconds) (HADR_REPLAY_DELAY) = 0
HADR peer window duration (seconds) (HADR_PEER_WINDOW) = 0
HADR SSL certificate label (HADR_SSL_LABEL) =
HADR SSL Hostname Validation (HADR_SSL_HOST_VAL) = OFF
在 db2-server2 上,运行以下代码: db2 get db cfg for sample|grep HADR
HADR database role = STANDBY
HADR local host name (HADR_LOCAL_HOST) = db2-server2
HADR local service name (HADR_LOCAL_SVC) = 50011
HADR remote host name (HADR_REMOTE_HOST) = db2-server1
HADR remote service name (HADR_REMOTE_SVC) = 50010
HADR instance name of remote server (HADR_REMOTE_INST) = db2inst1
HADR timeout value (HADR_TIMEOUT) = 120
HADR target list (HADR_TARGET_LIST) = db2-server1:50010|db2-ec2:50012
HADR log write synchronization mode (HADR_SYNCMODE) = NEARSYNC
HADR spool log data limit (4KB) (HADR_SPOOL_LIMIT) = AUTOMATIC(52000)
HADR log replay delay (seconds) (HADR_REPLAY_DELAY) = 0
HADR peer window duration (seconds) (HADR_PEER_WINDOW) = 0
HADR SSL certificate label (HADR_SSL_LABEL) =
HADR SSL Hostname Validation (HADR_SSL_HOST_VAL) = OFF
在 db2-ec2 上,运行以下代码: db2 get db cfg for sample|grep HADR
HADR database role = STANDBY
HADR local host name (HADR_LOCAL_HOST) = db2-ec2
HADR local service name (HADR_LOCAL_SVC) = 50012
HADR remote host name (HADR_REMOTE_HOST) = db2-server1
HADR remote service name (HADR_REMOTE_SVC) = 50010
HADR instance name of remote server (HADR_REMOTE_INST) = db2inst1
HADR timeout value (HADR_TIMEOUT) = 120
HADR target list (HADR_TARGET_LIST) = db2-server1:50010|db2-server2:50011
HADR log write synchronization mode (HADR_SYNCMODE) = SUPERASYNC
HADR spool log data limit (4KB) (HADR_SPOOL_LIMIT) = AUTOMATIC(52000)
HADR log replay delay (seconds) (HADR_REPLAY_DELAY) = 0
HADR peer window duration (seconds) (HADR_PEER_WINDOW) = 0
HADR SSL certificate label (HADR_SSL_LABEL) =
HADR SSL Hostname Validation (HADR_SSL_HOST_VAL) = OFF
HADR_LOCAL_HOST、HADR_LOCAL_SVC、HADR_REMOTE_HOST、HADR_REMOTE_SVC、HADR_TARGET_LIST 参数表示一个主 HADR 设置和两个备用 HADR 设置。
| |
停止和启动 Db2 HADR。 | HADR_TARGET_LIST 现在已在所有三台服务器上进行设置。每个 Db2 服务器都了解其他两个。停止并重启 HADR(短暂停机)以利用新配置。
在 db2-server1 上,运行以下命令: db2 stop hadr on db sample
db2 deactivate db sample
db2 activate db sample
在 db2-server2 上,运行以下命令: db2 deactivate db sample
db2 start hadr on db sample as standby
SQL1766W The command completed successfully
在 db2-ec2 上,运行以下命令: db2 start hadr on db sample as standby
SQL1766W The command completed successfully
在 db2-server1 上,运行以下命令: db2 start hadr on db sample as primary
SQL1766W The command completed successfully
现在,本地 Db2 和 Amazon EC2 上的 HADR 连接已成功建立。Db2 主服务器 db2-server1 开始将事务日志记录实时流式传输至 db2-server2 和 db2-ec2。 | 数据库管理员 |
| Task | 说明 | 所需技能 |
|---|
确保备用服务器上无 HADR 延迟。 | 从主服务器 db2-server1 检查 HADR 状态。HADR_STATE 处于 REMOTE_CATCHUP 状态时不要惊慌,当 HADR_SYNCMODE 设置为 SUPERASYNC 时,这是正常的。PRIMARY_LOG_TIME 和 STANDBY_REPLAY_LOG_TIME 表示它们处于同步状态: db2pd -hadr -db sample
HADR_ROLE = PRIMARY
REPLAY_TYPE = PHYSICAL
HADR_SYNCMODE = SUPERASYNC
STANDBY_ID = 2
LOG_STREAM_ID = 0
HADR_STATE = REMOTE_CATCHUP
.....
PRIMARY_LOG_TIME = 10/26/2022 02:11:32.000000 (1666750292)
STANDBY_LOG_TIME = 10/26/2022 02:11:32.000000 (1666750292)
STANDBY_REPLAY_LOG_TIME = 10/26/2022 02:11:32.000000 (1666750292)
| 数据库管理员 |
运行 HADR 接管。 | 若要完成迁移,请运行 HADR takeover 命令创建 db2-ec2 主数据库。使用命令 db2pd 验证 HADR_ROLE 值: db2 TAKEOVER HADR ON DATABASE sample
DB20000I The TAKEOVER HADR ON DATABASE command completed successfully.
db2pd -hadr -db sample
Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:03:25 -- Date 2022-10-26-02.46.45.048988
HADR_ROLE = PRIMARY
REPLAY_TYPE = PHYSICAL
要完成向 AWS 的迁移,请将应用程序连接指向 Amazon EC2 的 Db2。 | |
问题排查
| 问题 | 解决方案 |
|---|
如果您出于防火墙和安全原因使用 NAT,则主机可能有两个 IP 地址(一个内部地址和一个外部地址),这可能会导致 HADR IP 地址检查失败。START HADR ON DATABASE 命令将返回以下消息: HADR_LOCAL_HOST:HADR_LOCAL_SVC (-xx-xx-xx-xx.:50011 (xx.xx.xx.xx:50011)) on remote database is different from HADR_REMOTE_HOST:HADR_REMOTE_SVC (xx-xx-xx-xx.:50011 (x.x.x.x:50011)) on local database.
| 要在 NAT 环境中支持 HADR,您可使用内部地址和外部地址 HADR_LOCAL_HOST 进行配置。例如,如果 Db2 服务器有内部名称 host1 和外部名称 host1E,则 HADR_LOCAL_HOST 可以是 HADR_LOCAL_HOST: "host1 | host1E"。 |
相关资源