`

JGroup 使用分享

 
阅读更多

 JGroup是当前被广泛使用的可靠组间通信的工具之一。例如OSCache以及JBossTreeCache都是用的是JGroup。
       JGroup功能十分强大,通过配置各种参数就可以充分利用它所提供的各项功能。JGroup最大的特点就是支持协议栈的可配置性,它本是实现了基本的Java的协议栈实现,也就是最基本的消息广播的基础,同时支持附加协议栈的配置,消息的传递就是在这些协议栈之间相互传递,封装,检查,丢弃,重发。JGroup可以基于TCP协议来实现消息广播,也可以通过UDP方式来广播消息,利弊不言而喻,TCP可靠,但是代价大,性能没有UDP来的好,UDP速度快,代价小,但是消息的丢失率以及无序性有着很大的限制。但是JGroup在UDP方式的基础上,增加了协议栈的配置,通过配置上层的协议,可以保证消息的重发,大包体的分解(同时保证消息包体顺序),组内机器的状态检测等功能。
       这里大致描述一下使用中的配置参数的内容,可以在配置中正确合理的配置好JGroup的功能,使之在分布式环境中起到最合适的作用。
       当我们启动一个JGroup的组的时候,其实建立了一个通道,可以通过配置文件为这个通道配置相应的协议栈,那么在这个通道上传递的消息也就会在配置的协议栈中传递交互。但是配置多协议的时候也需要注意,当配置的协议越多,那么功能也越强大,支持的传输特性也越多,但是其损失的可能就是性能,所以和平时的网络编程一样,UDP和TCP各有优缺点,只是根据使用的场景需求不同来合理的使用不同的协议栈叠加,达到最佳的效果。
 
       先贴一段JGroup的范例配置:
 
"UDP(mcast_addr=224.0.0.35;mcast_port=45566;ip_ttl=32;" +
"mcast_send_buf_size=150000;mcast_recv_buf_size=80000):" +
"PING(timeout=2000;num_initial_members=3):" +
"MERGE2(min_interval=5000;max_interval=10000):" +
"FD_SOCK:" +
"VERIFY_SUSPECT(timeout=1500):" +
"pbcast.STABLE(desired_avg_gossip=20000):" +
"pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800):" +
"UNICAST(timeout=5000;min_wait_time=2000):" +
"FRAG(frag_size=4096;down_thread=false;up_thread=false):" +
"pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;" +
"shun=false;print_local_addr=true)"
 
UDP:使用IP多波协议来广播组内消息并且使用的是UDP包作为消息发送给独立的Member。
 
PING:是用多波协议来查找初始化的在线Member。
 
MERGE2:允许将子组合并到一个组。
 
FD_SOCK:基于Socket的错误检测(通过Member之间的环形检测来实现)。当发现有member失败就产生消息通知。
VERIFY_SUSPECT:双重检测member是否确实Dead,多了Suspect的状态。
 
Pbcast.STABLE:删除被全部member查看到的消息(作用就是如果在分布式的情况下,其中某些member没有看到,那么这条消息就不会被删除,会重发,保证消息广播的全局性)
 
Pbcast.NAKACK:保证消息的可靠性和FIFO(消息的顺序传递)。
 
UNICAST:类似于NAKACK的功能。
 
FRAG:大消息的拆分和组装。
 
Pbcast.GMS:组成员协议,响应加入离开组的消息以及新建view的消息。
 
UDP配置:
UDP广播模式可以配置成两种方式:使用UDP和常规IP多波传输。配置类似于范例中的配置。所有的组内成员都运行在一个host上,分布在一个LAN内。但是这个需要确认的就是IP的多波传递是否允许穿越多个子网,通常情况下是不允许穿越多个子网的,因此就需要确保多个组内的member在一个局域网中,并且可以相互间通信。
 
另一种模式就是使用UDP但是不使用IP多波传递。UDP和PING的配置都是基于IP的多波传递的,因此消息传递以及组内成员的初始化检测都是要依靠于IP多波。因此这里提供了另外一种方式就是设定一个每一个member都能够访问到的机器,在这台机器上面设置一个GossipRouter,类似于路由一样,每一个member的注册都直接在这台机器上的服务上管理。
需要配置的就是设置ip_mcast为false。同时需要配置gossip_host gossip_port gossip_refresh这三个参数(地址,端口,刷新一次GossipRouter的时间)。
然后就在那台服务器上运行GossipRouter程序:
java org.jgroups.stack.GossipRouter -port 5555 -bindaddress localhost
 
配置如下:
"UDP(ip_mcast=false;mcast_addr=224.0.0.35;mcast_port=45566;ip_ttl=32;" +
"mcast_send_buf_size=150000;mcast_recv_buf_size=80000):" +
"PING(gossip_host=localhost;gossip_port=5555;gossip_refresh=15000;" +
"timeout=2000;num_initial_members=3):" +
 
当如果需要在WAN中使用JGroup的时候就需要配置TCP来替换UDP了。
"TCP(start_port=7800):" +
"TCPPING(initial_hosts=localhost[7800];port_range=5;timeout=
"num_initial_members=3;up_thread=true;down_thread=true):" +
"VERIFY_SUSPECT(timeout=1500;down_thread=false;up_thread=false):"
"pbcast.STABLE(desired_avg_gossip=20000;down_thread=false;up_
"pbcast.NAKACK(down_thread=true;up_thread=true;gc_lag=100;retransmit_
"pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;"
"print_local_addr=false;down_thread=true;up_thread=true)";
FD 协议栈(Failure Detection)
FD的作用就是探测组内的成员是否还活着。当组内的成员被怀疑可能死掉了,那么SUSPECT消息就会传播到集群的每一个节点上。不过这个协议没有将crashed的member踢出去的功能,这个工作由GMS来做,它只是通知的功能。
FD是基于心跳消息检测来实现的,如果回复消息在timeout的规定时间内没有收到,那么就会宣布那个node被suspected,然后会被GMS给踢出去。一共三个参数作为配置项:
Timeout,max_tries,shun。前面两个不说了,最后一个十分重要。例如:一个组内有a,b,c,d四个成员,当d由于负荷过高没有在timeout的时间内作出响应,导致被踢出组的时候,a,b,c的组员view中只有abc三个member,而d的view却还有abcd四个成员,此时如果D再发消息给组内的成员,组内成员将会拒绝接受。那么如果设置shun为true的时候,D就重新加入组内在下面两种情况:1.ABC接受到了D发过来的are-you-alive的检测消息。2.D自己收到了一个view消息,view内不包含D。(类似于重连机制)。这点很重要特别是在分布式的环境中,当某些服务器的压力可能较高,配置的超时时间又不确定是否可以满足高负荷响应。记得要在GMS里面的shun也配置一样的情况。
 
FD_ALL也是基于简单的心跳协议,只不过是每个节点会向每一个member周期的发送心跳包,同时将会保存每个member的状态表。
 
FD_SOCK是基于环形的TCP Socket互联,相互监测来实现FD的功能的,每一个member都有自己的邻居,使得member组成一个环形的校验链。但是有几个缺点,第一当使用多网卡机器的时候,2.2.8以前的版本就可能造成随机绑定ip的问题,以后可以指定bind_addr这个参数,明确邻居的ip。另外的缺点也就是我们在实施过程中发现的问题,由于TCP的异常产生未必都能被检测到,同时例如网络问题等因素,往往这种FD很难保证真实的挂起出错的node,加之他是ring的检测方式,会导致明明某个member已经dead了,但是由于没有检测到,导致后面再加入的member或者自己重启,都无法正常使JGroup正常工作,不断地在重复join/leave的操作。(所以不建议使用这种模式)
 
Group Membership
他关注新member的加入,member离开的请求,处理crashed的member suspect消息等操作
分享到:
评论

相关推荐

    jgroup使用实例

    本实例将深入讲解如何使用JGroup实现跨机器的通信。 首先,我们需要了解JGroup的基本组件。JGroup提供了多种协议栈,这些协议栈由一系列层次化的协议组成,每个协议负责不同的任务,如组成员发现、消息传递、故障...

    Jgroup学习总结

    JGroup使用多种协议来发现和管理组内的成员。例如,`PING`协议用于发现新加入的成员,`MERGE2`协议用于合并多个子群,`FD`(故障检测)和`FD_ALL`协议则用于检测并剔除故障节点,确保组的健康状态。 ### 3. 消息...

    jgroup手册

    Reliable group communication with JGroups 3.x Preface This is the JGroups manual. It provides information about: 1. Installation and configuration 2. Using JGroups (the API) 3. Configuration of the ...

    jgroup代码

    根据提供的文档内容,本文将对“jgroup代码”的安装步骤及如何编写一个简单的应用进行详细的阐述与解析。 ### 一、jgroup代码简介 JGroups是一个高性能、可扩展且易于使用的分布式通信库,用于实现集群中的节点...

    jgroup master

    - **使用多重通道(Using multiple channels)**:支持在一个应用程序中使用多个通道,以实现更复杂的网络拓扑结构。 - **自定义协议栈(Custom protocol stacks)**:允许开发人员定制自己的协议栈来满足特定需求。 - *...

    java SWT编写JGroup局域网聊天程序

    ### Java SWT 编写 JGroup 局域网聊天程序知识点详解 #### 一、概述 在本篇文章中,我们将深入探讨如何使用Java Swing Toolkits (SWT) 和 JGroups 库来开发一个局域网内的聊天应用程序。文章的标题提到了“Java ...

    《jgroup in action》

    根据提供的信息,《jgroup in action》是一本关于JGroups工具包的书籍,它详细介绍了如何使用JGroups进行可靠的多播通信。JGroups是强大的UUP(User-level UDP)开源组件,已被JBoss采用,用于底层通信。下面我们将...

    EHCACHE集群配置-JGroup篇

    EHCAHCE基于JGROUP的集群配置方案,内含相关配置文件,及配置说明

    jgroup笔记.doc

    1. `JChannel(String properties)`: 使用指定的配置文件(如 "udp.xml")创建一个通道实例。 2. `setReceiver(Receiver r)`: 设置接收器对象,用于处理接收到的消息。 3. `connect(String cluster_name)`: 加入名为 ...

    jboss jdbc json jgroup.jar

    在IT行业中,JBoss、JDBC、JSON和JGroup是四个关键的概念,它们在不同的领域发挥着重要作用。这里,我们将深入探讨这些技术及其在实际应用中的相关知识点。 首先,JBoss是一个开源的应用服务器,它是Java EE(企业...

    jgroup-3.0.1

    《JGroup-3.0.1:构建高效集群通信的核心技术》 JGroup是一个开源的Java框架,专门用于构建高可用、高性能的集群系统。它提供了健壮的组通信服务,包括成员资格管理、消息传递、故障检测以及一致性算法等。在版本...

    jgroup配置[收集].pdf

    如果使用UDP和PING作为底层协议,JGroup将通过IP多播发现集群成员并发送消息。但若IP多播在子网间被禁用,可通过设置`ip_mcast`属性为`false`,让UDP使用多个单播消息代替多播消息,同时需要配置PING的`gossip_*`...

    GroupData:使用JGroup实现分布式数据结构(堆栈和集合)

    使用JGroup实现分布式数据结构(堆栈和集合) 介绍 [什么是JGroups?]( ) [JGroup入门]( ) JGroups是完全用Java编写的可靠的组通信工具包。 它基于IP多播(也支持TCP),但是有一些特殊功能,例如可靠性和组...

    jgroup配置[归类].pdf

    在软件开发领域,JGroup是一个关键的组件,用于构建可靠的消息传递和组通信系统。JGroup的核心在于其协议栈,它由一系列的协议层组成,这些协议层共同负责消息的发送、接收、可靠传输以及组成员发现。本文将详细解析...

    JGROUPS集群框架源码分析之消息发送、处理、接收

    - **路由选择**:JGROUPS使用组协议栈来决定消息的路由。组协议栈是由多个协议层组成的,如UDP、TCP、FRAG等,每个协议层都有特定的职责,如网络传输、消息分片或重传。 - **协议处理**:消息通过协议栈时,每个...

    Jgroups-all.jar

    JGroup是当前被广泛使用的可靠组间通信的工具之一。例如OSCache以及JBossTreeCache都是用的是JGroup。 JGroup功能十分强大,通过配置各种参数就可以充分利用它所提供的各项功能。JGroup最大的特点就是支持协议栈的...

    基于JGROUPS的ehcache的分布式缓存复制

    本文将深入探讨基于JGROUPS的Ehcache实现的分布式缓存复制,这是一种在Java应用中广泛使用的缓存解决方案。 首先,Ehcache是一个开源的、高性能的Java缓存库,提供本地缓存以及分布式缓存功能。它支持多种缓存策略...

    encache+jgroups集群缓存共享

    在EnCache与JGroups的结合使用中,JGroups主要负责在集群中的各个节点之间建立通信通道,并维护节点间的成员关系。当一个节点加入或离开集群时,JGroups会自动传播这些变化,确保所有节点对集群状态的一致认识。...

    jGroup-OOPProjekt

    jGroup-OOPProjekt rocc 包含整个项目。 在 rocc 中还包含两个 bat 文件。 “reBuild”文件重建项目,另一个“run”运行项目。 RuinsOfCorrosaCity.zip 是可玩游戏及其脚本的包。 文档包含 RAD 和 SDD 会议包含...

Global site tag (gtag.js) - Google Analytics