概念:
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
集群技术是一种通用的技术,其目的是为了解决单机运算能力的不足、IO能力的不足、提高服务的可靠性、获得规模可扩展能力,降低整体方案的运维成本(运行、升级、维护成本)。Cluster必须可以协调管理各分离的组件的错误和失败,并可透明地向Cluster中加入组件。一个Cluster包含多台(至少二台)拥有共享数据存储空间的服务器。任何一台服务器运行一个应用时,应用数据被存储在共享的数据空间内。每台服务器的操作系统和应用程序文件存储在其各自的本地储存空间上。Cluster内各节点服务器通过一内部局域网相互通讯。当一台节点服务器发生故障时,这台服务器上所运行的应用程序将在另一节点服务器上被自动接管。当一个应用服务发生故障时,应用服务将被重新启动或被另一台服务器接管。当以上的任一故障发生时,客户都将能很快连接到新的应用服务上。
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
问题:
当一个应用部署在集群环境下的不同节点上并行运行时,每个服务器节点都是单独缓存。这样就很容易导致不同节点的缓存内容出现版本上的不一致。一台机器上修改了数据只会影响到本地的内存,但不会通知其他服务器,导致其他节点的缓存数据实际已经失效了。这样就必须实现在集群环境下保持缓存同步。
当原先为用户创建session的服务器崩溃了,出错恢复允许用户无缝地从另一台server上获得session信息。
实现:
用数据库/文件系统实现
当集群中的一台server上的应用更新时,更新的部分写入数据库,然后缓存管理器把所有机器上的缓存设为无效,强迫它们下次重新获取新的。只有一个缺点,就是要花时间把数据从数据库或共享的文件系统中取出,调入内存中。
用数据库/文件系统实现session持久性的主要缺点在于:当存储大的或很多对象在session中时有限的伸缩性。用户每次向HttpSession增加一个对象,session中所有的对象都要序列化并写入数据库或共享的文件系统。大多数用数据库实现session持久化的application server都主张尽量少用session存储object,但这会限制Web application的结构和设计,特别是用HttpSession存储用户数据时。
基于内存的实现
把内存中的信息写到一个备份服务器上。有两种做法:第一种把信息写到一个集中式状态服务器,集群中的所有机器都要把数据写到这台server上;第二种是集群中每个节点任意地选择一个节点作为backup server,将存储在内存中的数据单独序列化写入那台backup server。
上面两种方法中,如果集群中的机器数较少,用专门的state server比任意指定backup server要好,这样可以节省CPU来处理transaction和动态网页的生成。另一方面,当集群的机器数很大时,专门的state server就成为瓶颈,而向任意指定的backup server复制内存的消耗将随着机器数的增长而线性增长。当增加机器时用专门的state server,你需要为它加上更多的RAM和CPU。用任意指定的backup server你仅仅增加机器而已,信息会平均地分布在所有机器之间。基于内存的持久化提供了灵活的Web application设计规模和高可靠性
润乾报表的集群条件下的缓存更新策略:
随着对服务器集群的负载均衡能力要求越来越高,很多服务器推出了session同步的功能。即 同一个客户端在同一个访问周期里,可能第一次访问A机器,第二次跳转到B机器访问,此时在访问A机器过程中产生的session里的内容可以被同步复制到 B机器上。这个功能使得负载均衡更加合理,但是也带来了一系列问题。
服务器的集群只解决了服务器自己的session同步问题,而作为报表工具,润乾报表还提供了先进的参数缓存和报表缓存。那么,当客户端第一次访问 报表服务器的时候,A机器计算了报表并在A机器作了缓存,而当客户端第二次访问时,例如此时跳转到B机器,则在B机器上找不到报表的缓存,也找不到参数的 缓存,于是只好报错或者重新计算,一定程度上浪费了服务器的资源,降低了服务器的性能。
润乾报表专门针对此类情形,提供了集群服务器之间通讯的能力–集群时缓存同步,彻底解决了负载均衡时服务器之间跳转访问带来的缓存同步的问题。
其原理是:
客户端第一次访问报表服务器,A机器计算了报表并在A机器作了缓存,当客户端第二次访问时,例如此时跳转到B机器,B机器根据缓存id判断出是A机器做的缓存,于是B机器向A机器发送缓存请求,A机器读取缓存并把缓存结果发送给B机器,B机器再把结果返回给客户端。
实现步骤:
1、 在reportConfig.xml文件中做如下配置:
<config> <!– 配置缓存机器和缓存端口号–>
<name>clusterMember</name>
<value>A,192.168.0.59,8087;B,192.168.0.48,8087;</value>
</config>
<config> <!– 配置是否共享缓存目录–>
<name>isCachedFileShared</name>
<value>yes</value>
</config>
<config> <!– 配置缓存共享目录–>
<name>cachedReportDir</name>
<value>\\192.168.0.59\cached</value>
</config>
这里主要的是 clusterMember属性,它指定了系统缓存前缀、所有集群的服务器结点及每个服务器结点与缓存服务器间的通讯接口。
它的格式是:缓存前缀,IP,端口;(注:润乾通信端口非web服务器端口)
2、 重起服务器,即可实现集群时缓存同步