(转)利用 WebSphere Application Server 6.1 构建 SIP 集群应用环境及其性能调优

上一篇 / 下一篇  2011-08-25 15:24:51

引言

从[1]中我们知道,SIP集群应用环境通过SIP容器(SIP Container)、SIP代理服务器(SIP Proxy)、Load Balancer(Edge)等组件支持SIP高可用性和故障恢复等功能。下面将从实例出发,介绍如何利用WebSphere Application Server 6.1, Edge Server搭建一个SIP集群应用环境(见图1),以及如何对该环境进行性能调优。


图1:一个典型的SIP集群应用环境拓扑结构 
一个典型的SIP集群应用环境拓扑结构 

功能模块

图1展示的是一个典型的SIP集群应用环境拓扑结构,主要包含以下功能模块:

  • 用户代理客户端(UAC):发送用户请求。
  • 网络分派器(Network Dispatcher, 这里我们用Edge Server):它负责代理服务器的负载均衡。客户端请求到达Edge Server之后,由它将请求分发给某个代理服务器,并接收来自代理服务器的响应,并将之转发给UAC。
  • 代理服务器(Proxy):它们不但支持HTTP协议,也支持SIP协议。代理服务器将收到的客户端请求发送给指定的SIP集群,然后接收SIP集群成员的响应,并将之转发给 Edge 服务器。
  • SIP集群(SIP Cluster):包含多个SIP容器,即应用服务器,我们的SIP应用(b2bua)就是被部署到SIP集群(即每个SIP容器)上的。当请求到达SIP集群后,SIP集群将根据集群成员的权重和负载状况选择并发送请求到某个SIP容器,该SIP容器根据b2bua应用所定义的逻辑来处理请求,将请求发送到指定的endpoint(即UAS),并接收来自UAS的响应,将之转发给代理服务器。
  • 用户代理服务器端(UAS):每个SIP容器后面都有一个或多个UAS接收请求,并做出响应。
  • 复制组(Replication Group):若干个SIP容器可以同属于某个复制组,该例中每两个SIP容器同在一个复制组(请看图1中虚线部分)。处于同一复制组的SIP容器之间,可以进行会话状态信息和统计信息的Memory-to-Memory的实时相互复制。这样做有利于故障恢复,一旦其中某个SIP容器出现故障,或者意外被停掉,处于同一复制组的其他SIP容器会代替它处理当前请求并接收新来的请求,使损失降低到最小。

搭建上述环境至少需要7台机器(见表1):


表1:SIP集群应用环境的硬件需求表 
表1:SIP集群应用环境的硬件需求表 

测试工具SIPp和b2bua应用介绍

这里,我们用GPL(GNU General Public License)开放源码的测试工具SIPp来模拟UAC和UAS,发送请求和作出响应。 

SIPp是一个测试SIP协议性能的工具软件。SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUA,SIP媒体服务器,SIP/x网关,SIP PBX等等,它也可以模仿上千个SIP代理呼叫你的SIP系统。SIPp可以很容易在LinuxWindows上编译运行。想了解详细信息,请查看[4]。 

SIP网络中的B2BUA(背对背用户代理,Backend to Backend User Agent),它终结网络中呼叫控制设备(软交换、SIP代理服务器、CSCF)提交来的业务请求,根据该业务请求信息和用户注册的业务属性信息,生成新的呼叫到网络中的呼叫设备,指示其完成功能不同的业务续接,从而实现业务逻辑控制功能。

本文所使用的b2bua应用是WAS 6.1开发团队改进后的,可部署于WAS 6.1的一个简单应用。该应用通过属性文件b2bua.properties定义了以下相关参数:

# -- 为b2bua配置多个响应请求的UAS时,b2bua.forking的值为true.
b2bua.forking=false                 
                
b2bua.parallel=true
b2bua.sequentialsearchtimeout=300

# -- endpoint1指向后台某个UAS时,发到SIP Container的消息就会被部署在其上的b2bua应用转发到UAS
b2bua.endpoint1=sip\:sipp@fengyl02.cn.ibm.com\:7001  

b2bua.scupdatetime=0                 
b2bua.locationservice=false


这里就不细述b2bua.properties文件各参数的含义了,一般来说,只要b2bua.endpoint1指到正确的UAS即可。

利用WebSphere Application Server 6.1搭建SIP集群应用环境

下面我们将介绍利用WebSphere Application Server 6.1搭建SIP集群应用环境的详细步骤。

  1. 创建Deployment Manager并启用安全性。
    - 在机器B(或C)上安装WAS 6.1的Network Deployment版本,创建一个Deployment Manager(以后简称Dmgr)概要文件。
    - 启动Dmgr,登录到管理控制台,启用其全局安全性和应用安全性,但是不要启用Java 2安全性,然后重启Dmgr。

  2. 将各节点加入Dmgr中。
    - 在其他几台机器(C, D, E, F)上安装WAS 6.1,并在B、C、D、E、F上创建Application Server概要文件。
    - 我们知道,在WAS中,一个Application Server概要文件对应一个节点(Node)。将这5台机器上的节点通过addNode命令都加到Dmgr中去。

  3. 创建SIP容器和SIP代理服务器。
    我们可以在Dmgr的管理控制台创建SIP代理服务器和SIP容器。
    - 在机器B和C的节点上分别创建一个SIP代理服务器,同时选择HTTP和SIP为支持的协议(见图2)。
    - 创建一个集群sip_cluster,包含6个应用服务器,机器D, E和F的节点上各有2个,实际上,这6个应用服务器就是6个SIP容器。
    			  机器D: member1和member2
    			  机器E: member3和member4
    			  机器F: member5和member6



    图2:创建SIP代理服务器 
    图2:创建SIP代理服务器 

  4. 将SIP相关端口加入都在虚拟主机default_host的主机别名中。
    - 查看所有SIP容器的相关SIP端口号,包括:
                     SIPCInboundDefault,SIPCInboundDefaultSecure,SIPCInboundDefaultUDP
          比如: 5060/5061(见图3),要将它们都加入到虚拟主机default_host的主机别名中。
    - 查看所有SIP代理服务器的相关SIP端口号,包括:
                     SIPS_PROXY_CHAIN, SIP_PROXY_CHAIN, UDP_SIP_PROXY_CHAIN
          比如:5062/5063(见图4) ,要将它们都加入到虚拟主机default_host的主机别名中。
      
    注意:
    * 在第2)步中做addNode操作时,各个节点的default_alias的主机别名都会被加入到default_host的主机别名中去;
    * 我们需要删除每个节点对应的端口记录,只保留*所对应的端口,最后将上述所有SIP容器和SIP代理服务器的相关SIP端口加入到*的端口列表中。



    图3:SIP容器相关端口 
    图3:SIP容器相关端口 



    图4:SIP代理服务器相关端口 
    图4:SIP代理服务器相关端口 

  5. 创建复制域,将各个SIP容器加入到各自复制域中。
    - 我们要分别创建三个复制域,比如:Replication Group 1,Replication Group 2,Replication Group 3。
    - 在管理控制台,进入“环境->复制域->新建”,注意: 加密类型选择“无”,副本数选择“整个域”(见图5),然后点击确定,保存。



    图5:复制域的配置 
    图5:复制域的配置 

    定义了三个复制域之后,分别将SIP容器所在的应用服务器加入到相应的复制域中去。
    在这里(参看图1),每两个SIP容器在一个复制域中:
                              Replication Group 1: member2和member3
                              Replication Group 2: member4和member5
                              Replication Group 3: member1和member6
    具体步骤如下:
    - 在管理控制台中,进入“服务器->应用程序服务器->member2->会话管理->分发环境设置->内存到内存复制”;
    - 选择该SIP容器所在的复制域,比如:Replication Group 1,并且确保复制方式为“客户机和服务器”(见图6)。



    图6:设置SIP容器所属复制域 
    图6:设置SIP容器所属复制域 

  6. SIP代理服务器的配置和路由规则
    在3)中,我们在机器B和C上分别创建了一个代理服务器。在这里,我们要确保这两个代理服务器具有相同的SIP端口号系列,否则,Edge Server无法对它们进行负载均衡。
    - 我们可以为每个SIP代理服务器设置一个缺省集群,同时也可以为它设置路由规则(见图7)。



    图7:为SIP代理服务器设置缺省集群 
    图7:为SIP代理服务器设置缺省集群 

    关于路由规则,
    * 这里我们可以不设置路由规则(Routing Rule),因为该例中只有一个SIP集群sip_cluster,而且它已被设置为缺省集群;
    * 如果有多个集群,可以为代理服务器设置多个路由规则,使得到达代理服务器的请求因满足某路由规则被发送到相应集群上去,如果该请求不满足所有路由规则,则会被转发到缺省集群上去。
    
    但需要注意的是,
    * WAS 6.1中,我们只能简单地设置路由规则(直接选择某个集群),而不能为多个集群设置不同的路由条件(见图8)。
    * 将来的版本中,我们还可以通过设置路由规则的定制属性和过滤条件,支持更复杂的路由规则。



    图8:设置SIP代理服务器的路由规则 
    图8:设置SIP代理服务器的路由规则 

  7. 设置Edge Server。
    - 安装Edge Load Balance Server到机器A,这里我们用dispatcher组件,它是Edge Load Balance Server的一种。
    - 然后启动dispatcher(执行:dsserver),启动executor(执行:dscontrol executor start)。
    - 利用配置文件fengyl01.cfg(见表2)来设置Edge Server的转发地址、端口、两台SIP代理服务器及其他。
             a. 将此文件放在<LB_HOME>\servers\configurations\dispatcher目录下
             b. 执行命令dscontrol file newload fengyl01.cfg,使之生效。
    
    Edge Server配置文件的内容解释这里就不赘述了,可以查看Edge Server 6.1 信息中心[5]了解更详细的信息。
    
    注意:这里,我们要确保Edge LB Server有一个命名为SIP的Advisor。



    清单1: Edge Server配置文件fengyl01.cfg 
    dscontrol set loglevel 5
    dscontrol executor start
    
    # 设置Edge LB Server的转发地址
    dscontrol cluster add 9.181.86.160 primaryhost 9.181.86.158                
    dscontrol cluster set 9.181.86.160 proportions 49 49 1 1
    dscontrol executor configure 9.181.86.160 en0 255.255.255.0
    
    dscontrol port add 9.181.86.160:5062 reset no
    dscontrol port set 9.181.86.160:5062 staletimeout 259200
    
    # 添加两个SIP代理服务器,dispatcher要对它们做负载均衡
    dscontrol server add 9.181.86.160:5062:SERVER1 address 9.181.86.90         
    dscontrol server add 9.181.86.160:5062:SERVER2 address 9.181.86.120        
    
    dscontrol manager start manager.log 10004
    dscontrol manager logsize unlimited
    dscontrol manager reach set logsize unlimited
    
    # SIP Advisor
    dscontrol advisor start SIP 9.181.86.160:5062 SIP_9.181.86.160_5062.log

  8. 设置SIP代理服务器的回路地址。
    - 在每个代理服务器上, 设置回路(Loopback)地址为Edge LB Server的转发地址。
    - 可以查看Edge Load Balancer的管理员手册[6],了解关于设置Loopback地址的更详细的信息。

  9. 为SIP代理服务器设置IP Sprayer。
    我们可以为每个代理服务器设置IP Sprayer(TCP/SSL/UDP),根据不同的传输方式,启用不同的Sprayer。
    这里,我们选择启用UDP Sprayer,相应地,UAC和UAS也将使用UDP作为传输协议。主机名和端口号是Edge LB Server设置的转发地址和端口号(见图9)。



    图9:IPSprayer的设置 
    图9:IPSprayer的设置 

  10. 在集群上安装b2bua应用。
    - 在集群sip_cluster上安装b2bua应用,并将b2bua.properties放在系统用户的根目录(比如Linux的/root)下,这样其中的参数才能生效。

  11. 环境搭建完毕,开始压力测试或故障恢复测试。
    - 重启Dmgr、所有节点代理(nodeagent)和服务器, 并保证所有节点都已同步。

到此为止,我们已经搭建起了一个典型的SIP集群应用环境,具有高可用性和故障恢复等功能。

SIP集群应用环境的性能调优

配置SIP集群应用环境时,需要配置和调整一些性能参数,正确配置这些参数是保证SIP容器和SIP代理服务器在一定负荷下正常运转的关键。

  1. 调整SIP容器的三个常规属性:最大应用程序会话数,每平均时间段最大消息数和最大分派队列大小。
    - 在管理控制台,进入“服务器->应用程序服务器->(某服务器,例如: member1)->SIP容器”,调整每个SIP容器的参数 (见图10)。



    图10:调整SIP容器的常规属性 
    图10:调整SIP容器的常规属性 

  2. 启用垃圾回收,并为所有的SIP容器和SIP代理服务器设置适当的JVM Heap Size和通用JVM参数(见图11)。
    - 如果SIP容器和SIP代理服务器所在的机器内存是2GB,可以将JVM初始堆大小和最大堆大小设为1024;
    - 如果内存是1GB,可以将JVM初始堆大小和最大堆大小设为800。通用的JVM参数应设为:
        -Xgcpolicy:gencon -Xdump:heap:events=user -Xconcurrentlevel1 -Xtgc:parallel -Xgc:scvN
        oAdaptiveTenure,scvTenureAge=8,stdGlobalCompactToSatisfyAllocate -Xconcurrentlevel1



    图11:SIP容器和SIP代理服务器的JVM设置 
    图11:SIP容器和SIP代理服务器的JVM设置 

  3. 添加DRS设置。要添加DRS设置,必须保证我们使用了复制域。
    a. 添加DefaultCoreGroup定制属性IBM_CS_DATASTACK_MEG。
          - 进入“服务器->核心组->核心组设置->DefaultCoreGroup->定制属性->新建”;
          - 新建定制属性IBM_CS_DATASTACK_MEG,并设其值为256(见图12)。



    图12:添加DefaultCoreGroup定制属性IBM_CS_DATASTACK_MEG 
    添加DefaultCoreGroup定制属性 

    b. 调整该环境中所有SIP容器,SIP代理服务器和nodeagent的核心组服务的传输缓冲区大小。例如: 
          - 对SIP容器来说,进入“服务器->应用程序服务器->(某服务器,例如: member1)->核心组服务”;
          - 将传输缓冲区大小从缺省值10改为100(见图13)。



    图13:调整SIP容器的核心组服务设置 
    调整SIP容器的核心组服务设置 

  4. 设置SIP代理服务器的定制属性isSipComplianceEnabled。
    - 进入“服务器->代理服务器->(某代理服务器,例如: proxy1)->SIP代理设置->定制属性->新建”;
    - 新建属性isSipComplianceEnabled,并将其值设为false(见图14)。



    图14:添加SIP代理的定制属性isSipComplianceEnabled 
    添加SIP代理的定制属性 

  5. 为每个SIP容器创建线程池。
    - 进入“服务器->应用程序服务器->(某服务器,例如member1)->线程池->新建”;
    - 新建一个线程池SipContainer,并将最小大小和最大大小设为15(见图15),创建后点击确定保存。
    - 然后进入“服务器->应用程序服务器->(某服务器,例如member1)->SIP容器”,将刚刚创建的线程池SipContainer设置为该SIP容器正在使用的线程池。



    图15:为SIP容器新建线程池SipContainer 
    为SIP容器新建线程池SipContainer 

  6. 为每个SIP容器和SIP代理服务器的SIPCInboundDefaultUDP端口的UDP入站通道(UDP_1)新建定制属性receiveBufferSocketSize和sendBufferSocketSize。
    - 进入“服务器->应用程序服务器-><某服务器>->SIP容器传输链->SIPCInboundDefaultUDP->UDP入站通道(UDP_1)->定制属性->新建”;
    - 新建以下两个定制属性:
    ?	       * receiveBufferSocketSize = 3000000
    ?	       * sendBufferSocketSize    = 3000000

  7. 为每个SIP容器添加新建定制属性javax.sip.max.object.pool.size和max.tu.pool.size。
    - 进入“服务器->应用程序服务器->(某服务器,例如: member1)->SIP容器->定制属性->新建”,新建以下两个定制属性:
    ?	       * javax.sip.max.object.pool.size = 1000
    ?	       * max.tu.pool.size = 1000

  8. 在运行压力测试时,可以禁用所有SIP容器和SIP代理服务器的跟踪日志(见图16),甚至在UAC和UAS命令中尽量不设置trace_msg, trace_err, trace_screen等记录日志的参数。 

    图16:禁用日志 
    图16:禁用日志 


注意:以上所有性能调优的设置只有在重启Dmgr、所有节点代理(nodeagent)和服务器后才能生效。

性能分析及实例

就图1所展示的SIP集群应用环境而言,其高可用性体现在:

  • SIP代理服务器通过路由规则或缺省集群

TAG:

 

评分:0

我来说两句

Open Toolbar