OMCS 开发手册(13) -- 群集平台
当使用OMCS群集系统后,登录到群集中的不同OMCS应用服务器节点上的客户端用户之间可以相互进行音视频通话或远程桌面,就像这些用户登录在同一个OMCS服务器上一样。
这个过程对于二次开发人员和最终的用户而言,是完全透明的。OMCS群集平台已经在内部自动打理好了一切。
OMCS群集系统主要解决两个方面的问题:
(1)扩容
单台OMCS服务器的带宽和硬件配置始终是有限的,在应对大量的同时在线用户时,可以通过OMCS群集系统来大幅度扩展系统的吞吐能力。
(2)线路加速
有些系统的用户是分散在不同地域的(甚至有跨国的),仅仅在某IDC机房部署单个OMCS服务器,就很难保证所有用户到该服务器的通信线路质量都是较好的。这种情况下,使用OMCS群集系统,就可以在不同的地方部署OMCS应用服务器节点,不同地域的用户选择就近连接对应的节点服务器,起到类似CDN的作用。
一. 群集基础模型
在单个服务器应用中,我们的关注焦点在于服务端和客户端。而在多服务器的群集应用中,我们需要增加一个核心关注点,那就是平台层。OMCS群集模型可以划分为三层:平台层、应用层、客户端。如下图所示的是OMCS所支持的最简单的群集模型:
平台层的核心是 OMCS群集平台服务器(PS),用于管理OMCS群集中的所有应用服务器节点。
应用层的核心是 OMCS应用服务器节点(AS),其相当于非群集架构中的OMCS服务端。
二. 策略与原则
一般而言,群集系统都是相当复杂的系统,为了处理复杂性,原则是必需要遵守的,除非你有充分的理由,并能更好地解决问题。在使用OMCS群集平台时,我们要充分重视以下几点。
1.保证应用服务器AS与平台服务器PS之间网络畅通
AS在任何时候都有可能访问PS,比如用户上下线的时候,AS需要向PS报告;有些客户端之间的信息必需经过PS进行中转,等等。
建议AS与PS最好部署在同一个机房的同一个局域网内,以保证通信的质量和速度。如果AS与PS分布在广域网,则需使用有质量保障的网络连接(比如,阿里云的服务器之间可以使用VPC对等连接)。
2.尽可能使需要相互沟通的客户端连上同一个AS
一个新启动的客户端应该连接到哪个AS服务器,是由我们的AS分配策略来决定的。所以,为了尽可能地减少经PS转发的消息数量,也就是尽可能地降低PS的负载,在设计AS的分配策略时,应特别注意尽可能地使那些需要相互沟通的客户端连接到同一个AS服务个器上。这样,即使两个客户端之间的P2P通道没有打通,那么,他们之间的交互信息只要通过AS中转就可以了,不需要麻烦到PS。
3.热机备份PS
在群集模型中,很容易看到PS是整个群集系统的“单点”,如果PS挂掉,虽然每个AS还可以独立工作,但跨AS的消息就无法完成转发了。所以,在部署PS时,最好使用双热机备份,这样在主PS意外当机后,另一台备份机就立马可以接手工作。
三. 客户端如何选择最优的应用服务器登录?
一般二次开发时,会构建一个登录决策服务器(LogonDecisionServer) ,LogonDecisionServer通过 WebAPI 暴露服务。客户端在登录之前,先访问该WebAPI获取自己要登录的应用服务器AS节点的IP和端口,然后再去登录目标AS。
那么,LogonDecisionServer 一般采用哪些策略来决定请求的客户端最适合登录那台AS了?
1. 如果单单是为了解决服务器负载过大而使用群集的情况,LogonDecisionServer 每次就分配当前负载最小的那台AS给请求的客户端。
2. 如果分布式群集主要是为了解决不同区域的客户端到服务器的网络质量问题,那么,通常有两种方案:
(1)在服务端决策。
在LogonDecisionServer配置文件中配置好 “地理区域 - 应用服务器IP与端口” 的映射表,当客户端来请求时,LogonDecisionServer首先根据客户端的IP找到其所对应的地理区域,然后在从映射表中匹配到其对应的应用服务器AS,将其IP与端口返回给客户端。
(2)在客户端决策。
每次客户端请求时,LogonDecisionServer都将在线的所有的AS的IP与端口列表返回给客户端,客户端针对列表中的每一个IP进行ping测试,然后通过比较ping值和抖动、丢包情况综合决定网络通道质量最好的那台AS服务器作为要登录的目标服务器。
四. 如何使用 OMCS 群集 ?
1. OMCS群集平台服务器
使用 MultimediaServerFactory 的静态方法 CreateOmcsPlatformServer,即可创建一个PS实例:
/// <summary> /// 创建群集平台服务器。 /// </summary> /// <param name="platformServerPort">平台服务器端口</param> public static IOmcsPlatformServer CreateOmcsPlatformServer(int platformServerPort)
IOmcsPlatformServer 就是平台服务器实例的接口,其定义如下:
public interface IOmcsPlatformServer { /// <summary> /// 群集中有新的服务器注册进来。 /// </summary> event CbGeneric<ApplicationServerInfo> ServerRegistered; /// <summary> /// 群集中的某服务已被注销。参数:服务器ID /// </summary> event CbGeneric<string> ServerUnregistered; /// <summary> /// 当在AS之间转发消息时,触发该事件。参数:SourceUserID - DestUserID - MessageLength /// </summary> event CbGeneric<string, string, int> MessageTransfered; /// <summary> /// 目标服务器是否正在线? /// </summary> /// <param name="serverID">目标服务器的ServerID</param> /// <returns>在线?</returns> bool IsServerOnline(string serverID); /// <summary> /// 获取总的在线用户数。 /// </summary> int GetOnlineUserCount(); /// <summary> /// 获取目标服务器的信息。 /// </summary> ApplicationServerInfo GetServer(string serverID); /// <summary> /// 获取群集中在线的所有服务器。 /// </summary> List<ApplicationServerInfo> GetAllServers(); /// <summary> /// 关闭OMCS群集平台服务器。 /// </summary> void Close(); }
2. 应用服务器节点
就像创建普通OMCS服务端实例一样,也是使用 MultimediaServerFactory 的静态重载方法 CreateMultimediaServer,即可创建一个OMCS应用服务器节点AS实例:
/// <summary> /// 创建OMCS群集系统中的应用服务器节点实例。 /// </summary> /// <param name="psIP">群集管理服务器的IP</param> /// <param name="psPort">群集管理服务器的端口</param> /// <param name="currentServerID">当前服务器节点的ID</param> /// <param name="currentServerPort">当前OMCS节点服务器监听的端口。</param> /// <param name="userVerifier">用户帐密验证器。</param> /// <param name="securityLogEnabled">是否记录详细的安全日志,一般在debug时使用</param> /// <param name="logger">日志记录器</param> public static IMultimediaServer CreateMultimediaServer( string psIP, int psPort, string currentServerID, int currentServerPort, IUserVerifier userVerifier,
bool securityLogEnabled , IAgileLogger logger)
跟普通OMCS服务器一样,该方法返回的也是 IMultimediaServer 引用。其它的使用方式,就与普通OMCS服务器一模一样了。
3. 客户端
客户端不用做任何特殊处理,对客户端而言,是否位于群集系统中,是完全一样的。
4. Demo下载
这里我们将 OMCS入门Demo 改造为服务器群集版,只需将原demo的服务端稍作调整,客户端不用任何改动的。
OMCS群集Demo源码:OMCS.ClusterDemo.rar
该Demo运行效果截图:
-----------------------------------------------------------------------------------------------------------------------------------------------
阅读 更多OMCS开发手册系列文章 。
Q Q:168757008