在许多领域,流式计算CEP和它的高可用性方案发挥着重要的作用。我们往往需要HA方案保证窗口数据和执行计划不丢失。同时,有时也需要深入进程中的某个线程(任务)监测它的运行状态。如果心跳机制只建立在Worker(JVM进程)级别,往往会存在Worker还在,Task线程停掉了的情况。
本文将介绍SODBASE CEP基本的HA方法和概念。举几个常见应用场景:
(1)实时交易中,根据前面时间窗口的数据进行交易策略判断,服务器宕机了
(2)计算5分钟股价K线。数据还没累积到5分钟,服务器宕机了
(3)数据批量操作,一个批次还没有到累积满,服务器宕机了
(4)监测每个任务的查询执行状态、输入状态、输出状态,满足生产环境运维需求
1. 示例操作步骤
下面是一个批量操作中Hot-Hot HA的示例。批量窗口操作过程中,这些状况如客户端不稳定、输入数据的fail重传机制、网络通信中的各种故障等等,都给保证高可用性带来困难。
目标:保证所有数据包括中间状态、缓存数据全部入库,即使集群中存在服务器宕机的情况。
前提:存储入库接口需有健壮,且能够判断将要插入的数据是否在库中已经存在。因为用户写的客户端可能有缓存重发,集群节点间也可能出现连不通的情况,不是单纯内存同步可以解决的。所以需要在存储级别的同步,即对已经存在的数据不进行重复入库。除非重复入库不影响应用使用。
(1)下载一个CEP服务器安装介质SODBASE-CEP-SERVER,解压。这里用的是Tomcat容器,支持其它J2EE容器。
在一台机器上模拟两个服务器。解压后的目录复制一份,这里取名为SODBASE-TOMCAT-7.0.56-2,如下图所示
将SODBASE-TOMCAT-7.0.56-2的conf目录下的server.xml删掉,将server-2.xml重命名为server.xml
两个服务器分别运行bin目录下的startup.bat,就启动CEP Server了。
注:如果在控制台提示 WARNING: Tables are not initialized in the database, please install the database.则在Web浏览器中输入
http://localhost:16111/sodbase-cep-server-webservice-1.0.1/install 回车,初始化服务器1状态数据库
http://localhost:16121/sodbase-cep-server-webservice-1.0.1/install 回车,初始化服务器2状态数据库。
默认每个服务器实例使用自己状态数据库。如果两个Server实例在db.properties配置指向同一数据库,则采用任一URL请求初始化一遍就可以了。
(2)下载本文的模型示例CEP HA的模型示例
query1hhnode1.soddata2 //部署到服务器1上
query1hhnode2.soddata2//部署到服务器2上
query1hhclient.soddata2//客户端,模拟了股票数据的生成
query1hhnode1和query1hhnode2的CEP模型功能一样,都是模拟分批窗口操作,每隔10秒,将积攒的股票数据批量操作。这里没有连存储,用屏幕打印来演示。
(3)下载CEP Server Admin程序SODBASE-CEP-Server-Admin,解压
运行cepserver-admin.exe
登陆到服务器1。localhost端口16111,默认用户名admin密码cep,安装query1hhnode1.soddata2 ,启动hhnode1模型。
点击右上角注销按钮后,同样的方式登陆到服务器2。localhost端口16121,安装query1hhnode2.soddata2 ,启动hhnode2模型。
(4)运行客户端
以下两种方法任选一个
方法1:下载Java-API-Example HA示例,解压导入为Exlipse工程,运行com.example.ha.HotHotExample.java。
方法2:如果没有Eclipse环境。用CEP Server Admin登陆到服务器1。localhost端口16111,默认用户名cep密码cep,安装query1hhclient.soddata2 ,启动query1hhclient模型。
(5)结果输出
可以看到服务器2屏幕打印输出,一条输出代表一个批次处理完成。
(6)模拟宕机
关掉服务器2,可以用server admin将cep模型停掉,也可以直接关掉Tomcat
可以发现批次处理已经转移到了服务器1。如下图显示,以45开头的batch是服务器2处理的,从50开始转到了服务器2。而且不会丢失中间结果。
(7)检查模型运行状态
在浏览器(极速模式)地址栏输入
http://localhost:16111/sodbase-cep-server-webservice-1.0.1/servermonitor?username=admin&password=cep&modelspacename=admin&modelname=hhnode1&version=1.0
查看hhnode1的详细运行状态。如果有故障可以检查出来,如下图所示。
总体信息没有固定格式,只用于运维检查使用。查询单条SODSQL语句的执行状态。例如,在浏览器(极速模式)地址栏输入
http://localhost:16111/sodbase-cep-server-webservice-1.0.1/querymonitor?username=admin&password=cep&modelspacename=admin&modelname=hhnode1&version=1.0&queryname=admin.hhnode
,如果运行正常应该处于"waitingevent"或"computing"状态。要实现Hot-Standby或自动化监测,建议使用单条SODSQL监测的接口。
2.工作原理
2.1. Hot-Standby
2.1.1特点
Hot-Standby即主备方式,这种类型的HA有以下几个特点:
(1)有Heartbeat监测,可以做细粒度监测。
可以节点主动汇报,也可以由管理节点轮询。通常是定时监测。
(2)对于特定的任务,在主备机器中的一台上运行,并能进行任务迁移。
这里的任务是指已经并行化后的任务,例如计算车流量的任务,如果并行化成两个任务,任务1接收奇数尾号的数据,任务2接收偶数尾号的数据。那么任务1总得有一台服务器在运行它,要么在主服务器上运行,要么在备服务器上运行。任务2也一样。
"主"和"备"的概念是相对的,"备"指的是任务可以迁移到的服务器。可以是一主一备,也可以是一主多备。
(3) 通常没有内存同步和执行计划、中间结果和缓存同步的机制。
2.1.2HA的粒度
如果粒度在Worker进程级别,那么只需要监听进程的状态。
如果需要Task线程级别的细粒度HA,那么我们就需要监听线程的运行状态。
2.2 Hot-Hot (窗口聚合的HA问题)
2.2.1 特点
Hot-Hot双热方式的HA的特点是
(1)在集群中同步内存和执行计划状态,可以保证中间结果或缓存不丢失。
(2)节点输出同步。
2.2.1客户端示例代码
查看客户端数据源,也是由一个CEP模型实现的。里面有五条EPL语句。其中hhinput是股票数据源,hhtimerinput、hhtimer2是两个定时器,用于生成精确的滑动窗口开始结束时间。hhdispatcher1和hhdispatcher2则是负责通过发送数据到两台CEP Server上去。
SODBASE CEP用于轻松、高效实施数据监测、监控、实时交易类、日志分析类项目。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE Studio。遇到任何问题可发站内消息。