微软分布式缓存AppFabric(Velocity)学习-缓存概念(三)
接上一篇
4.过期和回收(Expiration and Eviction)
Velocity中,对象并不是一直驻留在内存中。除了显示使用Remove方法将其移除,还有可能过期机制或回收机制从缓存群集中去除。
4.1过期机制(Expiration)
缓存过期机制允许缓存群集自动从缓存中删除缓存对象。使用Put或Add方法时,有一个超时时间的可选参数,用来决定缓存在内存中的生存时间。如果缓存对象没有设置超时时间,命名缓存(Named Cache)中的配置将决定对象的生成时间。
如果对象在并发时被锁,对象不会因到期时间而从内存中移除。但当并发锁解锁时,对象将立即从内存只移除。
本地缓存失效机制(ocal Cache Invalidation)
一旦对象被下载到本地缓存,您的应用程序将一直使用这些对象,直到他们是失效,无论是否由另一个客户端上缓存群集更新这些对象。出于这个原因,最好是不经常变化的数据缓存到本地。有两种类型的本地缓存失效机制:基于超时的失效和基于通知的失效。
基于超时的失效机制(Timeout-based Invalidation)
缓存到本地的对象将一直驻留在内存中直到到达它的超时时间,超时时间是通过客户端配制指定的(
ttlValue
in the app.config file). 。对象从内存中移除后,应用程序再次访问时将从缓存群集中重新获取。超时机制的特性决定着它不会对缓存群集中对象实时更新,建议更新不频繁的数据使用此机制。
基于通知的失效机制(Notification-based Invalidation)
在使用是路由客户端时,可以使用缓存通知来自动更新本地缓存数据以减少应用程序使用过期数据的可能性。
当使用缓存通知时,应用程序会定时检查缓存群集中是否有新的可用通知。查询的时间间隔默认为300秒,查询时间在应用程序中的配置文件中是一个单独的节点,通过配置文件的
clientNotifications节点的pollInterval属性来修改。还可以要代码中通过DataCacheFactory 的构造函数来指定。
回收机制(Eviction)
为了保持缓存主机的内存上面可以有足够的内存用于缓存数据,Velocity使用LRU(最近最久未使用)算法,用一个界限值确保内存均匀分配在所有缓存主机中。
当内存的使用率超过了界限值时,Velocity将启动回收机制回收已过期对象。如果回心过期对象后,内存的使用率还在界限值之上,将使用LRU机制纠继续回收对象,不管对象是否已过期,直到将同存的使用率降到界限值以下。
配置说明
过期和回收机制通过群集配置文件的本设置。可以使用基于PowerShell的管理员工具来管理,另外以下方法允许你重写缓存的默认设置。
-CreateRegion方法允许你启用和禁用域中对象的回收机制
-Add和Put方法允许重写,可以指定过缓存中对象的过期时间
-PutAndUnlock和Unlock方法允许重载,可以扩展对象解锁后的到期时间
-ResetObjectTimeout 方法允许显示指定对象的生存时间,此方法重写缓存配置的设置
5. 高可用性(High Availability )
“Velocity”的高可用性功能支持单独的缓存主机上存储数据的副本,使缓存数据持续可用。如果启用了群集的高可用性功能,应用仍然程序可以在群集中的部分缓存主机挂了的情况下取出数据。
没有高可用性启用,“Velocity”仍提供一些保护缓存数据的措施,对象不存储在是在域中,而是分布在集群的所有主机。由于分布式的特性,群集中的主机越多,因某一台机器故障而带来的数据访问问题会越少。
仅管高可用性可以减少缓存主机和应用程序间的故障,但也有可能整个群集挂掉,所以应用程序设计时应该考虑到在没有缓存服务情况下的状态,毕竟缓存总有不存在的时候。
建议群集中至少有三个缓存主机,出于苛刻的一致性要求,需有两台缓存主机启用高可用性功能。
高可用性如何运行
当启用高可用性功能时,每个独立的主机都保存了对象或域的复本。缓存群集管理维护这些复本,当主缓存数据失败时,会复本中的数据提供给应用程序。启用高可用性不会对编程方面产生任务影响。
性能注意事项
维护缓存复本时必需识别所有主缓存的变化,这里有一些性能会消耗在复本的同步中。需要考虑当主缓存丢失后,重新加加载缓存复本的代价。(大概是这意思)
What Happens When a Cache Host Fails
如果其中一个缓存主机出故障不会对应用程序产生任何影响,缓存群集将重新路由到缓存复本,同时将该缓存的复本的访问优先级提升到主复本。然后再生成该缓存的次要复本,并平均分布于其它可用主机。
要启用高可用性,群集中最少要有三台缓存主机,并且有两台主机处于正常运行状态。
高可用性的一推荐做法
-让群集中有大量的缓存主机
-将缓存系统中的所有缓存服务、缓存主机、缓存客户端、数据源服务都部署在企业防火墙的同一个域下。(缓存客户端也要在这里面?)
-使用SqlServer做为你的分布式缓存系统
-使用SqlServer存储缓存群集配置
-使用SqlServer执行缓存的管理规则
-如果有可能,请使用SqlServer 2008的故障转移群数据库做为缓存群集的存储位置
-尽量少修改配置,因为这会重启整个群集,如果有可能,可以用重新创建name caches方法来代替修改配置
-必需在重启服务前使用Stop-CacheHost命令来停止缓存主机。用Stop-CacheHost命令来关闭群集中管理角色的主机不会成功,因为当管理角色的主机关闭后会导致整个群集关闭。
6. 缓存通知(Cache Notifications )
Velocity提供了缓存通知,当缓存群集中有对缓存的操作时,允许应用程序接收异步通知。缓存通知也提供了让本地缓存失效的功能。
为了接收异步缓存通知,在应用程序中要添加一个缓存通知的回调函数。当您添加回调,您可以定义缓存操作触发一个缓存的通知,当缓存发变化时会调用该函数通知应用程序。
触发缓存通知
如下图所示,改变这两个地区和缓存的对象(称为缓存内的项目)可以触发缓存通知。
缓存通知的类型由DataCacheOption类的成员定义
通知范围(Notification Scope)
根据应用程序的业务要求,你不一定要对缓存中所有对象和域的事件做监听。Velocity可以从地区的级别和域级别的高速缓存级别缩小您的通知的范围。
在缓存级别,应用程序将监听到缓存所有对象和域的变化;在域级别应用程序将监听到某个域中的有对象的变化;在Item level,应用程序将仅监听到某个对象发生的变化。
可以用以下三个方法指定不能的监听级别
-AddCacheLevelCallback
-AddRegionLevelCallback
-AddItemLevelCallback
通知顺序(Notification Order)
缓存客户端收通知的顺序保障通知在一个区域范围内。
查询间隔(Polling Interval)
使用缓存通知时,应用程序会按指定的时间间隔检查是否有新的通知可用,默认轮循时间是300秒。
When Notifications are Lost
由于服务器的负载问题,缓存主机只能处理一定量的缓存操作,所有一此缓存客户端可能在没有接收到通知时,缓存主机就将通知队列终止。缓存客户端也有可能因为某个缓存服务服务故障而丢失通知,虽然缓存群集仍然正常运行。这种情况下应用程序会接收到消息通知失败的通知,可以通过添加 AddFailureNotificationCallback函数处理此消息。
When the Cache Cluster is Lost
丢失通知与丢失缓存群集之间有很大的区别,如果应用程序丢失通知,会接收到通知失败的通知,而缓存群集挂了之后应用程序将接收不到任务通知,再尝试连接群集时时应用程序会抛出异常。
启用缓存通知
缓存通知和通知的级别都可以在群集的配置文件中设置。可以把它当做缓存的一个属性来创建缓存。默认情况下缓存通知是不启用的。
7.群集主机和群集管理(Lead Hosts and Cluster Management )
Velocity是一组动态服务同时运行的组合,为应用程序提供一个唯一的逻辑缓存。要做到这些,需要一些开销花在各主机的协同工作上。在Velocity中,群集管理角色是用到管理缓存主机,最终组成一个缓存群集。
根据分布式缓存的不同配置,有两个选项可用于群集管理角色。如果使用SQL Server数据来存储群集配置,SQL Server实例同时也是群集的管理角色。
如果使用网张共享目录来存储群集配置,群集管理的角色将是被指定的一台缓存主机,这台主机被称为lead hosts(只能叫它为主机中的战斗机了),它除了有群集中的其它缓存主机的职责外还肩负着群集管理角色的重任。
群集管理角色的职责(Cluster Management Role Duties)
-确保缓存群集一直正常运行
-管理群集中的所有可用缓存主机
-帮助缓存主机加入缓存群集
集群管理和Lead Host名称(Cluster Management and Lead Host Designations)
有两个主要配置用于决定如何配置缓存群集。
-
leadHostManagement:群集级别的配置,用于管理群集角色。为true时,lead hosts将履行群体管理职责。当选择网络共享目录为存储位置时,此配置仅能为true。当选择Sqlserver为存储位置时,可以通过将该值设置为true来指定某个主机为lead hosts.
-
quorumHost:缓存主机级别的配置。当从SqlServer为存储位置时,用更改主机位置。
When a Lead Host Fails
为了保持可用的缓存集群,大多数Lead host必须保持可用。确保它有较少的服务器故障导致群集自行关闭。例如:有6个服务的缓存群体,两被指定为群集的管理者。
如果一台普通主机挂了,群体仍正常运行。非lead hosts主机的数据将会丢失(假设高可用性未启用),但其余的服务和数据仍正常,群体仍可正常运行。如果所有非lead hosts主机都挂了,lead host将不会再被视为lead hosts.
Lead hosts的其它选项
Velocity在安装时有一个群集大小选项用于指定lead hosts 在群体中的数量。也可以在安装后再指定额外的lead hosts,但需要重点考虑分配太多lead hosts会带来一个问题。
-必须始终有大量的lead hosts可正常运行,这样才能确保群集的正常运行。
-在小群,其中一个或两个导致主机故障可能导致群集发生故障,建议指定更多的导致主机。
-在大型群集中,要保证50个缓存主机正常运行应指定5至7个lead hosts.
8. TCP/IP 通信
Velocity中,所有主机通过互相间的TCP/IP通信共同组成了缓存群集。为了确保缓存主机间的通信,应关闭主机音的防火墙。缓存客户端使用Tcp/IP方式对缓存进行操作,但它可以在有防火墙的状态下工作。
Velocity是下个设计为运行在防火墙内的高性能的程序。为了尽可能的提高性能,数据都未进行加密,所以很可能受到“sniffing”和“replay”攻击。
TCP/IP端口设置
为了正常运行,每个缓存服务器需要配置缓存主机服务在防火墙例外列表中。使用三个独立的端口是:群集的端口,仲裁端口,和缓存端口。
每个高速缓存的主机和缓存客户端指定端口,这些端口号可以不同。缓存群集通过群集配置来跟踪每个缓存主机,并维护主机间的通信。
以下给出三个端口号的相关说明:
安全考虑:
在安装过程中安装程序会自动配置这些端口到防火墙例外列表中。卸载后的缓存主机服务,我们建议手动根据企业的政策和服务器上的其他应用的需要重新配置这些端口。在某些情况下,这可能意味着在防火墙中关闭这些端口。
9.数据分类(Data Classification )这部分翻译省去很多东西,只简单介绍下概念
能过选择适当的缓存数据类型,Velocity可以为你的应用程序带来很多好处。数据可以采取多种形式,并驻留在您的应用程序的不同层次。分布式缓存使得不同类型的数据可以轻松存储和检索,不受服务边界限制和语义的差异影响(后面的这句翻译不知道对不对)
大多数应用程序的多个数据实例都只使用一个数据源。比如:一个应用程序的主数据库中存储的数据需要高度的数据一致性和完整性,并采取措施,以确保每一块数据是唯一的。通常在中间层和业务逻辑操作的数据是源数据的副本,并可能与组织为了表示层中的有用数据的其他部分。正是这些中间层的缓存的副本。
有三种类型的数据,适合于分布式缓存:
Reference Data
Reference Data(非独占写数据)是不会常发生变化的数据的一个版本。它是原数据的复本,Reference Data通常是按照配置的间隔时间周期的刷新数据。
由于Reference Data不会经常更改,在一定程度上可以将数据缓存,而不用在每次读取数据时都访问数据源。使用Reference Data有助于提高应用程序的规模和性能。
Activity Data
Activity Data(独占写数据)是由根据实时执行生成的业务数据的一部分。数据源做为业务事务的一部分,在事务结束后,数据将做为历史日志。
例如定单数据,应用程序的Session状态或在线购物车。考虑到购物车是一个在线的程序,每个购物车都有一个会话状态。在这个购物的会话中,购物车的存储着用户选择的数据。购物车数据被一个交易的事务独占访问。
当购物的会话处于活动状态时,购物车的数据是可读可写的,但它并不是共享的。
Resource Data
并不是所有的数据都可能被归为Reference (共享读)和activity(独占写)两种数据。还有的数据可以同时被读写。如拍卖场景下,总是以最高价格为的数据为准。
曾经年少多少事 而今皆付谈笑中!