首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

JGroups(四)

2012-06-26 
JGroups(4)转载自:http://whitesock.iteye.com/blog/199956?4 Protocol Stack4.1 Transport protocols???

JGroups(4)

转载自:http://whitesock.iteye.com/blog/199956

?

4 Protocol Stack
4.1 Transport protocols
??? Transport protocols是指协议栈中最底层的协议,它们负责发送和接收消息。JGgroups提供了以下几种transport protocols。

4.1.1 UDP
??? JGroups中的UDP协议使用IP multicast向集群发送消息,使用UDP datagram向单个的成员发送unicast消息。启动后会打开两个socket,分别是multicast socket和unicast socket。Channel的地址是unicast socket的地址和端口号。UDP通常用于集群中的成员分布于LAN内的情况。
??? 如果使用UDP和PING做为协议栈的底层协议,那么JGroups会使用IP multicast发现集群中的成员,以及向集群发送发送消息。然而,如果IP multicast在子网间被禁用,那么可以设置UDP的ip_mcast属性为false,以便指定UDP使用多个unicast messages向集群发送消息,而不是使用multicast message。此外,还需要设置PING的gossip_系列属性,以便指定PING使用GossipRouter来发现集群中的其它成员。需要注意的是,对GossipRouter的依赖可能会导致single point of failure,而且系统的可伸缩性也比较差。
??? 在启动任何成员之前,首先要启动GossipRouter(否则成员需要处理MergeView消息用于合并subgroup的状态),例如:

            />??

          ??? 以上例子中stability_delay属性指定,在发送消息前等待1~1000毫秒,以避免所有的成员同时发送消息。 desired_avg_gossip属性指定发送stable messages的周期,单位是毫秒,如果是0,那么禁用周期检查。max_bytes指定了在发送stable message消息前,接收到的消息的最大字节数。

          4.4.2 pbcast.FLUSH
          ??? 4.2 Reliable Message中介绍了保证消息可靠传输的协议,但是在某些情况下,这种保证是不够的,考虑以下情况:
          集群中某个成员A向集群发送消息M1,此时A的当前View是V1={A,B,C},也就是说A认为M1将发送到A(如果Channel.LOCAL选项是true)、B和C。正在此时,D也加入到集群中,那么D可能会,也可能不会收到M1。
          通过在协议栈中配置FLUSH协议可以保证:

          • 发送到V1的消息只会被传递到V1。所以以上例子中D不会收到M1。
          • 在安装V2前,集群中所有的成员都收到相同的消息。例如一个集群V1={A,B,C}中,C发送了5个消息,A收到了C发送的这5个消息,但是B 只收到了其中前3个。如果此时C崩溃,那么FLUSH协议会保证,在安装V2={A,B} 前,B会收到所有C发送过的消息。在这种情况下,A会向B发送后两个消息。

            ??? 通常,在以下两种情况下需要使用FLUSH协议:

            • State transfer 当某个成员请求状态传递时,它通知其它成员停止发送消息并等待响应。接下来coordinator会将状态发送给这个成员。当该成员接收到状态后,它通知其它成员可以继续发送消息。
            • View changes 在安装新的view时,所有发送到V1的消息都会被传递到V1。

              ??? FLUSH协议通常在STATE_TRANSFER、STATE_TRANSFER 或者 GMS 协议之上。此外需要注意的时,FLUSH协议必须是协议栈的最上层协议。除了JGroups自动处理FLUSH之外,JGroups也允许开发人员显式调用 Channel.startFlush()方法发起flush。在Channel.startFlush()方法返回后,在调用 Channel.stopFlush()方法之前,可以保证集群中的所有成员不能发送消息,而且Channel.startFlush()方法调用前发送的消息都会被所有成员接收。在调用了Channel.stopFlush()方法之后,集群中的所有成员可以继续发送消息。
              ??? 如果将Channel.BLOCK属性设置为true(缺省是false),那么可以在flush阶段得到通知。如果采用poll方式,那么在某个成员调用Channel.startFlush()方法后,其它成员会收到EVENT.BLOCK消息,这些成员应该发送EVENT.BLOCK_OK消息进行响应。如果采用push方式,那么channel上注册的MembershipListener的block()方法会被调用。

              4.4.3 MERGE2
              ??? 假设由于某种原因(例如switch故障),某个集群{A,B,C,D,E},分裂为两个子集群{A,B,C} 和{D,E},A、B和C可以互相ping通,D和E可以互相ping通,但是A、B和C却ping不通D和E。在这种情况下,由于两个子集群独立工作,会导致这两个子集群的状态并不相同。当故障解除后,MERGE2协议会通知集群中的成员,这两个子集群将合并成一个。
              ??? 至于如何处理状态的合并,需要应用程序自己决定,这是因为JGroups并不了解集群的状态。需要注意的是,用于合并的状态的代码应该在单独的线程中执行。一种简单的处理方式是对于原来是主子集群中的成员不做任何处理,对于其它的成员则丢弃当前状态,从合并后集群的coordinator处重新获得状态。

热点排行