niubi-job是什么
niubi-job是LZ耗时三个星期,费尽心血打造的一个具备高可靠性以及水平扩展能力的分布式任务调度框架,采用quartz作为底层的任务调度管理器,zookeeper做集群的管理与协调。
niubi-job可以做什么
niubi-job与Hadoop的MR框架,包括storm等的目标不同,niubi-job主要针对的是需要定时执行,且同一时间只能有一个节点运行此任务的场景。例如,有一个定时任务是定时去请求某个API获取交易的状态,然后将状态更新到数据库里。类似于这样的job,就非常适合niubi-job去做。
特别强调,niubi-job强制保证同一个任务在同一时间只可能被一个节点运行,这是niubi-job最大的特征,也是用好niubi-job必须要知道的。
特性
1、动态发布任务,通过web控制台上传jar包即可发布任务,发布新任务时,正在运行的任务不受任何影响。
2、可靠性较高的灾备机制,采用成熟的分布式系统解决方案zookeeper处理节点间的协作。
3、智能负载均衡,拥有理论上无限的伸缩能力(仅master-slave模式支持)
4、有较为详细的任务执行日志。
5、支持spring的运行环境。
6、支持多种模式,例如单机模式、伪分布式以及真正的分布式。
7、简单易用,降低门槛。
8、未完待续...
安装使用
好了,对于框架本身的介绍就暂时到这里,本文主要的任务是教会大家如何使用niubi-job。后续,LZ还会出一系列文章去讲解niubi-job的框架设计,原理以及一些其它的内容,比如类加载机制等。
安装要求
使用niubi-job,你需要具备以下环境和软件。
1、JDK1.8+(正确配置JAVA_HOME,且保证java -version可以正确运行)
2、关系型数据库(MYSQL最佳,因为niubi-job默认的数据库配置是mysql,请手动建立一个叫做job的数据库)
3、zookeeper-3.4.7。
4、tomcat7+。
除了以上之外,你当然还需要下载niubi-job相关的软件。niubi-job主要分为两部分,一部分是web控制台,以war包方式提供,可以在tomcat等web容器当中运行。另外一部分就是节点的运行程序,以zip和tar.gz方式提供,请根据自己的操作系统自由选择。
下载的地址可以到LZ的个人博客里下载最新版本,地址分别如下。
http://www.zuoxiaolong.com/download/niubi-job-cluster.zip
http://www.zuoxiaolong.com/download/niubi-job-cluster.tar.gz
http://www.zuoxiaolong.com/download/niubi-job-console.war
当然了,也可以从LZ的github上面clone下来源码自己编译,不过这需要你的本机有maven和git,然后一一执行以下命令即可。
git clone git@github.com:xiaolongzuo/niubi-job.git cd niubi-job mvn clean package
执行完以上命令后,在你当前文件夹里,就会出现上面的三个文件。
安装步骤
好了,有了以上环境,基本上已经安装了一半了。不要害怕,接下来很简单,跟着LZ一起往下进行吧。
启动三个zookeeper
如果你已经下载好了zookeeper-3.4.7的安装包,那么请启动三个zookeeper。当然,一个也是完全可以的。具体的安装步骤这里就不赘述了,搜索“zookeeper伪分布式安装”,网络上有大量的教程。
LZ这里只给大家一个方便下载zookeeper的链接,大家可以点击下载zookeeper-3.4.7,地址为:http://www.zuoxiaolong.com/download/zookeeper-3.4.7.tar.gz。
启动数据库
以mysql为例,mysql安装的步骤不再赘述,请自行参考网络上的资料,一把一把的。只需要切记,建立一个叫job的database就行了。niubi-job的orm框架采用hibernate,可以逆向生成数据库的表,因此不需要数据库的初始化脚本,只需要建立好数据库即可。
如果你没有mysql数据库,也没有关系,在接下来自行配置一下即可。只要不是特别奇葩的关系型数据库,相信hibernate都是支持的。
启动niubi-job-console
niubi-job-console是niubi-job项目的web控制台,是给开发人员操作的Web UI界面,用它可以上传jar包,发布和停止任务,查看节点和任务运行情况等。
首先下载tomcat7或8,然后解压,将niubi-job-console.war包放到tomcat容器的webapps目录下,接下来启动tomcat。
接下来,见证奇迹的时刻就到了,进入http://localhost:8080/niubi-job-console,你会看到如下界面。
当然了,你也可能会启动报错,不过这没关系,99%的可能是你数据库或者zookeeper的配置不对,请进入到下面的文件夹
${tomcat_home}/webapps/niubi-job-console/WEB-INF/classes
你会看到一个叫config.properties的文件,或许你需要修改一下这个文件。它的内容如下。
这些参数的解释如下,你可以根据自己的需要修改。
connectString:zookeeper地址
driverClass:数据库驱动(具体的配置请根据自己的数据库自行选择,此外,请自行引入相应的数据库驱动包,放在lib文件夹下)
jdbcUrl:数据库连接地址(ps:LZ这里默认的数据库叫job,当然了,你如果不喜欢的话,那就改了它!)
user & password:这两项很明显是用户名和密码了。
hibernate.dialect:数据库方言(ps:如果你使用了其它数据库,记得把方言改成你的数据库方言。)
hibernate.*:接下来的参数就不一一介绍了,这属于hibernate的知识,有兴趣的可以自行研究下。(ps:还有很多参数在这里并没有出现,但也同样支持)
启动niubi-job-cluster
启动好console以后,重点就来了。niubi-job-cluster是整个niubi-job项目的核心,也是最耗费LZ心血的地方。它是niubi-job中节点的应用程序,每一个启动的节点都是集群中的一员,它们相互协作,来完成任务的调度。
niubi-job-cluster的启动方式比较简单,下载完以后,解压它,你可以看到如下目录。
如果你是linux或者mac操作系统,就进入bin目录执行以下命令
sh startup.sh
如果你是windows系列操作系统,则双击startup.bat。
如果启动成功,则如下。(LZ的操作系统是mac,仅供参考)
Tips[如未遇到,请忽略]:
由于操作系统编码的格式问题,可能会出现这个错误:bad interpreter: No such file or directory 这个时候只需要执行以下命令即可解决。 vi startup.sh :set ff=unix //这是在vi模式下输入的 :wq //保存退出。 不要忘了将以上操作对shutdown.sh和bootstrap.sh同样都做一遍。
好了,咱们看下日志文件里面是什么,如下。
到这里,你已经启动了一个节点,niubi-job-cluster默认的模式为master-slave模式。因此进入控制台的master-slave页面,并且进入node manager页面,就可以看到我们的节点了。
接下来,我们来尝试在一个机器上启动多个niubi-job-cluster(伪分布式),首先将niubi-job-cluster复制出三份。然后进入每个niubi-job-cluster的conf文件夹。可以看到有一个job.properties文件,如下。
这些参数的含义如下,可以按照自己的需要配置。
zookeeper.addresses:zookeeper集群地址
jar.repertory.url:console的地址
node.mode:枚举类型(standby和masterSlave二选一)
shutdown.port:关闭需要监听的端口(伪分布式主要就是把这个端口改成不一样的,比如三个节点分别是9101,9102,9103)
给每个niubi-job-cluster改完端口以后,就可以依次启动另外两个节点了。这个时候,你会看到node manager里面出现了三个节点。如下。
好了,到这里基本上一个伪分布式的niubi-job集群已经部署好了。
上传jar包和发布任务
所谓的jar包,其实就是你的任务,具体的开发模板请参考LZ的github,里面有两个示例,一个是普通的java项目,一个是基于spring的项目。地址如下。
https://github.com/xiaolongzuo/niubi-job/tree/master/niubi-job-samples
LZ已经给上面两个示例项目打好了jar包(切记,打包时要把自己的依赖也打进去,同时将niubi-job-scheduler排除在外,在LZ的这两个示例项目中,打包时只需要激活release的profile即可),可以从LZ的个人网站上下载,地址如下。
http://www.zuoxiaolong.com/download/niubi-job-sample-common.jar
http://www.zuoxiaolong.com/download/niubi-job-sample-spring.jar
下载完以后,进入控制台的upload jar界面,就可以上传jar包了。这里需要填写一下需要扫描的packages,这是必须要填的。如下。
如此将两个jar都上传后,在job runtime manager页面可以看到四个任务。如下。
如图,按照图中所示即可进入任务发布界面,输入cron表达式后,选择execute,任务将会被启动。咱们将四个任务都启动,可以看到如下图。
接下来,我们进入node manager界面,可以看到任务是平均分配的。如下图。
其中master上面运行了两个任务,而两个子节点分别被分配了一个任务。这个时候,你可以尝试关闭其中一个节点,你会发现任务将会被平均分配到剩下的节点当中。比如你这时候把master关掉,那么剩下的两个slave将有一个成为master,并且剩下的两个节点会每个有两个任务。
结束语
到现在为止,你的niubi-job已经搭建起来了。当然了,这只是单机版的体验方式,真正在生产中使用的时候,需要使用真正的分布式模式,而且还需要做一些其它方面的工作,以期让niubi-job更好的工作。比如,可以把console存储jar包的地方,和节点下载jar后存放的位置指向同一个硬盘,这样节点将不再需要下载jar包。
由于本次发布的是niubi-job的第一版,因此还有很多不足之处,包括web控制台的UI也非常粗糙。LZ欢迎大家去github上面给niubi-job提issue,或者提交PR。当然,你也可以和LZ在网上交流(联系方式在左侧),或者在下方留言。