1. 负载均衡
复制是一个重要的IceGrid功能,与负载平衡结合使用时,复制变得更加有用。
IceGrid节点定期向注册表报告主机的系统负载。副本组的配置决定注册表是否在处理定位请求时实际考虑系统负载信息。它的配置还指定注册表的响应中包含多少个副本。
IceGrid的负载均衡能力会协助客户端来获取初始端点集合以建立连接。一旦客户端建立连接,发起连接代理服务端上的所有后续请求,通常会发送到同一服务器,而无需与注册表进一步协商。因此,注册表对定位请求的响应只能被视为特定时刻副本的快照。如果系统负载对客户很重要,则必须采取措施周期性地联系注册表并更新它的端点。
2. 副本组负载均衡
副本组描述符可选地包含一个负载平衡描述符,该描述符确定在定位请求中如何使用系统负载。负载均衡描述符指定以下信息:
- 类型
支持多种负载均衡类型。
- 采样间隔
其中一种负载均衡类型会考虑每个节点定期报告的系统负载统计信息。副本组可以指定一分钟,五分钟或十五分钟的采样间隔。选择采样间隔需要平衡对最新负载信息的需求与最小化瞬态尖峰的期望。在Unix平台上,节点会报告所选时间间隔内的系统负载平均值,而在Windows上,该节点会报告该时间间隔内CPU的平均利用率。
- 副本的数量
副本组可以指示注册表返回一个(默认)或更多对象适配器的端点。如果指定的数字N大于1,则响应定位请求返回的代理包含至多N个对象适配器的端点。如果N为0,则代理包含所有对象适配器的端点。客户端在建立连接时随机选择其中一个端点。
例如,下面显示的描述符,使用自适应负载均衡,来返回以五分钟间隔采样期间,两个最低负载对象适配器的端点:
<replica-group id="ReplicatedAdapter">
<load-balancing type="adaptive" load-sample="5" n-replicas="2"/>
</replica-group>
type必须指定,其他属性可选。
执行定位请求时,IceGrid会忽略禁用服务器的对象适配器,这意味着启动定位请求的客户端,将不会收到任何这些对象适配器的端点。
通过安装副本组筛选器,你可以使用自定义负载均衡策略。
3. 负载均衡类型
副本组可以选择以下负载均衡类型之一:
- 随机
随机负载均衡,随机选择对象适配器的请求数量。注册表不考虑具有此类型副本组的系统负载。
- 自适应
自适应负载均衡,通过请求的采样间隔,来选择使用系统负载最低的对象适配器。这是使用采样间隔的唯一负载均衡类型。
- 轮询调度
轮询负载均衡,返回最近最少使用的对象适配器。注册表不考虑具有此类型副本组的系统负载。请注意,轮询信息不在注册表副本之间共享;每个副本都维护自己的“最近最少使用”对象适配器的标记。
- 有序
有序负载均衡,按优先级选择对象适配器的请求数量。可以为副本组的每个对象适配器成员设置优先级。如果你定义了多个具有相同优先级的对象适配器,则IceGrid将根据它们在描述符中出现的顺序,来排序这些对象适配器。
选择合适的负载均衡类型高度依赖于客户端应用程序的需求。实现所需的负载平衡和故障转移行为也可能需要客户的合作。为此,了解Ice运行时是在什么时候以什么方式,使用定位器来解析间接代理非常重要。
4. 在Ripper中使用负载均衡
我们需要对Ripper进行的唯一更改是添加一个负载均衡描述符:
<icegrid>
<application name="Ripper">
<replica-group id="EncoderAdapters">
<load-balancing type="adaptive"/>
<object identity="EncoderFactory" type="::Ripper::MP3EncoderFactory"/>
</replica-group>
<server-template id="EncoderServerTemplate">
<parameter name="index"/>
<parameter name="exepath" default="/opt/ripper/bin/server"/>
<server id="EncoderServer${index}" exe="${exepath}" activation="on-demand">
<adapter name="EncoderAdapter" replica-group="EncoderAdapters"
endpoints="tcp"/>
</server>
</server-template>
<node name="Node1">
<server-instance template="EncoderServerTemplate" index="1"/>
</node>
<node name="Node2">
<server-instance template="EncoderServerTemplate" index="2"/>
</node>
</application>
</icegrid>
使用自适应负载均衡,当我们引入副本组时,我们重新获得了我们没有的功能。换句话说,我们现在选择负载最小节点上的对象适配器,而不需要在客户端进行任何更改。
5. 与对象副本进行交互
在某些应用程序中,你可能需要直接与对象的副本进行交互。你可能试图在复制对象的代理上调用ice_getEndpoints以获取所有副本的端点,但这不是正确的解决方案,因为代理是间接的,不包含端点。正确的方法是使用findAllReplicas方法来查询知名对象。
6. 自定义负载平衡策略
IceGrid注册表允许你插入自定义负载平衡实现,注册表调用并过滤它的查询结果。支持两种过滤器:
- 副本组过滤器
每次客户端请求副本组或对象适配器的端点,以及调用findAllReplicas时,注册表都会调用副本组筛选器。注册表传递关于过滤器能使用在它的实现中查询的信息,其中包括参与副本组的节点在请求时处于活动状态的对象适配器的列表。对象适配器列表最初使用为副本组配置的负载平衡类型进行排序;过滤器可以修改这个列表当它选择时。
- 类型过滤器
注册表为客户端发出的每个查询调用一个类型过滤器,使用方法findObjectByType,findAllObjectsByType和findObjectByTypeOnLeastLoadedNode按类型查找知名对象。包含在传递给过滤器的信息是可以匹配已知对象代理的列表;在过滤器实现决定将哪些代理返回给客户端。
在下面的章节中,我们将介绍如何实现这些过滤器。