BEA公司的WebLogic 10发布了。由于学习与工作的关系,我跟这家公司及其产品走得比较近^-^,今天,透过内幕消息来谈谈weblogic10 cluster的心跳。
服务器的集群是为了分散请求压力,并提供容错能力。集群中的server之间要保持通讯才能及时知道哪个server死掉了,以便把请求转发到别的server上。
cluster内部的通讯有两种:1是点对点(peer-to-peer)通讯,用TCP socket。2是广播消息,由一个server发给其它所有server的。
检查哪些server死掉,哪些活着,就是通过心跳——heartbeat。它是个广播消息。
在此之前,广播消息是用multicast协议,即发布/订阅模式。有一个地址和端口,cluster里所有的受管server都去监听。它使用的是UDP协议,不太可靠,有时会丢消息,如果集群内的server属于不同子网也会有问题,而且端口还可能和其它程序发生冲突。
如今在weblogic 10里,引入了unicast集群通讯协议。
unicast是点对点的TCP通讯,每个连接要建一个socket。用点对点通讯做一对多的广播,消息可靠了,跨子网问题也解决了,但面临一个问题:集群内server太多的话就会耗尽发送者的socket资源。为此weblogic采取了一种措施,将managed server每10个一组(事先按server名排序)分成多组(不足10个的也算一组),每个group选出一个leader,由leader与本组成员通讯,也和其它的leader通讯。这样,如果一个成员要广播一条消息,那么:
1、如果它不是leader,它就联系自己的leader,向它发送数据。
2、leader转发给所有本组其它成员。
3、leader转发给所有其它组的leader。
4、其它组的leader转发给自己的成员。
这个通讯过程会比直接multicast广播慢一些,因此unicast的heartbeat检测间隔是15秒,而不是multicast的10秒。在unicast下,一个server只要有一次heartbeat没检测到,就会被移出cluster的可用服务器列表。