在 Amazon Elastic VMware Service(Amazon EVS)中运行 Oracle Database,可以延续 VMware 虚拟机的运维方式,同时把数据库虚拟磁盘放到 Amazon FSx for NetApp ONTAP 提供的 NFS 数据存储上。更关键的是,ONTAP 的 SnapMirror 能把存储卷复制到另一个区域,为跨区域灾难恢复提供基础。
这条链路涉及 AWS 网络、ONTAP、vSphere 和 Oracle 四个层面。真正困难的往往不是安装软件,而是把数据路径、权限、数据库一致性和容灾切换顺序设计清楚。
先画清数据路径与故障边界
一个典型的数据路径如下:
Oracle Database
└─ Oracle VM 文件系统或 ASM 磁盘
└─ VMDK
└─ vSphere NFS Datastore
└─ FSx for ONTAP Volume
└─ SnapMirror
└─ 目标区域 FSx for ONTAP Volume
部署前应确认以下边界:
- EVS 主机必须能访问 FSx for ONTAP 的 NFS 数据 LIF,通常需要放通 TCP 2049。
- 管理端需要访问 ONTAP 管理端点;如果通过 SSH 管理,还需要 TCP 22。
- 源区域和目标区域之间必须具备 SnapMirror 所需的网络连通性和名称解析能力。
- vSphere、Oracle VM、FSx 文件系统和管理节点应使用可靠的 DNS 与 NTP。
- NFS 数据存储的导出策略只应允许 EVS 主机网段,不要直接开放给整个 VPC。
- SnapMirror 复制的是存储快照,不天然等同于 Oracle 应用一致性备份。
容量规划不能只看当前数据库大小,还要为归档日志、临时空间、快照保留和复制增长留出余量。数据库、恢复区和非关键文件是否共用同一个数据存储,也会影响故障恢复粒度。
创建 ONTAP 卷并挂载为 NFS 数据存储
下面是一个可改造的示例。它假设 SVM 已经创建、聚合可用,而且管理机能够通过 SSH 访问 FSx for ONTAP。运行前请替换管理地址、SVM 名称、聚合名称和 EVS 主机网段。
export FSX_MGMT=10.0.10.20
export SVM_NAME=svm_oracle
export AGGR_NAME=aggr1
export EVS_CIDR=10.20.0.0/24
ssh fsxadmin@${FSX_MGMT} <<EOF
vserver nfs modify -vserver ${SVM_NAME} -v3 enabled
vserver export-policy create \
-vserver ${SVM_NAME} \
-policyname evs-oracle
vserver export-policy rule create \
-vserver ${SVM_NAME} \
-policyname evs-oracle \
-ruleindex 1 \
-protocol nfs \
-clientmatch ${EVS_CIDR} \
-rorule sys \
-rwrule sys \
-superuser sys
volume create \
-vserver ${SVM_NAME} \
-volume ora_ds01 \
-aggregate ${AGGR_NAME} \
-size 2TB \
-security-style unix \
-junction-path /ora_ds01 \
-policy evs-oracle
volume show -vserver ${SVM_NAME} -volume ora_ds01
EOF
不同 ONTAP 版本和 FSx 配置支持的参数可能不同,因此应先在测试文件系统验证命令。生产环境还应明确快照策略、自动扩容阈值、存储效率设置和监控告警。
从与 EVS 相同网络路径的 Linux 管理节点检查 NFS 导出:
export FSX_NFS_IP=10.0.20.30
showmount -e ${FSX_NFS_IP}
sudo mkdir -p /mnt/ora_ds01
sudo mount -t nfs -o vers=3 ${FSX_NFS_IP}:/ora_ds01 /mnt/ora_ds01
sudo touch /mnt/ora_ds01/connectivity-test
ls -l /mnt/ora_ds01/connectivity-test
sudo rm -f /mnt/ora_ds01/connectivity-test
sudo umount /mnt/ora_ds01
这一步只是验证网络和导出权限,不能代替从每台 ESXi 主机进行验证。
如果使用 VMware PowerCLI,可以这样把同一个 NFS 导出挂载到集群中的所有主机。请修改 vCenter、集群名称和 NFS 地址:
$vCenter = 'vcsa.example.internal'
$ClusterName = 'oracle-cluster'
$NfsHost = '10.0.20.30'
$DatastoreName = 'ora-ds01'
$ExportPath = '/ora_ds01'
Connect-VIServer -Server $vCenter
Get-Cluster -Name $ClusterName |
Get-VMHost |
ForEach-Object {
if (-not (Get-Datastore -VMHost $_ -Name $DatastoreName -ErrorAction SilentlyContinue)) {
New-Datastore -VMHost $_ `
-Name $DatastoreName `
-Nfs `
-NfsHost $NfsHost `
-Path $ExportPath
}
}
Get-Cluster -Name $ClusterName |
Get-VMHost |
Get-Datastore -Name $DatastoreName |
Select-Object Name, CapacityGB, FreeSpaceGB
所有主机都应使用一致的数据存储名称与导出路径,否则 vMotion、HA 和故障恢复操作会变得复杂。
安装 Oracle,并把存储验证纳入验收
NFS 数据存储挂载完成后,可以在其上创建 Oracle 虚拟机和 VMDK。Oracle 客户机看到的通常仍是虚拟磁盘,因此还要在操作系统内完成分区、LVM、文件系统或 ASM 配置。
以下示例以 Oracle Linux 和 Oracle Database 19c 软件安装为例。假设安装介质已解压到 /stage/database,并且响应文件位于 Oracle Home。版本、目录和补丁级别应按企业标准调整。
sudo dnf install -y oracle-database-preinstall-19c
sudo mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
sudo mkdir -p /u02/oradata
sudo chown -R oracle:oinstall /u01 /u02
sudo chmod -R 775 /u01 /u02
sudo -iu oracle bash <<'EOF'
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=${ORACLE_HOME}/bin:${PATH}
cd /stage/database
./runInstaller -silent -waitforcompletion \
-responseFile ${ORACLE_HOME}/install/response/db_install.rsp \
oracle.install.option=INSTALL_DB_SWONLY \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=/u01/app/oraInventory \
ORACLE_HOME=${ORACLE_HOME} \
ORACLE_BASE=${ORACLE_BASE} \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA_GROUP=dba \
oracle.install.db.OSOPER_GROUP=oper \
oracle.install.db.OSBACKUPDBA_GROUP=backupdba \
oracle.install.db.OSDGDBA_GROUP=dgdba \
oracle.install.db.OSKMDBA_GROUP=kmdba \
oracle.install.db.OSRACDBA_GROUP=racdba \
DECLINE_SECURITY_UPDATES=true
EOF
安装结束后,需要根据安装器输出,以 root 身份执行 inventory 和 Oracle Home 下的 root 脚本。创建数据库之前,还应完成以下检查:
# 检查虚拟磁盘、文件系统和挂载点
lsblk -f
df -hT /u01 /u02
# 简单测试顺序写入;不要在繁忙的生产卷上直接运行
fio --name=oracle-storage-check \
--filename=/u02/oradata/fio.test \
--size=1G \
--rw=write \
--bs=1M \
--direct=1 \
--iodepth=8 \
--runtime=60 \
--time_based \
--group_reporting
rm -f /u02/oradata/fio.test
fio 结果适合用来发现明显的网络、队列或吞吐问题,但不能代替基于真实 Oracle 工作负载的压测。验收时还应记录数据库延迟、ESXi 数据存储延迟、ONTAP 卷延迟和网络丢包,以便从不同层面定位瓶颈。
用 SnapMirror 构建跨区域恢复链路
跨区域复制通常需要先在源、目标 FSx for ONTAP 文件系统之间建立集群和 SVM 对等关系。对等关系、路由和安全组配置完成后,才创建目标卷与 SnapMirror 关系。
下面是目标端的示意命令。名称和聚合必须根据实际环境修改:
export DR_FSX_MGMT=10.100.10.20
ssh fsxadmin@${DR_FSX_MGMT} <<'EOF'
volume create \
-vserver svm_oracle_dr \
-volume ora_ds01_dr \
-aggregate aggr1 \
-type DP \
-size 2TB
snapmirror create \
-source-path svm_oracle:ora_ds01 \
-destination-path svm_oracle_dr:ora_ds01_dr \
-type XDP \
-policy MirrorAllSnapshots \
-schedule hourly
snapmirror initialize \
-destination-path svm_oracle_dr:ora_ds01_dr
snapmirror show \
-destination-path svm_oracle_dr:ora_ds01_dr
EOF
策略名称、调度方式和目标卷创建参数会受到 ONTAP 版本及组织标准影响。初始化会复制现有数据,应避开业务高峰并监控网络带宽。
更重要的是定义数据库一致性策略:
- 仅依赖存储快照时,恢复结果通常应按崩溃一致性处理。
- 如果要求应用一致性,应协调 Oracle 热备份流程、归档日志切换、RMAN 或其他受支持的编排方式。
- 数据库文件、控制文件、联机日志和归档日志如果分散在多个卷上,需要一致性组或严格编排,避免各卷恢复点不一致。
- SnapMirror 调度决定存储层 RPO,但完整业务 RTO 还包括挂载数据存储、注册或恢复虚拟机、启动数据库和应用验证。
计划内切换可以参考下面的顺序,而不是直接在生产环境执行单条 break 命令:
1. 停止应用写入并确认事务排空
2. 触发 Oracle 检查点和归档日志切换
3. 创建最终一致性快照并执行 SnapMirror 更新
4. 确认复制无积压
5. 在目标端中断 SnapMirror 关系
6. 为目标卷配置 junction path 和 NFS 导出策略
7. 在灾备 EVS 集群挂载 NFS 数据存储
8. 注册或恢复 Oracle 虚拟机
9. 启动数据库,执行必要的实例恢复
10. 验证数据、监听器、应用连接与监控
回切前要明确复制方向。错误地执行重新同步可能覆盖更新的一侧,因此 snapmirror resync 应纳入经过评审的运行手册,并先在隔离环境演练。
上线前检查清单
- 每台 EVS 主机都能访问 NFS 数据 LIF,并看到相同数据存储。
- 导出策略只允许必要的主机网段,管理权限也遵循最小权限原则。
- Oracle 的 CPU、内存、NUMA 和虚拟磁盘布局经过容量测试。
- 已监控 FSx 容量、吞吐、延迟、快照占用和 SnapMirror 滞后。
- 已分别验证数据库备份恢复、虚拟机恢复和整站容灾,而不是把 SnapMirror 当成备份替代品。
- 容灾运行手册明确了 RPO、RTO、DNS 切换、启动顺序、回切方法和责任人。
- 至少完成一次跨区域演练,并保存恢复耗时及问题记录。
这套架构的优势是保留 VMware 运维模型,同时利用 ONTAP 的 NFS 与复制能力;代价则是增加了跨层排障和一致性管理的复杂度。最稳妥的落地方式,是先部署单个非生产数据库,完成性能基线、快照恢复和跨区域切换演练,再逐步迁移关键 Oracle 工作负载。