4

jboss规则引擎KIE Drools 6.3.0-集群篇

 3 years ago
source link: https://blog.csdn.net/lifetragedy/article/details/74280089
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

DROOLS集群的原理

  1. Drools集群是架设在jboss集群之上的
  2. Drools集群其实是WorkBench(WB)间的集群
  3. KIE SERVER是JSON服务,它是架设在WB上的,一个WB可以挂1个、多个KIE SERVER
  4. WB除了HTTP间的集群还需要做WB内Repository间的集群,WB的REPO间的集群使用的是GIT协议,它们可以使用ZooKeeper(ZK)来进行集群,俗称“VFS-REPO集群”
  5. 使用APACHE HELIX可以对ZK进行集群划分

DROOLS在生产上的大规模铺设与应用

DROOLS集群后的使用规范

对于Legacy System来说,它可以使用DROOLS集群内任何一台KIE SERVER来进行规则访问。

  • 业务开发人员
  • 普通办公人员
  • 业务执行人员
  • IT管理员

这些。。。对于DROOLS的集群来说他们都被称为内部用户,内部用户只可以通过KIE WB的主控域对Drools内的任何资源进行操作,WB的主控域即为DROOLS集群所属的JBOSS的那个主控,它的地址永远只能是一个。

建立JBOSS集群

按照《JBOSSEAP实战教程2》搭建一个JBOSS的FULL集群,我们采取一主一从,MASTER又同时是CONTROLLER,集群搭完后参数列表如下所示,所以我们的KIE WB的主控端即为8080,一切对于DROOLS内的Assets的更改只可以通过http://192.168.0.101:8080/kie-wb来做更改,而KIE SERVER的服务可以是http://192.168.0.101:8080也可以是http://192.168.0.101:8081 ,并确保每个节点至少4096m的JVM内存可用。

master1

192.168.0.101

master

slave1

192.168.0.101

slave

搭建ZOOKEEPER集群

在本例中我们使用的是“zookeeper-3.4.6”,把它解压至/opt/zk目录后做一下简单修改即可以,本教程为了演习,在ZK本身间没有作集群,只使用ZK单节点功能即够用了。下面来看ZK的配置,zoo1.cfg文件的内容:

使用 zkServer.sh start zoo1.cfg即可启动

使用Apache Helix来对Zookeeper进行cluster的创建与管理

在本例中我们使用的是“helix-0.6.5版”

开始使用helix,在ZK启动的情况下

$ cd $HELIX_HOME/bin

$ ./helix-admin.sh --zkSvr localhost:2181 --addCluster kie-cluster

我们在ZK里创建了一个叫kie-cluster的东东,记下这个名字
$ ./helix-admin.sh --zkSvr localhost:2181 --addNode kie-cluster nodeOne:12345

$ ./helix-admin.sh --zkSvr localhost:2181 --addNode kie-cluster nodeTwo:12346

接着,我们在这个kie-cluster下创建了2个节点,其中:nodeOne:12345不是端口号,而是一个“唯一标示”,节点间的标示不要重复即可,它的命名一定是 “节点名:数字”这样的形式,这是ZK的一种表示方式。


如果你的集群需要有3个节点,那你就需要addNode三个。

$ ./helix-admin.sh --zkSvr localhost:2181 --addResource kie-cluster vfs-repo 1 LeaderStandby AUTO_REBALANCE

我们为kie-cluster分配一个Resource,这个Resource的标识我们叫“vfs-repo”,这个名字你也可以随便,无所谓的,只要到时记下来就 可以了。


LeaderStandby是ZK的机制,AUTO_REBALANCE是告诉ZK,需要把刚才的nodeOne, nodeTwo重新分配给vfs-repo作用的。
$ ./helix-admin.sh --zkSvr localhost:2181 --rebalance kie-cluster vfs-repo 2

执行直正的rebalance,vfs-repo后面的数字2代表要rebalance两个节点,如果你有3个节点,那你必须写成: kie-cluster vfs-repo 3
$  ./run-helix-controller.sh --zkSvr localhost:2181 --cluster kie-cluster 2>&1 > controller.log &

一切就绪后,我们以后台进程的模式启动helix,并把日志输出到当前目录的controller.log文件中。

开始真正安装drools的集群-预配置-DataSource

先不要安装KIE-WB和KIE-SERVER,把JBOSS集群以full模式启动起来。先启master再启slave。


因为我们用的是full模式,因此不要忘了在domain.xml的profile name=“full”段配上datasource和相应的jndi

开始真正安装drools的集群-预配置-master1 System Properties

启动后,我们要为我们的KIE WB设置System Properties与JVM参数,修改host.xml文件

Master1上的System Properties,注意我红色加粗的部分是和刚才在helix中配置时完全需要匹配的,其中在helix中设置的nodeOne:12345在此需要标示成nodeOne_12345,因为在jboss集群中会把:变成_。这是kie wb中去做的转换,没有为什么 。

<system-properties>
                <property name="jboss.node.name" value="master1" boot-time="false"/>
                <property name="org.uberfire.nio.git.dir" value="/opt/gitrepo/master1" boot-time="false"/>
                <property name="org.uberfire.metadata.index.dir" value="/opt/gitrepo/master1" boot-time="false"/>
                <property name="org.uberfire.cluster.id" value="kie-cluster" boot-time="false"/>
                <property name="org.uberfire.cluster.zk" value="localhost:2181" boot-time="false"/>
                <property name="org.uberfire.cluster.local.id" value="nodeOne_12345" boot-time="false"/>
                <property name="org.uberfire.cluster.vfs.lock" value="vfs-repo" boot-time="false"/>
                <property name="org.uberfire.nio.git.daemon.port" value="9418" boot-time="false"/>
                <property name="org.uberfire.nio.git.ssh.host" value="0.0.0.0" boot-time="false"/>
                <property name="org.uberfire.nio.git.ssh.port" value="18001" boot-time="false"/>
</system-properties>

开始真正安装drools的集群-预配置-slave1 System Properties

<system-properties>
                <property name="jboss.node.name" value="slave1" boot-time="false"/>
                <property name="org.uberfire.nio.git.dir" value="/opt/gitrepo/slave1" boot-time="false"/>
                <property name="org.uberfire.metadata.index.dir" value="/opt/gitrepo/slave1" boot-time="false"/>
                <property name="org.uberfire.cluster.id" value="kie-cluster" boot-time="false"/>
                <property name="org.uberfire.cluster.zk" value="localhost:2181" boot-time="false"/>
                <property name="org.uberfire.cluster.local.id" value="nodeTwo_12346" boot-time="false"/>
                <property name="org.uberfire.cluster.vfs.lock" value="vfs-repo" boot-time="false"/>
                <property name="org.uberfire.nio.git.daemon.port" value="9419" boot-time="false"/>
                <property name="org.uberfire.nio.git.ssh.port" value="18002" boot-time="false"/>
                <property name="org.uberfire.nio.git.ssh.host" value="0.0.0.0" boot-time="false"/>
</system-properties>

这些System Properties可都要配置在master和slave上的host.xml文件中的如下段哦!

开始真正安装drools的集群-预配置-master1 JVM Properties

<property name="org.uberfire.nio.git.ssh.port" value="18001" boot-time="false"/>
</system-properties>

<jvm name="master1" debug-enabled="false">
                <heap size="4096m" max-size="4096m"/>
                <permgen size="256m" max-size="512m"/>
                <jvm-options>
                    <option value="-XX:-UseGCOverheadLimit"/>
                </jvm-options>
</jvm>

开始真正安装drools的集群-预配置-slave1 JVM Properties

<property name="org.uberfire.nio.git.ssh.host" value="0.0.0.0" boot-time="false"/>
</system-properties>

<jvm name="slave1" debug-enabled="false">
                <heap size="4096m" max-size="4096m"/>
                <permgen size="256m" max-size="512m"/>
                <jvm-options>
                    <option value="-XX:-UseGCOverheadLimit"/>
                </jvm-options>
</jvm>

开始真正安装drools的集群-修改master与slave的JBOSS启动文件

$MASTER1_HOME/bin/domain.conf文件

export JAVA_OPTS="$JAVA_OPTS -Xms4g -Xmx4g  -XX:-UseGCOverheadLimit -XX:MaxPermSize=512m -Dorg.jbpm.server.ext.disabled=true -Dorg.kie.demo=false -Djava.awt.headless=true -Dorg.kie.server.persistence.ds=java:/comp/env/jdbc/jbpm -Dorg.kie.server.controller=http://192.168.0.101:8080/kie-wb/rest/controller -Dorg.kie.server.controller.user=kieserver -Dorg.kie.server.controller.pwd=password_1 -Dorg.kie.server.id=kie-server-8080  -Dorg.kie.server.location=http://192.168.0.101:8080/kie-server/services/rest/server"



$SLAVE1_HOME/bin/domain.conf文件
export JAVA_OPTS="$JAVA_OPTS -d64 -server -Xms4g -Xmx4g  -XX:MaxPermSize=512m  -XX:-UseGCOverheadLimit -Dorg.jbpm.server.ext.disabled=true -Dorg.kie.demo=false -Djava.awt.headless=true -Dorg.kie.server.persistence.ds=java:/comp/env/jdbc/jbpm -Dorg.kie.server.controller=http://192.168.0.101:8080/kie-wb/rest/controller -Dorg.kie.server.controller.user=kieserver -Dorg.kie.server.controller.pwd=password_1  -Dorg.kie.server.id=kie-server-8081  -Dorg.kie.server.location=http://192.168.0.101:8081/kie-server/services/rest/server"

上述2个启动文件会被master和slave在使用domain.sh启动时所调用。


它们干了这么几件事:


告诉master,在它上面安装的kie-server的controller为192.168.0.101:8080,kie-server1的名字为kie-server-8080它安装于master内,并且kie-sever向kie-wb发送心跳同步时需要知道kie-wb的username/password(所有kie-server只能有一个controller)


告诉slave,在它上面安装的kie-sever的controller为192.168.0.101:8080,kie-server2的名字为kie-server-8081它安装于slave内,并且kie-sever向kie-wb发送心跳同步时需要知道kie-wb的username/password(所有kie-server只能有一个controller)


kie-wb与kie-server共用一个datasource,datasource的jndi名为:java:/comp/env/jdbc/jbpm

布署kie-wb与kie-server

把kie-wb.war和kie-server.war以目录形式(exploded war)上传到 $maser_home/domain/data目录下。

在master所在的domain.xml文件中増加如下语句:

</socket-binding-groups>

    <deployments>
        <deployment name="kie-wb.war" runtime-name="kie-wb.war">
            <fs-exploded path="/opt/jboss_master1/domain/data/kie-wb.war"/>
        </deployment>
        <deployment name="kie-server.war" runtime-name="kie-server.war">
            <fs-exploded path="/opt/jboss_master1/domain/data/kie-server.war"/>
        </deployment>
    </deployments>


分别以domain.sh启动master1与slave1后打开http://192.168.0.101:9990 这个图形化管理界面

使用【Assign】按钮,把kie-wb与kie-server Assign给到kie-server-group,当界面中的“布署进度“弹出窗体消失后你会看到这两个”包”的Assignments列中的数值会从原来的“0”变为“1”,它代表kie-wb与kie-server已经在”controller”端布署成功,并且已经自动同步到了controller下挂的所有slave中了。

构建kie-server集群,为系统提供规则服务

此时,我们的kie-wb已经完成了集群布署,如果你使用:
http://192.168.0.101:8080/kie-wb
http://192.168.0.101:8081/kie-wb
是可以分别访问我们的规则引擎WEB开发工具的。


而http://192.168.0.101:8080/kie-wb 为整个“规则群”的主控端,一切资源在主控端改变,相关的slave会自动同步主控端。


而一切在slave上的改变,是不会同步到主控端和其它slave身上的,这也是jboss controller“集中统一管理”的一个特点,但这并不意味着KIE SERVER对外访问也是这样。


对外,无论是任何一台KIE SERVER都会为客户提供相同的且版本统一的“规则API服务”。

集群成功启动后在主控端我们已经可以看到2台kie server了。

  • 一台启动在8080端口
  • 另一台启动在8081端口。

我们分别在两台KIE-SERVER上布署一个相同的“规则服务”

名字完全一样 


然后我们使用《 JBOSSEAP实战教程2 》-“使用NGINX来对JBOSS集群作分发”中的配置把NG以UPSTREAM的方式指向:
http://192.168.0.101:8080
http://192.168.0.101:8081


随后,我们就可以通过如:http://192.168.0.101/kie-server/services/rest/server/ 来访问我们的“规则群”了

我们现在把master kill掉,再来通过http://192.168.0.101/kie-server/services/rest/server/containers/instances/HelloDrools_v1 post一个规则请求,看,请求自动被分发到了slave上,而对于“访问端”一切都是“透明的”。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK