闫飞翔,李炜,王纯
(1 北京邮电大学网络与交换技术国家重点实验室,北京 100876;2 东信北邮信息技术有限公司,北京 100191)
随着激烈的市场竞争和话音业务的趋于饱和,运营商话音业务利润不断下降,同时传统的话音和短信等业务已不能满足用户日趋增长的多样化需求。面对严峻的市场形势,运营商必须调整业务模式,在优化传统业务的同时,另辟蹊径,寻求新的业务增长点。业务创新已经成为了运营商发展的战略性问题。但是运营商传统网络具有明显的封闭性,缺乏接受外来创新业务的能力。同时业务表现单一,用户体验不够丰富,特别是在面对互联网开放模式的挑战时,这些弱点表现的尤为明显。互联网的开放模式与运营商网络的Walled Garden模式截然不同,互联网的开放性使得各种技术和业务的创新层出不穷,极大地丰富和满足了用户的业务需求,人们开始将更多的目光投向互联网。在互联网开放浪潮中,Google,Yahoo!,Facebook,校内网,开心网等大量的互联网公司加入了开放大军,通过开放自身资源并整合互联网资源,提供开放平台,构建价值链,聚拢了一批批的社会SP(Service Provider)、中小软件公司,创造了大量的应用,随之带动了互联网增值服务ARPU(Average Revenue Per User)的增长。
CM-IMS吸收与借鉴了互联网的开放模式,其天生具备了开放、融合的特性。CM-IMS能够整合通信网与互联网两种异构环境下的各类元素。运营商可以利用CM-IMS整合异构能力的先天特性,打造一个“杀手级应用”,即提供一个基础通信能力开放平台,向互联网开放运营商的基础通信能力,实现互联网与通信网络业务的融合与应用的混搭(Mashup),同时,通过建立良好的商业模式,吸引互联网SP入驻,让SP自己开发适合市场的“杀手级应用”。在CMIMS基础上,中国移动提出了wIMS技术, 通过wIMS技术为运营商打造一个基础通信能力的开放平台[1]。
wIMS将要在多个地区进行部署,上线后,平台用户会稳定增长,业务需要稳定运行,为了树立移动运营商的信息专家的形象,必须不断提高wIMS平台的服务能力,提高平台的容错能力、可靠性。为此,实现wIMS平台的集群化将能更好解决平台的服务能力扩展和容错性、稳定性的提升问题,更好地为移动运营商提供综合业务服务,故本文对wIMS平台的集群进行了设计和实现。
利用集群技术可以使用多个节点运行同样的程序,通过负载均衡技术把负载均匀的分布到各个节点上,这样一方面可以提升系统的服务能力,另一方面,当某个节点发生故障不能提供服务时,可以使用其他的节点提供服务,从而系统可以保持可用状态,避免出现单点故障。而负载均衡器则可以使用多种双机热备份方案来避免发生故障。集群服务能力的扩展可以简单的通过增加节点的方式来实现,具备极强的可扩展性。通过集群,wIMS系统将能做到高稳定性、高可靠性、高可扩展性。
图1所示为wIMS中间件平台的分层网络架构图,分为应用层、wIMS中间件层、CM-IMS业务能力层和CM-IMS核心层,介绍了wIMS中间件在IMS网络中的位置以及该平台与所在网络中相关网元之间的交互。
图1 wIMS网络架构图
如图2 wIMS集群的系统架构所示,wIMS中间件集群系统由Load-Balancer、共享存储和多个wIMS节点组成。下面对每个实体的主要功能及实体间的交互进行详细的描述。
集群系统增加Load-Balancer,作为负载均衡器,将互联网上的HTTP请求分发给南向的多个wIMS节点。同时作为代理,将多个wIMS节点外发的HTTP请求,转发给Internet中的用户。Load-Balancer1和Load-Balancer2采用浮动IP双机热备方案,正常工作时Load-Balancer1处理HTTP请求,当发生宕机或网络故障时,通过浮动IP机制,由Load-Balancer2处理请求。这样能保证HTTP客户主观上仍然感受到的是与单一工作站进行通信,集群特性对用户仍然透明[2]。同时,又能保证Load-Balancer的可靠性。
图2 wIMS集群的系统架构
共享存储有两个作用。一方面作为Load-Balancer和wIMS节点的中间存储介质,每个wIMS节点将心跳消息写到共享存储中,Load-Balancer启动定时任务到共享存储中读取多个wIMS节点的心跳消息,来判断当前存在wIMS节点个数,及获得每个节点的IP和PORT。另外一方面作为多个wIMS节点间的共享存储,wIMS平台具有开发者、应用和用户三种角色,需要对各个角色的SLA(Service-Level Agreement)进行控制,比如规定某个应用每秒发送短信最大数为20。此外wIMS平台还需要保存每次通信能力调用的相关数据,比如每次点击拨号(Click to Dial,CTD)呼叫的实时状态,用来提供给外部互联网应用进行查询。由于外部应用的HTTP请求是被Load-Balancer分发到各个wIMS节点的,所以wIMS集群系统需要这样一个共享存储。共享存储1和共享存储2采用逻辑上的双机热备份方案,写操作和更新操作在两个共享存储中同时进行,而读操作选取一个共享存储作为主机进行读取。
wIMS是业务能力处理的服务器,Load-Balancer在多个wIMS节点中采用Round-Robin算法,将HTTP请求转发给一个wIMS节点,这样能达到负载均衡,使每一个服务器都得到充分的利用[3,4]。在集群系统正常运行时,增加或者删除一个wIMS节点,系统都能自动的恢复到正常运行,不需要人工干预其他机器。增加时,只需要在此wIMS节点上配置好共享存储的IP和PORT,新增wIMS节点就会定时将心跳消息写到共享存储中,Load-Balancer定时读取心跳时,便知道系统中增加了一个wIMS节点;从系统中移除一个wIMS节点时,此台服务器将不会再向共享存储中写心跳,Load-Balancer取不到此wIMS节点的心跳时,将不会再转发HTTP消息到此wIMS节点,集群系统会马上自动恢复正常运行。这样符合集群系统的可伸缩特性。
wIMS南向连接处理业务的AS集群,AS同样启动定时任务到共享存储中读取多个wIMS节点的心跳消息,来判断当前存在wIMS节点个数,及获得每个节点的IP和PORT。然后定时向每个wIMS节点发送HTTP心跳消息,各wIMS节点便知道系统中AS的数量及IP和PORT。wIMS将来自互联网上的HTTP请求处理后转发给AS,给互联网用户提供基础通信能力。
通过以上方案设计的wIMS集群系统符合高性能、高可靠性和伸缩性等要求。通过增加Load-Balancer和多个wIMS节点可以提高系统的处理能力;集群系统中的任何一台服务器出现故障时,系统都能在短时间内回复正常运行;此外,可以随意的增加和删除wIMS节点,而无需人工干预其他服务器。
Load-Balancer作为wIMS集群系统和Internet通信必须经过的唯一节点,需要具有很高的I/O处理能力,可以采用硬件或者软件来实现。硬件成本高,消息分发策略不灵活。软件实现性能虽然比硬件低,但是能充分节约成本,可以随意实现自己想要的消息分发策略。由于处理逻辑简单,所以考虑使用软件来实现Load-Balancer,wIMS中间件平台是基于tomcat容器开发的[5],为保持与系统的融合与一致,Load-Balancer仍然使用tomcat。在HP ProLiant BL460c G7服务器(操作系统Red Hat Enterprise Linux Server release 5.5,配置4C8T、64GB内存)上对写好的Load-Balancer做压力测试,由于Load-Balancer内部处理逻辑简单,每秒能处理1500个HTTP请求,完全符合目前业务开展的能力要求[6]。
定时读写心跳功能使用Quartz来实现。Quartz是个开源的作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了Quartz的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业[7]。
Web容器中每个Servlet的生命周期长短,直接影响到Web容器的处理性能。共享存储频繁被访问,需要选择一个存储速度较快的介质,这样每个Servlet才能迅速的处理完请求后被销毁。NoSQL型数据库redis正符合此种要求,redis本质上是一个Key-value存储系统。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存但是他的数据可以持久化的保存在磁盘上,解决了服务重启后数据丢失的问题。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,还支持各种不同的排序能力,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。官方给出的性能报告中redis每秒能做110000次SET操作,或者每秒能做81000次GET操作。目前来看redis无疑是共享存储的最佳选择[8]。
上文中介绍wIMS需要对开发者、应用和用户三种角色的SLA进行控制,其中有访问频率类的控制,比如每个应用每秒最多发起100次点击拨号呼叫。由于集群系统中包含多个wIMS节点,故多个wIMS节点需要共同维护一个呼叫请求队列系统。可以使用redis来构建这样一个访问控制模块,可以通过参数对精度与性能之间进行调整。首先,程序在某个时间要求加入一次访问记录,会先针对当前时间计算要用到的时间片,并对这个时间片的counter加1;然后,程序在判断一段时间访问了多少次时,会先计算这段时间包含多少个时间片,然后取出所有这些时间片将counter相加后返回。当请求数超过SLA的规定时,wIMS回403响应,禁止发起呼叫请求。
Load-Balancer和wIMS都是基于tomcat容器开发的,为了保证Load-Balancer和wIMS的java进程能够长期稳定的运行,需要给二者添加守护进程。守护进程可以使用apache开源项目commons-daemon中的jsvc工具,jsvc是一个库和程序的集合,通过它能使java程序在UNIX系统上运行的更加容易,tomcat可以作为一个守护进程来启动以及停止,在Linux系统上以服务的方式启动tomcat程序。这样就能保证在tomcat的java进程因为某些原因宕机后能自动启动[9]。
采用tomcat实现了wIMS的集群式部署,利用负载均衡器将HTTP请求分发到多台Web服务器上,当一台Web服务器发生故障时,其他Web服务器不受影响。多台wIMS应用服务器可以组成集群,在业务相同配置的情况下,应用服务器群可以分发业务请求,在一台应用服务器发生故障时,可以将业务请求转发到正常工作的服务器。可以看出,wIMS的集群化,一方面提升了wIMS平台的性能,通过节点的增加就可以提高服务能力,实现了服务能力的高度可扩展性,另一方面,提高了平台的稳定性,从而为用户提供更好质量的服务。
[1] 郑侃,王纯. IMS中基于REST的wIMS中间件平台设计与实现[J].电信工程技术与标准化,2010,23(8):77-82.
[2] 李双庆. Web服务器集群技术研究[D]. 重庆:重庆大学, 2003,10月.
[3] 单志广. Web服务器集群体系结构[J]. 网络世界,2002,09月.
[4] 黄海,廖建新,朱晓民. IMS实时计费系统集群中的负载均衡研究[J]. 高技术通讯,2009,19(11):1117-1123.
[5] 孙卫琴. Tomcat与Java Web开发技术详解[M]. 北京:电子工业出版社,2009.
[6] 约翰逊,威曾格普,拉瓦提著,韩智文译. Linux服务器性能调整[M]. 北京:清华大学出版社,2009.
[7] Quartz官方网站.http://www.opensymphony.com/quartz/
[8] Redis官方网站.http://redis.io/
[9] jsvc官方网站.http://commons.apache.org/daemon/jsvc.html