如何在多个Wowza Media Server之间实现负载均衡?
转载请注明:文章来自www.wowza.cn
注意: 要访问最新的技术资料,请访问http://www.ttstream.com/wowza/
Dynamic Load Balancing 插件可以使得多个Wowza Media Server之间实现负载均衡功能。 www.wowza.cn 这些服务器被分为两类,其中一类是中心服务器(也可以叫做负载均衡器),另一类服务器是边缘服务器。

1、每一个边缘服务器被配置使用一个叫做ServerListenerLoadBalancerSender的服务监听类。 我们称这些服务器为"edge" 服务器。 Edge服务器将周期性(大约每隔2.5秒)的通过UDP向一台(或多台)中心服务器发送自己当前的负载和状态信息。

2、中心服务器将被配置使用一个叫做ServerListenerLoadBalancerListener的服务监听类,它负责监听Edge服务器发送来的信息。 我们也称这些服务器为"load balancer." 这个load balancer 将保持跟踪每一个与它通信的edge服务器的负载和可用性。

注意:这个插件的负载均衡功能适用于Wowza Media Server 所支持的所有流媒体播放协议,包括RTMP、RTSP、HLS、HDS、DASH等。

你可以从这里下载这个插件:LoadBalancer_2.0.zip

当你下载插件后,请解开zip压缩包,你会在根目录下看到一个readme.html,它是关于这个插件的详细介绍和配置说明,下面把基本原理和配置介绍如下:

基本原理:这个插件使得Wowza Media Server可以让客户端的播放器获得当前负载最小的边缘服务的地址,然后客户端播放器就向这个边缘服务器发起流媒体播放请求。

这个插件提供了两种方式让客户端播放器获得当前负载最小的边缘服务器的地址。

第一种方式:适用于用Flash开发的RTMP播放器:Flash播放器使用NetConnection.connect()向运行了ModuleLoadBalancerRedirector模块(Module)的load balancer服务器上的一个应用发起连接请求。 这个ModuleLoadBalancerRedirector模块(Module)将拒绝这个连接请求,返回的响应(info.code)信息为"NetConnection.Connect.Rejected"。 重定向的URL包括会包含在info.ex.redirect 字段中。www.wowza.cn


第二方式:任何一个客户端播放器,在准备播放前可以向load balancer发出一个HTTP请求,然后load balancer会将当前负载最小的边缘服务器的主机名或IP地址包含在响应中返回给播放器。


在这个插件包中包含这两种方式的Flash代码例子。

注意:loadbalancer的负载均衡机制是动态的。每当有一个新的edge服务器启动或停止时,它都会将它目前的状态发送给load balancer。www.wowza.cn 这使得只要启动或停止边缘服务器就可以非常容易在的添加或删除一个边缘服务器。同时,还可以通过Java 和 JMX API 临时性从池中删除一个 edge服务器。所有这些将在下面讨论。



一、在中心服务器上配置load balancer "listener"

  1. 1、安装 Wowza Media Server
  2. 2、将压缩包中的lib/wms-plugin-loadbalancer.jar 拷贝到Wowza Media Server的[install-dir]/lib/ 目录下
  3. 3、将压缩包中的conf/crossdomain.xml 拷贝到Wowza Media Server的[install-dir]/conf/ 目录下 (如果已经有了就不用这一步)
  4. 4、编辑[install-dir]/conf/Server.xml ,做如下改动:

    在<ServerListeners>列表中添加下面的ServerListener 实体:
    
    <ServerListener>
    	<BaseClass>com.wowza.wms.plugin.loadbalancer.ServerListenerLoadBalancerListener</BaseClass>
    </ServerListener>
    

    在Server.xml文件的最下面的<Properties>中添加下面的属性:
    
    <Property>
    	<Name>loadBalancerListenerKey</Name>
    	<Value>023D4FB4IS83</Value>
    </Property>
    <Property>
    	<Name>loadBalancerListenerIpAddress</Name>
    	<Value>*</Value>
    </Property>
    <Property>
    	<Name>loadBalancerListenerPort</Name>
    	<Value>1934</Value>
    	<Type>Integer</Type>
    </Property>
    <Property>
    	<Name>loadBalancerListenerRedirectorClass</Name>
    	<Value>com.wowza.wms.plugin.loadbalancer.LoadBalancerRedirectorConcurrentConnects</Value>
    </Property>
    <Property>
    	<Name>loadBalancerListenerMessageTimeout</Name>
    	<Value>5000</Value>
    	<Type>Integer</Type>
    </Property>
    

  5. 5、编辑 [install-dir]/conf/VHost.xml ,在com.wowza.wms.http.HTTPServerVersionHTTPProvider的前面添加下面 HostPort/HTTPProvider 的XML片段 XML 片段:
    
    <HTTPProvider>
    	<BaseClass>com.wowza.wms.plugin.loadbalancer.HTTPLoadBalancerRedirector</BaseClass>
    	<RequestFilters>*loadbalancer</RequestFilters>
    	<AuthenticationMethod>none</AuthenticationMethod>
    	<Properties>
    		<Property>
    			<Name>enableServerInfoXML</Name>
    			<Value>true</Value>
    			<Type>Boolean</Type>
    		</Property>
    	</Properties>
    </HTTPProvider>
    




二、在"edge" 服务器上配置load balancer "sender"

  1. 1、安装 Wowza Media Server
  2. 2、将压缩包中的lib/wms-plugin-loadbalancer.jar 拷贝到Wowza Media Server的[install-dir]/lib/目录下。
  3. 3、编辑 [install-dir]/conf/Server.xml ,做如下改动:

    在<ServerListeners>列表中添加下面的ServerListener 实体 :
    
    <ServerListener>
    	<BaseClass>com.wowza.wms.plugin.loadbalancer.ServerListenerLoadBalancerSender</BaseClass>
    </ServerListener>
    

    在Server.xml文件的最下面的<Properties>中添加下面的属性:
    
    <Property>
    	<Name>loadBalancerSenderTargetPath</Name>
    	<Value>${com.wowza.wms.AppHome}/conf/loadbalancertargets.txt</Value>
    </Property>
    <Property>
    	<Name>loadBalancerSenderRedirectAddress</Name>
    	<Value>[redirect-address]</Value>
    </Property>
    <Property>
    	<Name>loadBalancerSenderMonitorClass</Name>
    	<Value>com.wowza.wms.plugin.loadbalancer.LoadBalancerMonitorDefault</Value>
    </Property>
    <Property>
    	<Name>loadBalancerSenderMessageInterval</Name>
    	<Value>2500</Value>
    	<Type>Integer</Type>
    </Property>
    

    其中[redirect-address] 是这个边缘服务器的外部IP地址或域名(千万不要用私网地址)。当客户端播放器重定向到这个edge服务器时,将使用这个服务地址。 当在EC2上使用这个系统时,你可以将[redirect-address] 设置为 ${com.wowza.amazonaws.ec2.AWSEC2_METADATA_PUBLIC_IPV4}
    当服务启动时,它将使用这个参数的公网IP地址对外提供服务。

  4. 4、用文本编辑器创建[install-dir]/conf/loadbalancertargets.txt文件,文件内容如下面两行(第一个行是注释):
    
    # [load-balancer-ip-address],[load-balancer-port],[encryption-key]
    [load-balancer-ip-address],1934,023D4FB4IS83
    

    其中[load-balancer-ip-address] 是运行load balancer的中心服务器的IP地址或域名。

    注1:这个配置使用UDP port 1934用于edge 服务器 和 load balancer之间的通信。请确认在你的防火强上打开这个端口。

    注2:Edge服务器和load balancer之间的所有通信都经过加密和签名的。load balandcer 上的密钥配置在loadBalancerListenerKey属性中。 Edge服务器上的密钥在loadbalancertargets.txt 文件中。这些密钥必须能够匹配(共享密钥)。

    注3:通过在loadbalancertargets.txt中添加新的行,一个edge 服务器可以和多个load balancer通信。


到此为止,负载均衡的基本配置工作已经完成!


你现在可以启动Load balancer 和多个Edge 服务器。如果运行正常,Edge 服务器就会每隔2.5秒向load balancer更新自己的状态和负载信息。 www.wowza.cn 你用Web浏览器访问下面的URL,就可以看到已经在load balancer上注册的edge服务器以及它们的状态:


http://[load-balancer-ip-address]:1935/loadbalancer?serverInfoXML

其中[load-balancer-ip-address] 是运行load balancer的中心服务器的IP地址或域名。它将返回一个包含每个Edge服务器及它的细节信息的XML文档。
一旦你的load balancing 服务器运行在一个商业运营环境,你可能会希望关闭掉这个查询接口。你可以在[install-dir]/conf/VHost.xml 中将HTTPProvider/Properties/PropertyenableServerInfoXML设置为false。



三、通过Http请求获得负载最少的Edge服务器


要从load balancer获得负载最少的edge服务器,其中一个方法是通过HTTP向load balancer发出请求。这个url请求是:


http://[load-balancer-ip-address]:1935/loadbalancer

其中 [load-balancer-ip-address] 是运行load balancer的中心服务器的IP地址或域名。这个请求将收到形式为"redirect=[ip-address]"的负载最少的服务器IP地址。 这个插件的Flash例子程序client/httpgetredirect.fla 包含了ActionScript 3.0 代码,它发送了这个请求并解析了响应。你可以在WEB浏览器中访问这个URL来测试这个功能。



四、通过Netconnection redirect获得负载最少的edge服务器


你可以在运行load balancer的中心服务器上配置一个加载了ModuleLoadBalancerRedirector模块(module)的Application,用这个办法可以获得负载最少的edge服务器的地址。
要配置一个使用这个模块的应用,按照下面进行:

  1. 1、创建[install-dir]/applications/redirect文件夹
  2. 2、创建[install-dir]/conf/redirect文件夹,并将[install-dir]/conf/Application.xml 拷贝到这个新的文件夹中。
  3. 3、编辑这个新拷贝的Application.xml 文件,在module列表的最后添加下面的这个module:
    
    <Module>
    	<Name>ModuleLoadBalancerRedirector</Name>
    	<Description>ModuleLoadBalancerRedirector</Description>
    	<Class>com.wowza.wms.plugin.loadbalancer.ModuleLoadBalancerRedirector</Class>
    </Module>
    

  4. 在Application.xml最后的propertie部分添加下面的属性参数:
    
    <Property>
    	<Name>redirectAppName</Name>
    	<Value>[application-name]</Value>
    </Property>
    <!--
    <Property>
    	<Name>redirectPort</Name>
    	<Value>[redirect-port]</Value>
    </Property>
    -->
    <!--
    <Property>
    	<Name>redirectScheme</Name>
    	<Value>rtmp</Value>
    </Property>
    -->
    <Property>
    	<Name>redirectOnConnect</Name>
    	<Value>true</Value>
    	<Type>Boolean</Type>
    </Property>
    

    其中[application-name] 是你需要将请求重定向到一个edge服务器的应用。[redirect-port] 是重定向目的主机的服务端口(例如 1935 或 80)。 如果将redirectPortredirectScheme注释掉,则系统将使用与连接这个load balancer同样的scheme和端口作为重定向到edge 服务器的参数。

在Flash例子 client/redirect.fla 中包含了处理RTMP重定向功能的ActionScript 3.0 代码。


注意: 你可以通过启动更多的load balancer 服务器并在edge服务器的loadbalancertargets.txt文件中添加更多的listener的地址,来配置多个load balancer 服务器用于故障转移(failover)或分担edge 服务器发来的连接压力。


注意: 这个插件使用了global unique identifier (GUID) ,它配置在[install-dir]/conf/Server.guid 文件中用于唯一标识一个服务器。 如果一套Wowza Media Server 已经被安装配置完成,需要用整个安装目录拷贝的方式将它部署都多个其它服务器上时,请一定要确认在新的服务器上删除[install-dir]/conf/Server.guid文件。 在第一次启动时,服务器会创建这个文件。www.wowza.cn


注意: ServerListenerLoadBalancerListenerServerListenerLoadBalancerSender都通过JMX/JConsole接口对外暴露了一些属性和方法。 它可以用于对系统的监控和管理。Edge服务器上的 ServerListenerLoadBalancerSender暴露了两个方法: pauseunpause。 它们可以被用于临时性从Edge服务器池中去除某一个服务器。当一台Edge服务器处于暂停状态时,它不会向load balancer 发出任何连接请求。www.wowza.cn