“负载均衡”模块用来提供基于负载的通信流量路径选择。简言之,当OpenSIPS对发向一组目的地的呼叫请求进行路由选择时,它能够将每个目的地的负载情况(就是正在处理中的呼叫请求总数)记录下来,并将新的呼叫请求发向(当时)具有较少负载的目的地。OpenSIPS了解每个目的地的承载能力 —— 它预先配置有每个目的地能够接受的最大负载量。更准确地说,OpenSIPS在进行路由选择时,它会选择负载较小的目的地,而不是处理中的呼叫请求总数最小的那个目的地,它所选择的目的地只是当时具有最大的剩余处理能力的目的地。
另外,“负载均衡”(简称为LB)也能够接收来自目的地的反馈信息(只要目的地具备发送反馈信息的能力)。这种机制用于在目的地的最大承载能力发生变化情况下(比如GW增减了E1卡的数量),从目的地向OpenSIPS发送相应的通知信息。
“负载均衡”等同于增强型的“调度器”一。它们之间的区别就是具不具有关于路由目的地的负载信息:
当查看OpenSIPS中的LB实现方式时,我们要从这3个方面来考虑:
一个目的地是用它的地址(一个SIP URI)及其承载能力的描述性信息来定义的。
从LB模块的角度来看,目的地并非是同构的 - 它们互不相同;它们的不同不仅仅在于承载能力不同,而且它们所提供的服务/资源的类型也不同。例如,你可能有一组用于提供媒体相关服务的Yate/Asterisk机器,它们当中有些机器是用于转码的,有些用于语音邮箱或者语音会议,有些用于简单的公告发布,还有一些用作PSTN转接终端(PSTN termination)。但你也可能会有一些混合使用的机器,比如一台同时处理PSTN和语音邮箱的机器。所以在目的地集中的每个目的地提供的是一组不同的服务/资源。
LB模块为每个目的地定义了它所提供的资源,并为它所提供的每一种资源,将其承载能力/最大负载量定义为该目的地为该资源所能提供的最大并发呼叫请求处理数。
示例:
4 destinations/boxes in the LB set 1) offers 30 channels for transcoding and 32 for PSTN 2) offers 100 voicemail channels and 10 for transcoding 3) offers 50 voicemail channels and 300 for conference 4) offers 10 voicemail, 10 conference, 10 transcoding and 32 PSTN This translated into the following setup: +----+----------+-------------------------+---------------------------------+ | id | group_id | dst_uri | resources | +----+----------+-------------------------+---------------------------------+ | 1 | 1 | sip:yate1.mycluster.net | transc=30; pstn=32 | | 2 | 1 | sip:yate2.mycluster.net | vm=100; transc=10 | | 3 | 1 | sip:yate3.mycluster.net | vm=50; conf=300 | | 4 | 1 | sip:yate4.mycluster.net | vm=10;conf=10;transc=10;pstn=32 | +----+----------+-------------------------+---------------------------------+
在系统运行是,LB模块提供的MI命令能够做到:
使用LB功能非常简单 —— 你只需要将调用所需的资源类型传递给LB模块即可。
资源探测是在OpenSIPS的路由选择脚本中基于脚本所掌握的信息完成的。例如,通过查看RURI(所拨的号码),你就能够看出该呼叫是否必须转向PSTN,或者该号码属于语音邮件或会议号码;另外,通过查看SDP所宣告的编解码器,你就能够断定到底需不需要转码。
if (!load_balance("1","transc;pstn")) { sl_send_reply("500","Service full"); exit; }
该函数的第一个参数用来指定要使用哪个LB集(参见上文DB快照中的group_id列)。第二个参数是完成该呼叫所需的资源。第三个可选参数可以用来告诉LB引擎如何来估计负载情况 —— 这个参数或者是个绝对值(要使用多少个通道)或者是个相对值(百分比)。
load_balance()将自动为呼叫创建对话状态(这是为了对呼叫进行监控),并为呼叫分配所需的资源(从所选的机器中分配)
该函数将会把目的URI($du)设置为其所选择的目的地/机器的地址。
当呼叫结束后,资源将会被自动释放掉。
LB模块为管理员提供了一个用于查看所有目的地的当前负载情况的MI函数。
LB在选择目的地时所采用的逻辑为:
示例: LB中具有4个目的地/机器 1) 提供了30个转码通道和32个PSTN线路 2) 提供了100个语音信箱通道和19个转码通道 3) 提供了50路语音信箱通道和300路会议 4) 提供了10个语音信箱、10路会议、10个转码通道和32路PSTN线路 当调用load_balance("1","transc;pstn")时 -> 1) 只有机器(1)和机器(4)会被选上,因为它俩都提供了转码和pstn 2) 评估负载情况: (1) 转码 - 已占用10个通道; PSTN - 已占用18路 (4) 转码 - 已占用9个通道; PSTN - 已占用16路 评估可用负载(承载能力-负载)evaluating available load (capacity-load) : (1) 转码 - 20个通道可用; PSTN - 14路可用 (4) 转码 - 1个通道可用 PSTN - 16路可用 3) 每个机器的最小可用负载(在整个资源中) (1) 14 (PSTN) (2) 1 (transcoding) 4) 最后选择了机器(1),因为对于使用量最大的资源,它具有最大(=14)的可用负载。
该选择算法会尽量避免过度使用每个机器的某一个资源。
负载均衡模块提供了一组用于有助于处理目的地失效问题的功能。失效目的地的真正探测过程(基于SIP流量)是在OpenSIPS的路由选择脚本中完成的,该脚本通过接收自目的地的回应代码来完成探测的(参见本教程的结尾处的代码)。
一旦探测出某个目的地已失效,你就可用在脚本中使用lb_disable()函数将其标示为失效目的地—— 在目的地被标示为禁用目的地后,LB过程中就再也不会使用该目的地了(在对呼叫进行路由选择时,LB将不再将其作为目的地使用了)。
想要把一个目的地设置回可用状态,有两个办法:
要打开有效性探测功能,你首选需要将probing_interval设置为一个非零值 —— 该值用来指定ping命令的发送频率。 有效性探测是通过向目的地周期性发送一个OPTIONS SIP请求来完成的 —— 参见probing_method选项。
为了控制对哪个目的地和什么时候对这些目的地进行有效性探测,load_balancer表中有一个probe_mode列——参见table definition。该列所允许的选项是:
负载均衡器模块提供了几个用来让你在负载均衡器运行过程中对其进行修改或者从中获得事实信息的MI命令。
在运行过程中推进变更:
获取实时信息:
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务