从 Azure Shared Caching 迁移到角色中缓存

重要

Microsoft 建议所有新开发使用 Azure Redis 缓存。 有关选择 Azure 缓存产品/服务的当前文档和指南,请参阅 哪种 Azure 缓存产品/服务适合我?

使用Microsoft Azure 共享缓存迁移到In-Role缓存的应用程序可以通过对应用程序进行最少的更改来完成。 由于In-Role缓存使用与共享缓存相同的 API,因此可以重复使用使用共享缓存访问缓存的现有代码来访问In-Role角色内缓存。 本主题演示如何进行必要的配置和应用程序更改,以迁移共享缓存应用程序以使用In-Role缓存。

注意

有关使用 In-Role 缓存的好处的详细信息,请参阅 关于 Azure 缓存In-Role缓存

迁移步骤

以下部分介绍了迁移Microsoft Azure 共享缓存应用程序以使用In-Role缓存所需的步骤。

  • 确定缓存群集部署拓扑

    • 配置专用的角色缓存群集

    • 配置共存角色缓存群集

  • 配置缓存群集存储帐户

  • 配置命名缓存设置

  • 配置缓存客户端

    • 删除 Shared Caching 配置

    • 使用缓存 NuGet 程序包配置缓存客户端

  • 迁移 ASP.NET 会话和页面输出缓存

确定缓存群集部署拓扑

In-Role缓存提供在 Azure 角色上托管缓存服务的功能。 在此模型中,缓存是你的云服务的一部分。 选择云服务中的一个角色来托管In-Role缓存。 该角色的运行实例将加入内存资源以形成缓存群集。 这个专用缓存群集仅对同一部署内的角色可用。 In-Role缓存有两个部署拓扑:专用和并置。

缓存群集部署拓扑 说明

专用角色缓存

辅助角色实例专门用于缓存。

共存角色缓存

缓存与角色所托管的主要应用程序共享 VM 资源(带宽、CPU 和内存)。

如果应用程序在其现有角色中有未利用的内存,则可在这些角色上配置共存角色缓存群集,并将该额外内存用于缓存。 如果角色中没有足够的额外内存来支持缓存群集,则既可向外扩展角色,也可添加缓存辅助角色并配置专用角色缓存群集。

  • 配置专用的角色缓存群集

  • 配置共存角色缓存群集

配置专用的角色缓存群集

若要配置专用的角色缓存群集,请将缓存辅助角色添加到项目中。 若要添加缓存辅助角色,请在解决方案资源管理器中展开 Azure(如果尚未展开)。

注意

专用角色缓存仅受辅助角色支持,不能在 Web 角色上配置。

右键单击 Azure 项目中的“角色”文件夹,然后依次选择“添加”“新建辅助角色项目”“缓存辅助角色”。 在“名称”框中键入所需的角色名称,然后单击“添加”

Add Cache Worker Role

已为专用角色缓存预配置了缓存辅助角色。 若要查看设置,请右键单击 Azure 角色 文件夹中新添加的角色,然后选择 “属性”。

Cache Worker Role Properties Context Menu

切换到“Caching”选项卡以查看缓存辅助角色的缓存属性。

Cache Worker Role Properties

由于此角色是缓存辅助角色,因此“启用 Caching”复选框已选中,并且“专用角色”缓存处于选中状态。 缓存设置将在“命名缓存设置”部分进行配置。 In-Role缓存和Microsoft Azure 共享缓存之间的缓存设置存在一些差异。 以下部分介绍了这些设置:配置缓存群集存储帐户并配置命名缓存设置。

切换到“配置”选项卡。

Role Instance VM Size and Instance Count

默认“实例计数”1,默认“VM 大小”为“小”。 修改这些设置,使之与所需配置匹配。 Azure In-Role缓存的容量规划注意事项指南可以提供有关选择哪些设置以满足应用程序的缓存要求的指导。

添加缓存辅助角色并配置虚拟机大小和实例计数后,可以按以下“配置命名缓存设置”部分中所述配置缓存。

配置共存角色缓存群集

若要配置共同定位的角色缓存群集,请右键单击 Azure 角色 文件夹中的所需角色,然后选择 “属性”。

Web Role Properties

切换到“Caching”选项卡,选中“启用 Caching”复选框,并指定所需的缓存选项。 默认配置将分配角色实例中 30% 的内存用于缓存。 调整“缓存大小(%)”滑块可配置所需的缓存大小。

Caching Role Properties

确定缓存大小时,一个很基本的近似公式是用角色实例的数量乘以基于虚拟机大小的内存量,然后使用指定的百分比。 请注意,此公式是一个非常基本的近似值,有关预配所需大小的缓存所需的设置的详细信息,请参阅 Azure In-Role 缓存的容量规划注意事项。 如果需要其他角色实例或更大的虚拟机大小才能成功托管缓存群集,则可在“配置”选项卡上进行配置。

配置缓存群集存储帐户

In-Role缓存需要 Azure 存储帐户。 此存储帐户用于保存从组成缓存群集的所有虚拟机访问的缓存群集的相关配置数据。 可以在缓存群集角色属性页的“Caching”选项卡中的“命名缓存设置”正上方指定此存储帐户。

Cache Cluster Storage Account

重要

如果没有配置此存储帐户,则角色将无法启动。

配置命名缓存设置

缓存设置在“命名缓存设置”部分进行配置。

Named Cache Settings

In-Role缓存和Microsoft Azure 共享缓存之间的缓存设置存在一些差异。

功能 In-Role缓存支持 Microsoft Azure 共享缓存支持

名称

配置“默认”缓存,需要时可配置附加命名缓存。

仅默认缓存。

高可用性

为缓存中的项目提供高可用性。 如果一个角色关闭,仍然可以使用缓存中的项目的备份副本。

没有高可用性。

通知

通知功能允许应用程序在缓存群集上发生各种缓存操作时接收异步通知。

有关详细信息,请参阅 Azure In-Role 缓存中的通知

不支持。

逐出策略

选项包括 LRU(最近一次使用)或“无”。 默认值为 LRU

仅 LRU。

生存时间 (分钟)

缓存中的项目的默认过期时间是 10 分钟,但这是可以配置的。 还可以使用 “添加”“放置 ”重载将项添加到缓存时指定添加到缓存中的单个项的过期时间。

默认过期时间是 24 小时,并且是不可配置的。 可以使用 “添加 ”和 “放置 ”的重载配置添加到缓存中的单个项的过期时间。

有效期限类型

有三种类型的“过期类型”:“”、“绝对”和“可调窗口”。 如果指定了“绝对”,则当项目添加到缓存中时,由“生存时间(分钟)”指定的过期时间间隔便开始计时。 如果指定了“滑动窗口”,则每次访问缓存中的项目时,时间间隔将被重置。 如果指定了“无”,则“生存时间(分钟)”必须设置为“0”,项目将不会过期。 默认值为“绝对”

有关详细信息,请参阅 Azure In-Role 缓存中的过期和逐出

过期策略是绝对的。 项目添加到缓存中时,过期时间间隔开始计时。

配置缓存客户端

配置缓存群集后,下一步是添加必要的配置和引用以便缓存客户端可以访问缓存。 在In-Role缓存中,客户端可以是与缓存群集相同的部署中的任何角色。 访问共存角色缓存群集时,客户端可以是托管缓存群集的角色本身。 若要配置缓存客户端,请针对每个可访问缓存的角色执行以下步骤。

  • 删除 Shared Caching 配置

  • 使用缓存 NuGet 程序包配置缓存客户端

删除 Shared Caching 配置

在为In-Role缓存配置客户端角色之前,必须删除现有的共享缓存配置和程序集引用。 如果使用共享缓存 NuGet包配置了共享缓存,则可以通过卸载共享缓存 NuGet包来删除配置,否则必须手动删除该配置。

  • 卸载 Shared Caching NuGet 程序包

  • 手动删除 Shared Caching 配置

卸载 Shared Caching NuGet 程序包

若要卸载共享缓存 NuGet包,请在解决方案资源管理器中右键单击所需的客户端角色,然后选择“管理NuGet包”。 选择“已安装的程序包”节点,然后在“搜索已安装的程序包”框中键入“Caching”。 选择“Azure Shared Caching”,单击“卸载”,然后单击“关闭”

Uninstall Shared Caching NuGet Package

注意

如果列表中没有Microsoft Azure 共享缓存 NuGet包,请单击“关闭”,然后按照“手动删除共享缓存配置”中的步骤操作。

卸载共享缓存 NuGet包会删除客户端角色中的app.configweb.config共享缓存程序集和共享缓存条目。 由于卸载NuGet包时可能无法删除某些自定义设置,请打开web.configapp.config确保完全删除以下元素。

  • 确保已从 configSections 元素中删除 dataCacheClients 条目。 请勿删除整个 configSections 元素,只需删除 dataCacheClients 条目(如果存在)。

    <configSections>
      <!-- Existing sections omitted for clarity. -->
      <section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />
    </configSections>
    
  • 确保已删除 dataCacheClients 节。 dataCacheClients 节将类似于以下示例。

    <dataCacheClients>
      <dataCacheClient name="default">
        <hosts>
          <host name="MyCacheNamespace.cache.windows.net" cachePort="22233" />
        </hosts>
    
        <securityProperties mode="Message">
          <messageSecurity 
            authorizationInfo="Your authorization token will be here.">
          </messageSecurity>
        </securityProperties>
      </dataCacheClient>
    </dataCacheClients>
    

删除共享缓存配置后,可以使用“Caching NuGet包”部分配置缓存客户端,如以下“配置缓存客户端”中所述。

手动删除 Shared Caching 配置

若要手动删除共享缓存配置,必须从或web.config中删除共享缓存程序集引用和共享缓存配置app.config

若要删除共享缓存程序集引用,请在解决方案资源管理器中选择所需的客户端角色,然后展开“引用”文件夹。 对于以下列表中的每个程序集,可在“解决方案资源管理器”中的“引用”文件夹内右键单击相应的程序集,然后选择“删除”。 如果客户端角色是一个 Web 角色,请同时删除“Microsoft.Web.DistributedCache”

  • Microsoft.ApplicationServer.Caching.Client

  • Microsoft.ApplicationServer.Caching.Core

  • Microsoft.WindowsFabric.Common

  • Microsoft.WindowsFabric.Data.Common

若要删除共享缓存配置,请打开web.config客户端角色或app.config客户端角色,并删除以下两项。

  • dataCacheClients 元素中删除 configSections 条目。 请勿删除整个 configSections 元素,只需删除 dataCacheClients 条目(如果存在)。

    <configSections>
      <!-- Existing sections omitted for clarity. -->
      <section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />
    </configSections>
    
  • 删除类似于以下示例的 dataCacheClients 部分。

    <dataCacheClients>
      <dataCacheClient name="default">
        <hosts>
          <host name="MyCacheNamespace.cache.windows.net" cachePort="22233" />
        </hosts>
    
        <securityProperties mode="Message">
          <messageSecurity 
            authorizationInfo="Your authorization token will be here.">
          </messageSecurity>
        </securityProperties>
      </dataCacheClient>
    </dataCacheClients>
    

删除这些项后,可以遵照下一部分中的步骤来配置缓存客户端。

使用缓存 NuGet 程序包配置缓存客户端

In-Role缓存提供了一个NuGet包,用于添加必要的配置和程序集引用,以允许客户端角色访问缓存群集。

重要

在使用 In-Role 缓存NuGet包配置缓存客户端之前,请确保共享缓存配置已完全从web.config客户端角色或app.config客户端角色中删除,如上一部分所述。

若要使用In-Role缓存NuGet包,请在解决方案资源管理器中右键单击所需的客户端角色,然后选择“管理NuGet包”。

Manage NuGet Packages

选择“Azure Caching”,单击“安装”,然后单击“我接受”。 将程序包安装到角色后,请单击“关闭”以关闭“管理 NuGet 程序包”窗口。

注意

如果“Azure Caching”未出现在列表中,请在“联机搜索”文本框中键入“WindowsAzure.Caching”

Enable Caching using NuGet

将In-Role缓存NuGet包安装到客户端角色时,它会添加所需的配置和程序集引用,以便客户端角色可以访问所需的缓存群集。

在该角色的 web.configapp.config 中,将添加几个项目。

  1. 两个节将添加到 configSections,即 dataCacheClientscacheDiagnostics

    <configSections>
      <!-- Existing sections omitted for clarity. -->
      <section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />
      <section name="cacheDiagnostics" type="Microsoft.ApplicationServer.Caching.AzureCommon.DiagnosticsConfigurationSection, Microsoft.ApplicationServer.Caching.AzureCommon" allowLocation="true" allowDefinition="Everywhere" />
    </configSections>
    
  2. dataCacheClients 节将添加到 configuration 节。

    <dataCacheClients>
      <dataCacheClient name="default">
        <autoDiscover isEnabled="true" identifier="[cache cluster role name]" />
        <!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->
      </dataCacheClient>
    </dataCacheClients>
    

    [缓存群集角色名称] 替换为承载缓存群集的角色的名称。 在以下示例中,已将 [cache cluster role name] 替换为 CacheWorkerRole1

    <autoDiscover isEnabled="true" identifier="CacheWorkerRole1" />
    

    警告

    必须正确配置此设置,否则客户端将无法访问缓存。 如果标识符不映射到角色,则当使用内部 DataCacheException 访问缓存时,将引发 TargetInvocationException,其中包含类似于以下内容的消息: The role [cache cluster role name] was not found in the current deployment 如果标识符映射到部署中不托管缓存群集的角色,则会引发 InvalidOperationException 并显示以下消息: No Endpoints found

  3. cacheDiagnostics 节也将添加到 configuration 节。

    <cacheDiagnostics>
      <crashDump dumpLevel="Off" dumpStorageQuotaInMB="100" />
    </cacheDiagnostics>
    

    注意

    默认情况下禁用缓存客户端的故障转储,并由本部分控制。 有关缓存诊断的详细信息,请参阅 Azure In-Role缓存故障排除和诊断

In-Role缓存NuGet包还会将 ClientDiagnosticLevel 设置添加到ConfigurationSettings缓存客户端角色中ServiceConfiguration.cscfg。 以下示例是WebRole1包含 ClientDiagnosticLevel 1 的文件的节ServiceConfiguration.cscfg,该文件是默认的 ClientDiagnosticLevel

<Role name="WebRole1">
  <Instances count="1" />
  <ConfigurationSettings>
    <!-- Other settings omitted for clarity... -->
    <Setting name="Microsoft.WindowsAzure.Plugins.Caching.ClientDiagnosticLevel" value="1" />
  </ConfigurationSettings>
</Role>

注意

有关缓存诊断级别的详细信息,请参阅 Azure In-Role缓存故障排除和诊断

除了添加所需的配置外,In-Role缓存NuGet包还添加了以下程序集引用。

  • Microsoft.ApplicationServer.Caching.Client.dll

  • Microsoft.ApplicationServer.Caching.Core.dll

  • Microsoft.ApplicationServer.Caching.AzureCommon.dll

  • Microsoft.ApplicationServer.Caching.AzureClientHelper.dll

  • Microsoft.WindowsFabric.Common.dll

  • Microsoft.WindowsFabric.Data.Common.dll

如果角色是 Web 角色,则还会添加以下程序集引用。

  • Microsoft.Web.DistributedCache.dll

注意

In-Role缓存和Microsoft Azure 共享缓存共享相同的 API,尽管程序集名称相同,但程序集本身不同,并且位于不同的位置。 In-Role缓存NuGet包将删除共享缓存程序集引用,并添加正确的In-Role缓存程序集引用。 In-Role缓存程序集位于 C:\Program Files\Microsoft SDKs\Azure\.NET SDK\2012-10\ref\Caching 文件夹中。

迁移 ASP.NET 会话和页面输出缓存

ASP.NET Web 角色客户端从Microsoft Azure 共享缓存迁移到In-Role缓存后,只需对 ASP.NET 会话状态或页面输出Caching存储在角色内缓存中的最小更改。 若要启用在缓存中存储 ASP.NET 会话状态,请向 system.web 中的 web.config 添加以下节。

注意

如果 ASP.NET Web 角色已配置为使用会话状态提供程序进行Microsoft Azure缓存,则此部分已存在。

<sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider">
  <providers>
    <add name="AppFabricCacheSessionStoreProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" useBlobMode="true" dataCacheClientName="default" />
  </providers>
</sessionState>

更新 cacheName 以指定缓存群集中用于保存会话状态的缓存。 使用 default 可指定默认缓存。

若要启用在缓存中存储页面输出缓存,请将以下节添加到 system.web 中。

注意

如果已将 ASP.NET Web 角色配置为使用 Microsoft Azure 缓存的输出缓存提供程序,则此部分已存在。

<caching>
  <outputCache defaultProvider="DistributedCache">
    <providers>
      <add name="DistributedCache" type="Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider, Microsoft.Web.DistributedCache" cacheName="default" dataCacheClientName="default" />
    </providers>
  </outputCache>
</caching>

更新 cacheName 以指定缓存群集中用于保存会话状态的缓存。 使用 default 可指定默认缓存。

OutputCache 指令添加到你希望为其缓存输出的每个页面。

<%@ OutputCache Duration="60" VaryByParam="*" %>

在此示例中,缓存的页面数据在缓存中保留 60 秒,并且每个参数组合会缓存不同版本的页面。 有关可用选项的详细信息,请参阅 OutputCache 指令