使用 SQL Server In-Memory 存储 ASP.NET 的会话状态 已翻译 100%

oschina 投递于 2014/07/08 10:10 (共 13 段, 翻译完成于 09-27)
阅读 2826
收藏 15
2
加载中

从以前的 “classic” ASP 到目前的 ASP.NET 4.5 Web Forms,很多开发者依赖ASP.NET 会话状态作为重要的临时保存每个用户的数据的主要手段。 它的特征是在用户访问web应用程序的过程中,允许开发者存储和读取用户的数据。 会话数据是自动从存储中持续保存和恢复,并且自动过期删除。

瑞新
翻译于 2014/07/08 13:21
1

问题


使用Session State的替代方案这些内容超出了本文的范围。 对于依赖Session State的应用程序也有陷阱,最常见的是访问每个用户,每个请求的Session基础数据。这种独特的访问是维持Session State的一致性的一种方式,并且是通过设计实现了这种方式。 如果你对这样残暴细节的设计感兴趣, 他们在题名为“锁定会话状态数据”章节这里解释了。会话状态常见于ASP.NET Web窗体应用程序,而ASP.NET MVC在较小程度上使用了TempData(POST数据到GET作为例子) 。

AndyLam
翻译于 2014/07/14 01:56
1

如果你的应用程序需要Session State高可用,同时支持跨web farm的部署,你可以从Microsoft提供的选项,仅限于SQL Server或者AppFabric Caching.SQL Server有一个增加的优势,它可以跨越数据中心来提供地理冗余(geo-redundancy).而AppFabric则受限于单一数据中心.实际应用中,这两种解决方案都工作良好.但是,传统的SQL Server实现常常遇到瓶颈,产生的原因是基于单一磁盘的表存在竞争.竞争导致阻塞,死锁,或者其它不友好的变化.这影响了它存储和恢复会话的时间.另外,在删除操作过程中,当先前的会话数据由于锁的扩大和竞争的延续而清除了,这也会存在问题.

gones945
翻译于 2014/09/20 23:37
1

SQL Server 2014的新选项

为了解决老版本SQL Server安装包的性能问题,SQL Server团队最近发布了新的安装包“Microsoft ASP.NET Session State provider for SQL Sever In-Memory”作为NugGet包.在this case study中有这个安装包不可思议的性能提升的证明.它在ASP.NET应用程序中使用Session State,每秒处理250,000个请求!这个新实现使用了SQL Server 2014称为"Hekaton"的内存优化表特性.这需要这个产品的2014版本.这个安装包如何在老版本SQL Server会话状态安装包上有所提升的呢?

  1. 会话存储的持续性是通过内存优化表而不是磁盘表.对于繁重的访问模型,如存储会话状态等,内存优化表是全事务的,可持续性和理想的.这类表使用无锁数据结构和优化的,多版本的并发控制.

  2. 为了更进一步提升性能,可用本地编译存储过程来恢复和存储会话数据. 本质上,这是一种新型的存储过程,它被编译为本地机器代码.

gones945
翻译于 2014/09/21 21:50
1

这两个SQL 2014产品特性,解决了主要的性能和竞争问题,这些问题存在于基于磁盘实现的旧的传统的SQL Server安装包.安装和配置这个程序是相当直接的.通过NuGet包管理控制台,可以按照下面的方式安装:  
   
Install-Package Microsoft.Web.SessionState.SqlInMemory.  

在你的应用程序中,NuGet包将增加一个到Microsoft.Web.SessionState.SqlInMemory的引用,同时也会增加一个名为ASPStateInMemory.sql的脚本文件来安装SQL Server 2014 Session State数据库.这个文件包含了必须的DDL来安装数据库.在SQL脚本中有一些项,你想要审查或者最可能审查或修改的:

  1. 这个数据库的名字默认是ASPStateInMemory.

  2. 数据库的主文件组路径.

  3. 数据库的MEMORY_OPTIMIZED_DATA文件组路径.

  4. BUCKET_COUNT的大小信息,它基于会话中的项的预期大小.

  5. 让会话中的表可持久非可持久的决定(涉及到是否需要会话高可用)

gones945
翻译于 2014/09/21 23:22
1

以上的第五个部分,需要对已经存在的SQL Server会话数据库作一些分析,它可能像计算传统ASP.NET SQL Server会话模式里BLOB列的DATALENGTH()一样简单.对于InProc或者StateServer来说,决定会话项的平均大小会更加困难,但可以通过捕获w3wp.exe或者StateServer进程的内存dump来实现,其间检查在会话字典中的项的数目和大小.对于InProc或者StateServer,关于会话中的项的数目,有性能计数.最好的建议总是测试和调整.

gones945
翻译于 2014/09/22 22:59
1

让基于内存的会话高可用

默认,SQL Server 2014基于内存会话的内存优化表是标记为非持久的.这意味着,这些表里的数据变化是过渡性的一致.这些变化没有记录在日志中,这意味着如果SQL Server重启了,服务器重启了或者任何形式的故障恢复发生(FCI或者AlwaysOn),所有的会话数据将丢失.设置这个默认值是因为性能.为了让这些内存优化表可持续,需要在ASPStateInMemory.sql脚本中做三点改变.在脚本中有一些注释解释了为何需要做这些改变.

  1. 按下面的方式修改SessionItems表. 

    1. 修改WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY)

    2. WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_AND_DATA)

    3. 取消语句的注释(注意最后的逗号): Id bigint IDENTITY,

    4. 取消语句的注释(注意最后的逗号,根据需要修改1000000 * 2为real值,在这个语句前读T-SQL注释以选择一个起始值): CONSTRAINT [PK_SessionItems_Id] PRIMARY KEY NONCLUSTERED HASH (Id) WITH (BUCKET_COUNT = 2000000),          

  2. 修改会话表

    1. 修改WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY

    2. WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_AND_DATA)

gones945
翻译于 2014/09/22 23:37
1

只要做了这些修改,我们可以让数据库成为部分SQL Server AlwaysOn可用性组.当故障恢复时,会话数据将会保留.由于增加的重试逻辑,所以,当一个自动的或者人为的故障恢复发生时,连接池中的过期连接不会产生异常抛出给终端用户.

请注意,即使我们设置表为非可持续的,将会话数据库放入SQL Server AlwaysOn可用性组,但会话表中的数据在复制(只有schema可用)时不可用.对于客户负荷,这个"schema only"复制模型,通过使用非可持续内存优化表,已足够来保证性能提升.

gones945
翻译于 2014/09/23 23:45
1

这个最简单的高可用的拓扑对SQL Server In-Memory来说是最合适的,它与下面的类似:

  1. 位于子网(数据中心)A的SQL Server 2014 Node 1

  2. 位于子网(数据中心)B的SQL Server 2014 Node 2

  3. 位于子网(数据中心)C的文件共享

image

这个拓扑提供了地理冗余,自动故障恢复和维持了1/3的数据中心完整的丢失连接.Windows Server 2012 R2的动态特性,使得自动维持2个数据中心的丢失连接成为可能.(最后的男人的场景[last man standing scenario]).

gones945
翻译于 2014/09/24 23:33
1

ASP.NET 配置文件

在 ASP.NET web 应用程序的配置文件web.config中,配置一个新的provider,并且按照下面编辑它。

<sessionState mode="Custom" customProvider="SqlInMemoryProvider">  
  <providers>    
    <add name="SqlInMemoryProvider"    
         type="Microsoft.Web.SessionState.SqlInMemoryProvider"    
         connectionString="Data Source=AGAspNet; Initial Catalog=ASPStateInMemory;Integrated Security=True;" />    
  </providers>    
</sessionState>

在上面的代码片段中, ‘AGAspNet’  是SQL Server 2014 中永远可用的监听者名字。

瑞新
翻译于 2014/07/08 13:26
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(6)

徐纯洁哥哥
徐纯洁哥哥

引用来自“诸葛囧明”的评论

到2014才搞,被linux系统甩开多少差距了

引用来自“HYUO”的评论

这和Linux有半毛钱关系吗?
服务端工具,微软在这方面都要晚*nix一步,这个东东用redis实现不要太自在
HYUO
HYUO

引用来自“诸葛囧明”的评论

到2014才搞,被linux系统甩开多少差距了
这和Linux有半毛钱关系吗?
jonnykay
jonnykay
翻译太烂了,完全看不懂啊
iiiiiiiii
iiiiiiiii
微软大法好
丶超_
丶超_
翻译的这么烂就不要拿出来推荐了好吗!!!!
徐纯洁哥哥
徐纯洁哥哥
到2014才搞,被linux系统甩开多少差距了
返回顶部
顶部