jboss集群的Barrier mbean是个好东西

sulong 于 2008-12-09 说两句 »

在jboss集群时,有一种服务被称为高可用单例服务,意思是指在集群中同时肯定有且只会有一个节点提供这个服务。换句话说这种服务只会在一个节点上启动,并且当这个节点不可用时,集群中会有另一个节点代替它,它是一个具有故障恢复能力的单例服务。要实现这种服务,最简单的方法就是把部署单元,如war, ear, jar,等放到jboss/server/all/deploy-hasingleton/ 目录下。但是放在这个目录下的应用是不能热部署,也不具有farm deploy功能的。还好jboss里有一个很特殊的mbean叫 jboss.ha:service=HASingletonDeployer,type=Barrier,利用它可以很容易的实现高可用单例服务。这个bean很特殊,只有在集群的master节点上它才会被启动,而一旦master节点不再是master,它又会停止。所以一个普通的部署单元,只要依赖上了barrier,就会具有高可用单例服务的能力。下面举一个例子。

现在要实现一个高可用的消息驱动bean,监听远程机器上的消息topic/a。如果只在集群中的一个节点上部署这个MDB,一旦这个节点不可用,消息处理就停止了。为了提高可用性,可以在每个节点上部署这个MDB,但这时同一个消息会被每个MDB收到和处理,这不是我们想要的,因为同一个消息应该只被一个 MDB处理。这个时候只要让这个MDB对barrier依赖,再把它部署在所有节点上,那么就只有主节点上的MDB会运行,并且当主节点完蛋时,其他节点变成主节点时,那个节点上的MDB会自动运行。这样我们就实现了高可用单例消息驱动bean服务。

要让mbean对barrier依赖,只要在它的部署文件里填上一行,例如:

    <server>
        <mbean name="xx" code="xx.xx.xxx">
            <depends>jboss.ha:service=HASingletonDeployer,type=Barrier</depends>
        </mbean>
    </server>

对于war,jar,ear,可以在jboss.xml里添加,具体见jboss文档。对于ejb3,加上下面的annotation就好了:

@org.jboss.annotation.ejb.Depends("jboss.ha:service=HASingletonDeployer,type=Barrier")
  • Share/Bookmark
Advertisement

7 comments

  1. youlianjie says:

    我想让整个ear包部署成单例。
    把jboss.xml放到ear的META-INF下

    jboss.ha:service=HASingletonDeployer,type=Barrier

    jboss已经配成集群了,但是启动两个jboss发现两边都部署了。

    WHY???????????
    望指教!!!!

  2. youlianjie says:

    我想让整个ear包部署成单例。
    把jboss.xml放到ear的META-INF下
    <jboss>
    <container-configurations>
    </container-configuration>
    <depends>jboss.ha:service=HASingletonDeployer,type=Barrier</depends>
    </container-configuration>
    </container-configurations>
    </jboss>

    jboss已经配成集群了,但是启动两个jboss发现两边都部署了。

    WHY???????????
    望指教!!!!

  3. sulong says:

    如果我没有记错的话,Barrier阻止依赖他的mbean进入 start状态,但是依赖他的mbean还是能created的。

  4. sulong says:

    首先,确认你的jboss是在一个集群里了,而不是各自在自己的集群里。其次,看jboss文档上的话:

    On the other hand, the barrier-dependent service will be instantiated/created (i.e., any create() method invoked) on all nodes, but only started on the master node. This is different with the deploy-hasingleton approach that will only deploy (instantiate/create/start) the contents of the deploy-hasingleton directory on one of the nodes.

    ear会被部署,只是没有启动而已。

  5. youlianjie says:

    谢谢你的回复!
    我这的ear是被启动了,因为ear包里有个自启动的war工程,日志显示两边都启动了。
    是不是我的jboss.xml写的有问题?

  6. sulong says:

    这个jboss.xml是个令人头痛的东西,我没有在jboss的网站上找到详细的使用说明,或许你能找到。我之前只让ejb对barrier bean依赖过,没有试过让整个container对其依赖。可能你写的格式不对,再查查看吧。

说两句