教程:将 Oracle WebLogic Server 迁移到具有异地冗余的 Azure Kubernetes 服务 (AKS)

本教程介绍了在 Azure Kubernetes 服务 (AKS) 上使用 Oracle WebLogic Server (WLS) 为 Java 实现业务连续性和灾难恢复 (DR) 策略的一种简单有效的方法。 该解决方案说明如何使用在 AKS 上运行的简单数据库驱动的 Jakarta EE 应用程序备份和还原 WLS 工作负载。 异地冗余是一个复杂的主题,有许多可能的解决方案。 最佳解决方案取决于你的独特要求。 有关实现异地冗余的其他方法,请参阅本文末尾的资源。

本教程介绍如何执行下列操作:

  • 使用 Azure 优化的最佳做法来实现高可用性和灾难恢复 (HA/DR)。
  • 在配对区域中设置 Microsoft Azure SQL 数据库故障转移组。
  • 在 AKS 上设置和配置主 WLS 群集。
  • 使用 Azure 备份配置异地冗余。
  • 还原次要区域中的 WLS 群集。
  • 设置 Azure 流量管理器。
  • 测试故障转移。

下图说明了你构建的体系结构:

Azure VM 上具有高可用性和灾难恢复的 WLS 的解决方案体系结构示意图。

Azure 流量管理器检查所在区域的运行状况,并相应地将流量路由到应用程序层。 主要区域已完全部署 WLS 群集。 只有主要区域正在积极为来自用户的网络请求提供服务。 如果发生灾难或声明的 DR 事件,次要区域将从主要区域的备份还原 WLS 群集。 只有当主要区域出现服务中断时,次要区域才会被激活以接收流量。

Azure 流量管理器使用 Azure 应用程序网关和 WebLogic Kubernetes Operator (WKO) 的运行状况检查功能来实现此条件路由。 WKO 与 AKS 运行状况检查深度集成,使 Azure 流量管理器能够深入了解 Java 工作负载的运行状况。 主 WLS 群集正在运行,辅助群集已关闭。

应用程序层的异地故障转移恢复时间目标 (RTO) 取决于启动 AKS 和运行辅助 WLS 群集的时间,通常不到一个小时。 应用程序数据在 Azure SQL 数据库故障转移组中持久化和复制,RTO 为几分钟或几小时,恢复点目标 (RPO) 为几分钟或几小时。 在此体系结构中,Azure 备份每天只有一个用于 WLS 配置的保管库标准备份。 有关详细信息,请参阅什么是 Azure Kubernetes 服务 (AKS) 备份?

数据库层由具有主服务器和辅助服务器的 Azure SQL 数据库故障转移组组成。 主服务器处于活动读写模式,并连接到主 WLS 群集。 辅助服务器处于仅被动就绪模式,并连接到辅助 WLS 群集。 异地故障转移都会将组中所有的辅助数据库切换为主角色。 有关 Azure SQL 数据库的异地故障转移 RPO 和 RTO,请参阅业务连续性概述

本文是使用 Azure SQL 数据库服务编写的,因为本文依赖于该服务的高可用性 (HA) 功能。 其他数据库选择也是可能的,但必须考虑所选任何数据库的 HA 功能。 有关详细信息,包括有关如何优化数据源的配置以供复制的信息,请参阅为 Oracle Fusion 中间件主动-被动部署配置数据源

本文使用 Azure 备份来保护 AKS。 有关区域可用性、支持的方案和限制,请参阅 Azure Kubernetes 服务备份支持矩阵。 目前,Azure 备份支持跨区域的保管库层备份和恢复,这些备份在公共预览版中提供。 有关详细信息,请参阅使用 Azure 备份为 AKS 启用保管库层备份并跨区域还原

注意

在本文中,必须经常为各种资源创建唯一标识符。 本文使用 <initials><sequence-number> 的约定作为前缀。 例如,如果你的姓名是 Emily Juanita Bernal,则唯一标识符为 ejb01。 为了进一步消除歧义,可以采用 MMDD 格式追加今天的日期,例如 ejb010307

先决条件

在配对区域中设置 Azure SQL 数据库故障转移组

在本节中,你将在配对区域中创建一个 Azure SQL 数据库故障转移组,以供 WLS 群集和应用程序使用。 在后面的节中,将 WLS 配置为将其会话数据和事务日志 (TLOG) 数据存储到此数据库。 这种做法与 Oracle 的最大可用性体系结构 (MAA) 保持一致。 本指南提供适用于 MAA 的 Azure 适应。 有关 MAA 的详细信息,请参阅 Oracle 最大可用性体系结构

首先,按照快速入门:创建单一数据库 - Azure SQL 数据库中的 Azure 门户步骤,创建主 Azure SQL 数据库。 按照“清理资源”部分的步骤进行操作,但不包括该部分。 阅读本文时请遵循以下说明,然后在创建并配置 Azure SQL 数据库后返回本文:

  1. 到达创建单一数据库部分时,请使用以下步骤:

    1. 在创建新资源组的步骤 4 中,请保存资源组名称值,例如 myResourceGroup
    2. 在步骤 5 中,保存数据库名称值 - 例如 mySampleDatabase
    3. 在创建服务器的步骤 6 中,使用以下步骤:
      1. 请保存唯一的服务器名称 - 例如 sqlserverprimary-ejb120623
      2. 对于“位置”,请选择“(美国)美国东部”
      3. 对于身份验证方法,选择使用 SQL 身份验证
      4. 保存服务器管理员登录值 - 例如 azureuser
      5. 保存密码值。
    4. 在步骤 8 中,对于工作负载环境,请选择开发。 查看说明,并考虑工作负载的其他选项。
    5. 在步骤 11 中,对于备份存储冗余,选择本地冗余备份存储。 请考虑备份的其他选项。 有关详细信息,请参阅 Azure SQL 数据库中的自动备份备份存储冗余部分。
    6. 在步骤 14 中,在防火墙规则配置中,对于允许 Azure 服务和资源访问此服务器,请选择
  2. 到达查询数据库部分时,请使用以下步骤:

    1. 在步骤 3 中,输入 SQL 身份验证服务器管理员登录信息以登录。

      注意

      如果登录失败,出现类似于不允许 IP 地址为“xx.xx.xx.xx”的客户端访问该服务器的错误消息,请在错误消息末尾选择 Allowlist IP xx.xx.xx.xx on server <your-sqlserver-name>。 等待服务器防火墙规则完成更新,然后再次选择确定

    2. 在步骤 5 中运行示例查询后,清除编辑器并创建表。

  1. 若要创建架构,请输入以下查询:

    1. 若要为 TLOG 创建架构,请输入以下查询:

      create table TLOG_msp1_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));
      create table TLOG_msp2_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));
      create table TLOG_msp3_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));
      create table TLOG_msp4_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));
      create table TLOG_msp5_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));
      create table wl_servlet_sessions (wl_id VARCHAR(100) NOT NULL, wl_context_path VARCHAR(100) NOT NULL, wl_is_new CHAR(1), wl_create_time DECIMAL(20), wl_is_valid CHAR(1), wl_session_values VARBINARY(MAX), wl_access_time DECIMAL(20), wl_max_inactive_interval INTEGER, PRIMARY KEY (wl_id, wl_context_path));
      

      成功运行后,你应该会看到消息 Query succeeded: Affected rows: 0

      这些数据库表用于存储 WLS 群集和应用的事务日志 (TLOG) 和会话数据。 有关详细信息,请参阅使用 JDBC TLOG 存储使用数据库进行持久存储(JDBC 持久性)

    2. 要为示例应用程序创建架构,请输入以下查询:

      CREATE TABLE COFFEE (ID NUMERIC(19) NOT NULL, NAME VARCHAR(255) NULL, PRICE FLOAT(32) NULL, PRIMARY KEY (ID));
      CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT NUMERIC(28) NULL, PRIMARY KEY (SEQ_NAME));
      

      成功运行后,你应该会看到消息 Query succeeded: Affected rows: 0

现在,你已完成文章“快速入门:创建单一数据库 - Azure SQL 数据库”。

接下来,按照为 Azure SQL 数据库配置故障转移组中的 Azure 门户步骤,创建 Azure SQL 数据库故障转移组。 只需以下部分:创建故障转移组测试计划的故障转移。 阅读本文时请使用以下步骤,然后在创建并配置 Azure SQL 数据库故障转移组后返回本文。

  1. 到达创建故障转移组部分时,请使用以下步骤:

    1. 在创建故障转移组的步骤 5 中,选择用于创建新的辅助服务器的选项,然后使用以下步骤:
      1. 输入并保存故障转移组名称 - 例如 failovergroupname-ejb120623
      2. 输入并保存唯一的服务器名称 - 例如 sqlserversecondary-ejb120623
      3. 输入与主服务器相同的服务器管理员和密码。
      4. 对于位置,请选择与用于主数据库的区域不同的区域。
      5. 请确保已选中允许 Azure 服务访问服务器
    2. 在步骤 5 中,若要配置组中的数据库,请选择在主服务器中创建的数据库,例如 mySampleDatabase
  2. 完成测试计划的故障转移部分中的所有步骤后,保持故障转移组页面打开,稍后将其用于 WLS 群集的故障转移测试。

获取故障转移组的 JDBC 连接字符串和数据库管理员用户名

以下步骤指导你获取故障转移组中数据库的 JDBC 连接字符串和数据库用户名。 这些值与主数据库的对应值不同。

  1. 在 Azure 门户中,找到你部署主数据库的资源组。

  2. 在资源列表中,选择类型为 SQL 数据库的主数据库。

  3. 在“设置”下,选择“连接字符串”。

  4. 按 JDBC

  5. JDBC(SQL 身份验证)下的文本区域中,选择复制图标,将 JDBC 连接字符串的值放在剪贴板上。

  6. 在文本编辑器中,粘贴该值。 可以在另一个步骤中编辑它。

  7. 返回资源组。

  8. 选择类型为 SQL Server 的资源,该资源包含你在前面步骤中刚刚查看的数据库。

  9. 数据管理下,选择故障转移组

  10. 在页面中间的表中,选择故障转移组。

  11. 读/写侦听器终结点下的文本区域中,选择复制图标,将 JDBC 连接字符串的值放在剪贴板上。

  12. 将值粘贴到文本编辑器中的新行上。 文本编辑器现在应该有类似于以下示例的行:

    jdbc:sqlserver://ejb010307db.database.windows.net:1433;database=ejb010307db;user=azureuser@ejb010307db;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
    ejb010307failover.database.windows.net
    
  13. 使用以下修改创建新行:

    1. 复制整个第一行。

    2. 更改 URL 的主机名部分,以使用读/写侦听器终结点行中的主机名。

    3. 删除 name=valuedatabase 对之后的所有内容。 换句话说,在 database=ejb010307db 之后立即删除包括 ; 和之后的所有内容。

      完成后,字符串应类似于以下示例:

      jdbc:sqlserver://ejb010307failover.database.windows.net:1433;database=ejb010307db
      

      该值为 JDBC 连接字符串。

  14. 在同一文本编辑器中,从原始 JDBC 连接字符串获取 user 参数的值,并将数据库名称替换为读/写侦听器终结点行的第一部分来派生数据库用户名。 继续上一个示例,该值将为 azureuser@ejb010307failover。 此值是数据库管理员用户名。

在 AKS 上设置和配置主 WLS 群集

在本节中,将使用 AKS 上的 Oracle WebLogic Server 产品/服务在 AKS 上创建 WLS 群集。 美国东部的群集是主要群集,配置为活动群集。

准备示例应用

在本节中,你将生成并打包一个示例 CRUD Java/JakartaEE 应用程序,稍后你将在 WLS 群集上部署和运行该应用程序以进行故障转移测试。

该应用使用 WebLogic Server JDBC 会话持久性来存储 HTTP 会话数据。 数据源 jdbc/WebLogicCafeDB 存储会话数据,以实现跨 WebLogic Server 群集启用故障转移和负载均衡。 它配置了一个持久性架构,将应用程序数据 coffee 持久化在同一个数据源 jdbc/WebLogicCafeDB 中。

使用以下步骤生成和打包示例:

  1. 使用以下命令克隆示例存储库,并签出与本文对应的标记:

    git clone https://github.com/Azure-Samples/azure-cafe.git
    cd azure-cafe
    git checkout 20231206
    

    如果你看到一条关于 Detached HEAD 的消息,可以放心地忽略。

  2. 使用以下命令导航到示例目录,然后编译并打包示例:

    cd weblogic-cafe
    mvn clean package
    

成功生成包后,可以在 <parent-path-to-your-local-clone>/azure-cafe/weblogic-cafe/target/weblogic-cafe.war 找到它。 如果没有看到该包,则必须先排查并解决问题,然后才能继续。

创建存储帐户和存储容器以保存示例应用程序

使用以下步骤创建存储帐户和容器。 其中一些步骤会将你定向到其他指南。 完成这些步骤后,你可以上传一个示例应用程序以在 WLS 上部署。

  1. 登录到 Azure 门户

  2. 按照创建存储帐户中的步骤创建存储帐户。 对本文中的值使用以下专用化:

    • 为存储帐户创建新的资源组。
    • 对于“区域”,请选择“美国东部”。
    • 对于存储帐户名,请使用与资源组名相同的值。
    • 对于“性能”,请选择“标准”。
    • 对于“冗余”,请选择“本地冗余存储 (LRS)”
    • 其余选项卡不需要专用化。
  3. 继续验证并创建帐户,然后返回本文。

  4. 按照快速入门:使用 Azure 门户上传、下载和列出 blob创建容器部分中的步骤,在帐户中创建存储容器。

  5. 使用同一篇文章,上传你之前按照上传块 blob 部分中的步骤生成的 azure-cafe/weblogic-cafe/target/weblogic-cafe.war 包。 然后,返回到本文。

部署 AKS 上的 WLS

使用以下步骤在 AKS 上部署 WLS:

  1. 在浏览器中打开 AKS 上的 Oracle WebLogic Server 产品/服务,然后选择创建。 应会看到产品/服务的基本信息窗格。

    Azure 门户的屏幕截图,显示了 AKS 上的 Oracle WebLogic Server“基本信息”窗格。

  2. 使用以下步骤填写基本信息窗格:

    1. 确保为订阅显示的值与“先决条件”部分中列出的角色的值相同。

    2. 必须在空资源组中部署产品/服务。 在资源组字段中,选择新建,然后为资源组填写唯一值 - 例如,wlsaks-eastus-20240109

    3. 实例详细信息下,选择区域,选择美国东部

    4. 凭据 WebLogic 下,分别提供 WebLogic 管理员WebLogic 模型加密的密码。 为 WebLogic 管理员保存用户名和密码。

    5. 可选基本配置下,对于接受可选配置的默认值?,选择。 可选配置会显示。

      Azure 门户的屏幕截图,显示了 AKS 上的 Oracle WebLogic Server“基本信息”窗格“可选基本配置”。

    6. 对于托管服务器的名称前缀,请填写 msp。 稍后可以使用前缀 TLOG_${serverName}_ 配置 WLS TLOG 表。 本文创建名为 TLOG_msp${index}_WLStore 的 TLOG 表。 如果需要其他托管服务器名称前缀,请确保该值与 Microsoft SQL server 表命名约定和实际表名匹配。

    7. 其他字段保留默认值。

  3. 选择下一步,转到 AKS 窗格。

  4. 图像选择下,提供以下信息:

    • 对于 Oracle 单点登录身份验证的用户名,请从前提条件中填写 Oracle SSO 用户名。
    • 对于 Oracle 单点登录身份验证的密码,请从前提条件中填写 Oracle SSO 凭据。

    Azure 门户的屏幕截图,显示了“AKS 上的 Oracle WebLogic Server”窗格 -“图像选择”。

  5. 应用程序下,使用以下步骤:

    1. 在“应用程序”部分的“部署应用程序?”旁边,选择“是”。
    2. 在“应用程序包 (.war,.ear,.jar) ”旁边,选择“浏览”。
    3. 开始输入上一节中存储帐户的名称。 当所需的存储帐户出现时,请选择它。
    4. 选择上一节中的存储容器。
    5. 选中在上一节中上传的 weblogic-cafe.war 旁边的复选框。 选择“选择” 。
    6. 其他字段保留默认值。

    Azure 门户的屏幕截图,显示了“AKS 上的 Oracle WebLogic Server”窗格 -“应用选择”。

  6. 选择下一步

  7. TLS/SSL 配置窗格中保留默认值,然后选择下一步转到负载均衡窗格。

    Azure 门户的屏幕截图,显示了“AKS 负载均衡上的 Oracle WebLogic Server 群集”窗格。

  8. 负载均衡窗格中,在为管理控制台创建入口。确保没有带有路径 /console* 的应用程序,这将导致与管理控制台路径冲突旁,选择

  9. 保留其他字段的默认值,然后选择下一步

  10. DNS 窗格中保留默认值,然后选择下一步转到数据库窗格。

    Azure 门户的屏幕截图,显示了“AKS 数据库上的 Oracle WebLogic Server 群集”窗格。

  11. 数据库窗格中输入以下值:

  12. 选择“查看 + 创建”。

  13. 等待正在运行最终验证... 成功完成,然后选择创建。 过了一会儿,应会看到部署页,其中显示了部署正在进行中

注意

如果在正在运行最终验证... 期间看到任何问题,请修复这些问题,然后重试。

根据所选地区的网络状况和其他活动,部署可能需要 70 分钟才能完成。 之后,你应当会看到部署页上显示文本“你的部署已完成”。

配置 TLOG 数据的存储

在本节中,你将使用 ConfigMap 替代 WLS 图像模型来配置 TLOG 数据的存储。 有关 ConfigMap 的详细信息,请参阅 WebLogic 部署工具模型 ConfigMap

本节需要一个安装了 Azure CLI 和 kubectl 的 Bash 终端。 使用以下步骤导出必要的 YAML,并配置 TLOG 数据的存储:

  1. 使用以下步骤连接到 AKS 群集:

    1. 打开 Azure 门户,然后转到在“在 AKS 上部署 WLS”部分中预配的资源组。
    2. 从资源列表中选择 AKS 群集,然后选择连接以连接到 AKS 群集。
    3. 选择 Azure CLI,并按照步骤连接到本地终端中的 AKS 群集。
  2. 使用以下步骤从 WLS 图像模型 YAML 获取 topology: 条目:

    1. 打开 Azure 门户,然后转到在“在 AKS 上部署 WLS”部分中预配的资源组。
    2. 选择“设置”>“部署”。 选择名称以 oracle.20210620-wls-on-aks 开头的第一个部署。
    3. 选择“输出”。 将 shellCmdtoOutputWlsImageModelYaml 值复制到剪贴板。 该值是一个 shell 命令,用于解码模型文件的 base64 字符串,并将内容保存在名为 model.yaml 的文件中。
    4. 将值粘贴到 Bash 终端中,并运行命令,以生成 model.yaml 文件。
    5. 编辑文件,以删除除顶级 topology: 条目以外的所有内容。 除了 topology: 之外,文件中不应有顶级条目。
    6. 保存文件。
  3. 使用以下步骤从 WLS 域模型 YAML 获取 ConfigMap 名称和命名空间名称:

    1. 打开 Azure 门户,转到在 AKS 上部署 WLS 部分中预配的资源组。

    2. 选择“设置”>“部署”。 选择名称以 oracle.20210620-wls-on-aks 开头的第一个部署。

    3. 选择“输出”。 将 shellCmdtoOutputWlsDomainYaml 的值复制到剪贴板。 该值是一个 shell 命令,用于解码模型文件的 base64 字符串,并将内容保存在 model.yaml 中。

    4. 将该值粘贴到终端,将得到一个名为 domain.yaml 的文件。

    5. domain.yaml 中查找以下值。

      • spec.configuration.model.configMap。 如果接受默认值,则此值为 sample-domain1-wdt-config-map
      • metadata.namespace。 如果接受默认值,则此值为 sample-domain1-ns

      为方便起见,可以使用以下命令将这些值保存为 shell 变量:

      export CONFIG_MAP_NAME=sample-domain1-wdt-config-map
      export WLS_NS=sample-domain1-ns
      
  4. 使用以下命令获取 ConfigMap YAML:

    kubectl get configmap ${CONFIG_MAP_NAME} -n ${WLS_NS} -o yaml > configMap.yaml
    
  5. 使用以下步骤创建 tlog-db-model.yaml 文件:

    1. 在文本编辑器中,创建名为 tlog-db-model.yaml 的空文件。

    2. 插入 model.yaml 的内容,添加一个空白行,然后插入 configMap.yaml 文件的内容。

  6. tlog-db-model.yaml 文件中,找到以 ListenPort: 8001 结尾的行。 将此文本附加到下一行,特别注意 TransactionLogJDBCStore 正好在 ListenPort 下方,以下代码段中的其余行缩进两行,如下例所示:

    TransactionLogJDBCStore:
      Enabled: true
      DataSource: jdbc/WebLogicCafeDB
      PrefixName: TLOG_${serverName}_
    

    完成的 tlog-db-model.yaml 应该非常接近以下示例:

    topology:
      Name: "@@ENV:CUSTOM_DOMAIN_NAME@@"
      ProductionModeEnabled: true
      AdminServerName: "admin-server"
      Cluster:
        "cluster-1":
          DynamicServers:
            ServerTemplate: "cluster-1-template"
            ServerNamePrefix: "@@ENV:MANAGED_SERVER_PREFIX@@"
            DynamicClusterSize: "@@PROP:CLUSTER_SIZE@@"
            MaxDynamicClusterSize: "@@PROP:CLUSTER_SIZE@@"
            MinDynamicClusterSize: "0"
            CalculatedListenPorts: false
      Server:
        "admin-server":
          ListenPort: 7001
      ServerTemplate:
        "cluster-1-template":
          Cluster: "cluster-1"
          ListenPort: 8001
          TransactionLogJDBCStore:
            Enabled: true
            DataSource: jdbc/WebLogicCafeDB
            PrefixName: TLOG_${serverName}_
      SecurityConfiguration:
        NodeManagerUsername: "@@SECRET:__weblogic-credentials__:username@@"
        NodeManagerPasswordEncrypted: "@@SECRET:__weblogic-credentials__:password@@"
    
    resources:
      JDBCSystemResource:
        jdbc/WebLogicCafeDB:
          Target: 'cluster-1'
          JdbcResource:
            JDBCDataSourceParams:
              JNDIName: [
                jdbc/WebLogicCafeDB
              ]
              GlobalTransactionsProtocol: None
            JDBCDriverParams:
              DriverName: com.microsoft.sqlserver.jdbc.SQLServerDriver
              URL: '@@SECRET:ds-secret-sqlserver-1709938597:url@@'
              PasswordEncrypted: '@@SECRET:ds-secret-sqlserver-1709938597:password@@'
              Properties:
                user:
                  Value: '@@SECRET:ds-secret-sqlserver-1709938597:user@@'
            JDBCConnectionPoolParams:
                TestTableName: SQL SELECT 1
                TestConnectionsOnReserve: true
    
  7. 使用 ConfigMap 替代 WLS 模型。 若要替代 WLS 模型,请将现有 ConfigMap 替换为新模型。 有关详细信息,请参阅 Oracle 文档中的更新现有模型。 运行以下命令以重新创建 ConfigMap

    export CM_NAME_FOR_MODEL=sample-domain1-wdt-config-map
    kubectl -n sample-domain1-ns delete configmap ${CM_NAME_FOR_MODEL}
    
    # replace path of tlog-db-model.yaml
    kubectl -n sample-domain1-ns create configmap ${CM_NAME_FOR_MODEL} \
      --from-file=tlog-db-model.yaml
    kubectl -n sample-domain1-ns label configmap ${CM_NAME_FOR_MODEL} \
      weblogic.domainUID=sample-domain1
    
  8. 使用以下命令重新启动 WLS 群集。 需要进行滚动更新才能使新模型正常工作。

    export RESTART_VERSION=$(kubectl -n sample-domain1-ns get domain sample-domain1 '-o=jsonpath={.spec.restartVersion}')
    # increase restart version
    export RESTART_VERSION=$((RESTART_VERSION + 1))
    
    kubectl -n sample-domain1-ns patch domain sample-domain1 \
        --type=json \
        '-p=[{"op": "replace", "path": "/spec/restartVersion", "value": "'${RESTART_VERSION}'" }]'
    

在继续操作之前,请确保 WLS Pod 正在运行。 可以使用以下命令来监视 Pod 的状态:

kubectl get pod -n sample-domain1-ns -w

注意

在本文中,WLS 模型包含在应用程序容器映像中,该映像由 AKS 产品/服务的 WLS 创建。 TLOG 是通过用包含模型文件的 WDT ConfigMap 替代现有模型并使用域 CRD configuration.model.configMap 字段引用映射来配置的。 在生产方案中,辅助映像是将 Model In Image 模型文件、应用程序存档文件和 WebLogic Deploy 工具安装包含在 Pod 中的推荐最佳方法。 此功能无需在 domain.spec.image 中指定的图像中提供这些文件。

使用 Azure 备份配置异地冗余

在本节中,你将使用 Azure 备份通过备份扩展(必须在群集中安装)来备份 AKS 群集。

使用以下步骤配置异地冗余:

  1. 在你在创建存储帐户和存储容器以容纳示例应用程序一节中创建的存储帐户中,为 AKS 备份扩展创建一个新的存储容器。

  2. 使用以下命令安装 AKS 备份扩展,并为群集启用 CSI 驱动程序和快照:

    #replace with your resource group name.
    export RG_NAME=wlsaks-eastus-20240109
    export AKS_NAME=$(az aks list \
        --resource-group ${RG_NAME} \
        --query "[0].name" \
        --output tsv)
    
    az aks update \
        --resource-group ${RG_NAME} \
        --name ${AKS_NAME} \
        --enable-disk-driver \
        --enable-file-driver \
        --enable-blob-driver \
        --enable-snapshot-controller --yes
    

    启用驱动程序大约需要 5 分钟。 在继续之前,请确保命令完整无误。

  1. 打开已部署 AKS 的资源组。 从资源列表中选择 AKS 群集。

  2. 在 AKS 登陆页上,选择设置>备份>安装扩展

  3. 安装 AKS 备份扩展页上,选择下一步。 选择在前一步骤中创建的存储帐户和 Blob 容器。 选择“下一步”,然后选择“创建”。 完成这一步大约需要五分钟。

  1. 打开 Azure 门户,在顶部的搜索栏中搜索备份保管库。 你应该看到它列在服务下。 选择该文件夹。

  2. 若要启用 AKS 备份,请按照使用 Azure 备份备份 Azure Kubernetes 服务中的步骤,但不包括“在 AKS 备份期间使用挂钩”部分。 按照以下步骤进行调整。

  3. 到达“创建备份保管库”部分时,进行以下调整:

    • 对于步骤 1,在区域下,选择美国东部。 在备份存储冗余下,使用全局冗余

      Azure 门户的屏幕截图,显示了“备份保管库基本信息”窗格。

    • 对于步骤 2,请启用跨区域还原

  4. 当到达“创建备份策略”部分时,当系统要求创建保留策略时,请进行以下调整:

    1. 在选择保管库标准的情况下添加保留规则。

      Azure 门户的屏幕截图,显示了保管库标准选项的选择。

    2. 选择 添加

  5. 到达“配置备份”部分时,请进行以下调整。 步骤 1-5 适用于 AKS 扩展安装。 跳过步骤 1-5,从步骤 6 开始。

    • 对于步骤 7,你会遇到权限错误。 选择授予权限以继续。 权限部署完成后,如果错误仍然存在,请选择重新验证以刷新角色分配。

      Azure 门户的屏幕截图,显示了 AKS 配置备份授权权限。

    • 对于步骤 10,找到选择要备份的资源,并进行以下调整:

      • 对于备份实例名称,请填写唯一名称。
      • 对于命名空间,为 WebLogic Operator 和 WebLogic Server 选择命名空间。 在本文中,选择 weblogic-operator-nssample-domain1-ns
      • 对于其他选项,请选择所有选项。 确保选择了包括机密

      Azure 门户的屏幕截图,显示了 AKS 配置备份选择资源。

    • 对于步骤 11,你会遇到角色分配错误。 从列表中选择数据源,然后选择分配缺少的角色以缓解错误。

      Azure 门户的屏幕截图,显示了 AKS 配置备份验证。

准备在次要区域中还原 WLS 群集

在本节中,你将准备还原次要区域中的 WLS 群集。 此处,次要区域是美国西部。 在还原之前,必须在美国西部区域安装一个带有 AKS 备份扩展的 AKS 群集。

配置 Azure 容器注册表以进行异地复制

使用以下步骤配置 Azure 容器注册表 (ACR) 以进行异地复制,其中包含在 AKS 上部署 WLS 部分中创建的 WLS 映像。 若要启用 ACR 复制,必须将其升级到高级定价计划。 有关详细信息,请参阅 Azure 容器注册表中的异地复制

  1. 打开在 AKS 上部署 WLS 部分中预配的资源组。 从资源列表中,选择名称以 wlsaksacr 开头的 ACR。
  2. 在 ACR 登陆页中,选择设置>属性。 对于定价计划,请选择高级,然后选择保存
  3. 在导航窗格中,选择服务>异地复制。 选择添加以在页面中添加复制区域。
  4. 创建复制页中,对于位置,选择美国西部,然后选择创建

部署完成后,ACR 将启用异地复制。

在次要区域中创建存储帐户

若要启用 AKS 备份扩展,必须提供一个在同一区域中具有空容器的存储帐户。

若要跨区域还原备份,必须提供一个备份数据冻结的暂存位置。 此暂存位置包括一个资源组和一个存储帐户,它们与要还原的目标群集位于同一区域和订阅中。

使用以下步骤创建存储帐户和容器。 其中一些步骤会将你定向到其他指南。

  1. 登录到 Azure 门户
  2. 按照创建存储帐户中的步骤创建存储帐户。 无需执行本文中的所有步骤。 填写基本信息窗格中显示的字段。 对于区域,选择美国西部,然后选择查看 + 创建以接受默认选项。 继续验证并创建帐户,然后返回本文。
  3. 按照快速入门:使用 Azure 门户上传、下载和列出 blob创建容器部分中的步骤为 AKS 备份扩展创建存储容器。
  4. 创建一个存储容器作为还原期间使用的暂存位置。

在次要区域中准备 AKS 群集

以下部分演示如何在次要区域中创建 AKS 群集。

创建新的 AKS 群集

本文公开了一个使用应用程序网关入口控制器的 WLS 应用程序。 在本节中,将在美国西部区域创建一个新的 AKS 群集。 然后,使用新的应用程序网关实例启用入口控制器加载项。 有关更多信息,请参阅使用新的应用程序网关实例为新的 AKS 群集启用入口控制器加载项

使用以下步骤创建 AKS 群集:

  1. 使用以下命令在次要区域中创建资源组:

    export RG_NAME_WESTUS=wlsaks-westus-20240109
    
    az group create --name ${RG_NAME_WESTUS} --location westus
    
  2. 使用以下命令部署启用了加载项的 AKS 群集:

    export AKS_NAME_WESTUS=${RG_NAME_WESTUS}aks
    export GATEWAY_NAME_WESTUS=${RG_NAME_WESTUS}gw
    
    az aks create \
        --resource-group ${RG_NAME_WESTUS} \
        --name ${AKS_NAME_WESTUS} \
        --network-plugin azure \
        --enable-managed-identity \
        --enable-addons ingress-appgw \
        --appgw-name ${GATEWAY_NAME_WESTUS} \
        --appgw-subnet-cidr "10.225.0.0/16" \
        --generate-ssh-keys
    

    此命令会自动在 AKS 节点资源组中创建一个名为 ${RG_NAME_WESTUS}gwStandard_v2 SKU 应用程序网关实例。 默认情况下,节点资源组命名为 MC_resource-group-name_cluster-name_location

    注意

    在 AKS 上部署 WLS部分中预配的 AKS 群集跨美国东部区域的三个可用性区域运行。 美国西部区域不支持可用性区域。 美国西部的 AKS 群集不是区域冗余群集。 如果生产环境需要区域冗余,请确保配对区域支持可用性区域。 有关详细信息,请参阅创建使用可用性区域的 Azure Kubernetes 服务 (AKS) 群集AKS 群集的可用性区域概述部分。

  3. 使用以下命令获取应用程序网关实例的公共 IP 地址。 保存 IP 地址,稍后将在本文中使用。

    export APPGW_ID=$(az aks show \
        --resource-group ${RG_NAME_WESTUS} \
        --name ${AKS_NAME_WESTUS} \
        --query 'addonProfiles.ingressApplicationGateway.config.effectiveApplicationGatewayId' \
        --output tsv)
    echo ${APPGW_ID}
    export APPGW_IP_ID=$(az network application-gateway show \
        --id ${APPGW_ID} \
        --query frontendIPConfigurations\[0\].publicIPAddress.id \
        --output tsv)
    echo ${APPGW_IP_ID}
    export APPGW_IP_ADDRESS=$(az network public-ip show \
        --id ${APPGW_IP_ID} \
        --query ipAddress \
        --output tsv)
    echo "App Gateway pubilc IP address: ${APPGW_IP_ADDRESS}"
    
  4. 使用以下命令将域名服务 (DNS) 名称标签附加到公共 IP 地址资源。 将 <your-chosen-DNS-name> 替换为适当的值,例如 ejb010316

    az network public-ip update --ids ${APPGW_IP_ID} --dns-name <your-chosen-DNS-name>
    
  5. 可以使用 az network public-ip show 来检查公共 IP 的完全限定的域名 (FQDN)。 DNS 标签为 ejb010316 的 FQDN 示例如下:

    az network public-ip show \
        --id ${APPGW_IP_ID} \
        --query dnsSettings.fqdn \
        --output tsv
    

    此命令会生成类似于以下示例的输出:

    ejb010316.westus.cloudapp.azure.com
    

注意

如果使用的是现有 AKS 群集,请在继续操作之前完成以下两项操作:

  • 按照为现有 AKS 群集启用应用程序网关入口控制器加载项中的步骤启用入口控制器加载项。
  • 如果在目标命名空间中运行 WLS,为了避免冲突,请清理 WebLogic Operator 命名空间和 WebLogic Server 命名空间中的 WLS 资源。 在本文中,AKS 上的 WLS 产品/服务在命名空间 weblogic-operator-ns 中预配了 WebLogic Operator,在命名空间 sample-domain1-ns 中预配了 WebLogic Server。 运行 kubectl delete namespace weblogic-operator-ns sample-domain1-ns 以删除两个命名空间。

启用 AKS 备份扩展

在继续之前,请使用以下步骤将 AKS 备份扩展安装到次要区域中的群集:

  1. 使用以下命令连接到美国西部区域的 AKS 群集:

    az aks get-credentials \
        --resource-group ${RG_NAME_WESTUS} \
        --name ${AKS_NAME_WESTUS}
    
  2. 使用以下命令为群集启用 CSI 驱动程序和快照:

    az aks update \
        --resource-group ${RG_NAME_WESTUS} \
        --name ${AKS_NAME_WESTUS} \
        --enable-disk-driver \
        --enable-file-driver \
        --enable-blob-driver \
        --enable-snapshot-controller --yes
    
  1. 打开已部署 AKS 的资源组。 从资源列表中选择 AKS 群集。

  2. 在 AKS 登陆页上,选择设置>备份>安装扩展

  3. 安装 AKS 备份扩展页上,选择下一步。 选择在前一步骤中创建的存储帐户和 Blob 容器。 选择“下一步”,然后选择“创建”。 完成这一步大约需要五分钟。

注意

为了节省成本,可以按照停止和启动 Azure Kubernetes 服务 (AKS) 群集中的步骤停止次要区域中的 AKS 群集。 在还原 WLS 群集之前启动它。

等待保管库标准备份发生

在 AKS 中,保管库标准层是唯一支持异地冗余跨区域还原的层。 如 AKS 备份支持哪个备份存储层?中所述,每天只有一个计划恢复点移动到保管库层。必须等待保管库标准备份发生。 一个好的下限是在完成上一步后等待 24 小时再继续。

停止主群集

主 WLS 群集和辅助 WLS 群集配置了相同的 TLOG 数据库。 只有一个群集可以同时拥有数据库。 为确保辅助群集正常工作,请停止主 WLS 群集。 在本文中,使用以下步骤停止 AKS 群集以禁用 WLS 群集:

  1. 打开 Azure 门户,然后转到在“在 AKS 上部署 WLS”部分中预配的资源组。
  2. 打开资源组中列出的 AKS 群集。
  3. 选择停止以停止 AKS 群集。 在继续之前,请确保部署完成。

还原 WLS 群集

AKS 备份支持操作层和保管库层备份。 仅存储于保管库层中的备份可用于在不同的区域(Azure 配对区域)中还原到群集。 根据备份策略中设置的保留规则,一天中的第一次成功备份将跨区域移动到 blob 容器。 有关详细信息,请参阅什么是 Azure Kubernetes 服务备份?AKS 备份支持哪个备份存储层?部分。

使用 Azure 备份配置异地冗余部分中配置异地冗余后,保管库层备份至少需要一天才能还原。

使用以下步骤还原 WLS 群集:

  1. 打开 Azure 门户,搜索备份中心。 在服务下选择备份中心

  2. 管理下,选择备份实例。 对数据源类型 Kubernetes Services 进行筛选,以找到在上一节中创建的备份实例。

  3. 选择备份实例以查看还原点列表。 在本文中,实例名称是一个类似于 wlsonaks*\wlsaksinstance20240109 的字符串。

    Azure 门户的屏幕截图,显示备份实例还原点。

  4. 选择最新的操作和保管库标准备份,然后选择更多选项。 选择还原以启动还原过程。

  5. 还原页上,默认窗格为还原点。 选择上一页以更改为基本信息窗格。 对于还原区域,请选择次要区域,然后选择下一步:还原点

    Azure 门户的屏幕截图,显示“还原基本信息”窗格。

  6. 还原点窗格中,对于选择要还原的层,请选择保管库存储,然后选择下一步: 还原参数

    Azure 门户的屏幕截图,显示“还原点”窗格。

  7. 还原参数窗格中,使用以下步骤:

    1. 对于选择目标群集,请选择在美国西部区域创建的 AKS 群集。 如以下屏幕截图所示,你遇到了权限问题。 选择授予权限以缓解错误。

    2. 对于备份暂存位置,请选择在美国西部创建的存储帐户。 如以下屏幕截图所示,你遇到了权限问题。 选择分配缺少的角色以缓解错误。

    3. 如果角色分配完成后仍发生错误,请选择重新验证以刷新权限。

      显示“还原参数”窗格的 Azure 门户的屏幕截图。

    4. 授予缺少的权限时,如果系统要求指定范围,请接受默认值。

    5. 选择“验证”。 应会看到消息验证已成功完成。 如果没有看到,请在继续操作之前排查和解决该问题。

  8. 选择下一步:查看 + 还原,然后选择还原。 还原 WLS 群集大约需要 10 分钟。

  9. 可以从备份中心>监视 + 报告>备份作业监视还原过程,如以下屏幕截图所示:

    Azure 门户的屏幕截图,显示了 CrossRegionRestore 正在进行。

  10. 选择刷新以查看最新进度。

  11. 在该过程无错误地完成后,停止备份 AKS 群集。 如果不这样做,在以后的步骤中访问 TLOG 数据库时会导致所有权冲突。

  12. 启动主群集。

设置 Azure 流量管理器

在本节中,将创建一个 Azure 流量管理器,用于将流量分发到全球 Azure 区域中面向公众的应用程序。 主终结点指向主 WLS 群集中的 Azure 应用程序网关,辅助终结点指向辅助 WLS 群集中的 Azure 应用程序网关。

按照快速入门:使用 Azure 门户创建流量管理器配置文件中的步骤,创建 Azure 流量管理器配置文件。 跳过“先决条件”部分。 只需以下部分:创建流量管理器配置文件添加流量管理器终结点测试流量管理器配置文件。 在浏览这些部分时,请使用以下步骤,然后在创建和配置 Azure 流量管理器后返回本文:

  1. 到达创建流量管理器配置文件部分时,请在步骤 2 创建流量管理器配置文件中,使用以下步骤:

    1. 名称保存唯一流量管理器配置文件名称 - 例如 tmprofile-ejb120623
    2. 资源组保存新的资源组名称 - 例如 myResourceGroupTM1
  2. 到达添加流量管理器终结点部分时,请使用以下步骤:

    1. 完成步骤从搜索结果中选择配置文件后,使用以下步骤:
      1. 在“设置”下,选择“配置”。
      2. 对于 DNS 生存时间 (TTL),输入 10
      3. 终结点监视器设置下,对于路径,输入 /weblogic/ready
      4. 快速终结点故障转移设置下,使用以下值:
        • 对于探测内部,请输入 10
        • 对于容许的失败次数,输入 3
        • 对于探测超时,请输入 5
      5. 选择“保存”。 等待它完成。
    2. 在添加主终结点 myPrimaryEndpoint 的步骤 4 中,使用以下步骤:
      1. 对于目标资源类型,请选择公共 IP 地址
      2. 选择选择公共 IP 地址下拉列表,然后输入你之前保存在美国东部 WLS 群集中部署的应用程序网关的 IP 地址。 应看到一个匹配的条目。 为公共 IP 地址选择它。
    3. 在添加故障转移/辅助终结点 myFailoverEndpoint 的步骤 6 中,使用以下步骤:
      1. 对于目标资源类型,请选择公共 IP 地址
      2. 选择选择公共 IP 地址下拉列表,然后输入你之前保存在美国西部 WLS 群集中部署的应用程序网关的 IP 地址。 应看到一个匹配的条目。 为公共 IP 地址选择它。
    4. 请稍等片刻。 选择刷新,直到监视状态达到以下状态:
      • 主终结点联机
      • 故障转移终结点已降级
  3. 到达测试流量管理器配置文件部分时,请使用以下步骤:

    1. 在小节检查 DNS 名称的步骤 3 中,保存流量管理器配置文件的 DNS 名称,例如 http://tmprofile-ejb120623.trafficmanager.net
    2. 在小节查看运行中的流量管理器中,使用以下步骤:
      1. 在步骤 1 和步骤 3 中,将 /weblogic/ready 附加到 Web 浏览器中流量管理器配置文件的 DNS 名称后,例如 http://tmprofile-ejb120623.trafficmanager.net/weblogic/ready。 你应该看到一个没有任何错误消息的空白页面。
      2. 在步骤 4 中,无法访问 /weblogic/ready,这是意料之中的,因为辅助群集已停止。
      3. 重新启用主终结点。

现在,在流量管理器配置文件中,主终结点的状态为启用联机,故障转移终结点的状态分别为启用已降级。 保持页面打开,以便稍后监视终结点状态。

测试从主服务器故障转移到辅助服务器

若要测试故障转移,请在本节中手动将主数据库服务器和 WLS 群集故障转移到辅助数据库服务器和 WLS 群集。

由于主群集已启动并运行,因此它充当活动群集,并处理由流量管理器配置文件路由的所有用户请求。

在浏览器的新选项卡中打开 Azure 流量管理器配置文件的 DNS 名称,并附加已部署应用的上下文根 /weblogic-cafe,例如 http://tmprofile-ejb120623.trafficmanager.net/weblogic-cafe。 创建一个带有名称和价格的新咖啡 - 例如,价格为 10咖啡 1。 此条目被持久化到数据库的应用程序数据表和会话表中。 看到的 UI 应该类似于以下屏幕截图:

示例应用程序 UI 的屏幕截图。

如果 UI 看起来不相似,请排除故障并解决问题,然后继续。

保持页面打开,以便以后可以将其用于故障转移测试。

故障转移到辅助站点

使用以下步骤从主群集故障转移到辅助群集。

首先,使用以下步骤停止主要 AKS 群集:

  1. 打开 Azure 门户,转到在 AKS 上部署 WLS 部分中预配的资源组。
  2. 打开资源组中列出的 AKS 群集。
  3. 选择停止以停止 AKS 群集。 在继续之前,请确保部署完成。

接下来,使用以下步骤将 Azure SQL 数据库从主服务器故障转移到辅助服务器。

  1. 切换到 Azure SQL 数据库故障转移组的浏览器选项卡。
  2. 选择故障转移>
  3. 等待它完成。

接下来,使用以下步骤启动辅助群集。

  1. 打开 Azure 门户,转到次要区域中具有 AKS 群集的资源组。
  2. 打开资源组中列出的 AKS 群集。
  3. 选择启动以启动 AKS 群集。 在继续之前,请确保部署完成。

最后,在终结点 myFailoverEndpoint 处于联机状态后,使用以下步骤验证示例应用:

  1. 切换到流量管理器的浏览器选项卡,然后刷新页面,直到看到终结点 myFailoverEndpoint监视状态值进入联机状态。

  2. 切换到示例应用的浏览器选项卡并刷新页面。 你应该在应用程序数据表和 UI 中显示的会话表中看到相同的数据,如以下屏幕截图所示:

    故障转移后示例应用程序 UI 的屏幕截图。

    如果未观察到此行为,可能是因为流量管理器需要时间来更新 DNS 以指向故障转移站点。 问题也可能是浏览器缓存了指向故障站点的 DNS 名称解析结果。 等待一段时间,然后再次刷新页面。

注意

生产就绪型 HA/DR 解决方案将负责定期将 WLS 配置从主群集持续复制到辅助群集。 有关如何执行此操作的信息,请参阅本文末尾的 Oracle 文档参考。

若要自动执行故障转移,请考虑对流量管理器指标和 Azure 自动化使用警报。 有关详细信息,请参阅流量管理器指标和警报流量管理器指标的警报部分和使用警报触发 Azure 自动化 runbook

故障回复到主站点

若要故障回复到主站点,必须确保两个群集具有镜像备份配置。 可以通过执行以下步骤实现此状态:

  1. 从步骤 4 开始,按照使用 Azure 备份配置异地冗余部分中的步骤,在美国西部区域启用 AKS 群集备份。
  2. 按照准备在次要区域中还原 WLS 群集部分中的步骤,将最新的保管库层备份还原到美国东部区域的群集。 跳过已完成的步骤。
  3. 使用故障转移到辅助站点部分中的类似步骤,故障回复到主站点,包括数据库服务器和群集。

清理资源

如果不打算继续使用 WLS 群集和其他组件,请使用以下步骤删除资源组以清理本教程中使用的资源:

  1. 在 Azure 门户顶部的搜索框中,输入备份保管库,并从搜索结果中选择备份保管库。
  2. 选择管理>属性>软删除>更新。 在启用软删除旁边,取消选中复选框。
  3. 选择管理>备份实例。 选择你创建的实例并将其删除。
  4. 在 Azure 门户顶部的搜索框中输入 Azure SQL Database 服务器的资源组名称(例如 myResourceGroup),并从搜索结果中选择匹配的资源组。
  5. 选择“删除资源组”
  6. 输入资源组名称以确认删除中,输入资源组名称。
  7. 选择“删除”。
  8. 对流量管理器的资源组重复步骤 4-7,例如 myResourceGroupTM1
  9. 对主 WLS 群集的资源组重复步骤 4-7,例如 wls-aks-eastus-20240109
  10. 对辅助 WLS 群集的资源组重复步骤 4-7,例如 wls-aks-westus-20240109

后续步骤

在本教程中,你将设置一个 HA/DR 解决方案,该解决方案由一个主动-被动应用程序基础结构层和一个主动-被动数据库层组成,其中这两个层跨越两个地理位置不同的站点。 在第一个站点中,应用程序基础结构层和数据库层都处于活动状态。 在第二个站点上,辅助域已关闭,辅助数据库处于备用状态。

继续浏览以下参考,以获取更多用于生成 HA/DR 解决方案并在 Azure 上运行 WLS 的选项: