Weblogic 实例在集群中使用 IP套接字和 IP 单播或者多播进行集群信息的传递。
IP套接字(socket)是集群服务器之间的点对点通信
IP 单播(unicast)或者多播(multicast)则是服务器实例用来广播服务可用性以及传递集群可用性心跳
Weblogic 服务支持两种集群信息协议:单播和多播
单播:使用点对点的TCP/IP 套接字协议,Weblogic 10.0 开始使用
多播:使用UDP 协议,自Weblogic 4.0开始在Weblogic 集群中使用。
多播是一种比较简单的广播技术,可以让众多的应用“订阅” 指定的IP,端口以获取消息。
多播地址是一个IP地址,范围从224.0.0.0 到239.255.255.255,在weblogic 中默认的地址是239.192.0.0,应该避免使用多播地址,以免冲突。UDP 的端口范围是0-65535,然而有些特定UDP端口会有特定的用途,也应该避免冲突使用。
默认情况下,Weblogic 设置TTL 为1,以限定多播消息只在一个子网内传播。
总的来说,多播是这样的:
使用非常有效率且可扩展的点对点模型,使得weblogic 实例只需要发送一次信息到网络中,然后让网络保证消息能传递到其他实例中。
在集群成员都在一个子网中的情况下,开箱可用,方便。
当集群成员不在一个子网中的情况下,需要配置其他参数,比如多播TTL
连续丢失集群心跳三次,心跳间隔10秒,则认为该成员GG,移除出集群
可以使用MulticastTest 工具进行测试
weblogic 在集群中使用多播进行一对多的通信,比如:在很多节点的集群里进行集群范围的JNDI更新,集群心跳。
集群在广域网(WAN)中的多播配置:
路由器对多播数据包传播的完全支持
低网络延迟,可确保让大部分消息能在10ms内到达
TTL 设置合适,能让多播数据包传递到集群成员手上,在config.xml上 进行设置:
Name="testcluster"
ClusterAddress="wanclust"
MulticastAddress="wanclust-multi"
MulticastTTL="3"
/>
注意:
1,防火墙可能隔断多播消息传递。
2,不要和其他应用共享多播地址
3,udp_max_buf 设置能有效降低 多播风暴,提高性能
使用单播进行一对多通信
weblogic单播协议使用TCP/IP套接字发送信息到集群成员,因为TCP/IP 协议是点对点的协议,因此集群成员能直接接收到信息。
为了限制因为集群成员增加导致的套接字数量增加,weblogic 使用组长的机制,在这个机制中:
weblogic 将集群成员分成固定数量的组
每个组有一个实例充当组长,当组长实例GG,会推举出另外一个组长。
集群成员发送消息时,只发给组长,然后组长再转发给组成员。
单播机制下,每次心跳检查间隔为15秒,失败一次则认为成员GG。
使用 ClusterMBean.setClusterMessagingMode 参数指定使用单播或者多播。
使用多播和单播的对比
使用IP套接字进行点对点通信
weblogic 集群服务实例使用IP套接字以:
访问在其他集群的服务实例上的非集群化对象
在主服务实例和辅助实例之间复制HTTP会话状态和有状态的EJB会话状态
访问驻留在远程服务器上的集群对象(通常只发生在多集群架构上)
正确的套接字配置对weblogic 集群的性能影响至关重要,有两个重要的因素决定了Weblogic 的套接字通信效率:
服务器实例使用 native 或 pure-java socket reader (这里实在不好翻译)
如果使用pure-java socket reader ,是否有足够的socket reader thread
建议使用 native 。一开始我也不知道为什么,后来明白了,看以下内容:
Native socket readers use far more efficient techniques to determine if there is data to read on a socket. With a native socket reader implementation, reader threads do not need to poll inactive sockets—they service only active sockets, and they are immediately notified (via an interrupt) when a given socket becomes active.
设置客户端的socket reader,在java 命令行中指定以下参数:
-Dweblogic.ThreadPoolSize=value
-Dweblogic.ThreadPoolPercentSocketReaders=value
在集群中启动受管服务器的时候,需要等待在 ClusterMBean 中指定的
MemberWarmupTimeoutSeconds 热身时间(默认30s)通过监听心跳信息确认在集群中的其他实例。
领取专属 10元无门槛券
私享最新 技术干货