在既有系统中打通Apache Ignite、MySQL和Node.js

为什么80%的码农都做不了架构师?>>>   hot3.png

介绍

在本系列的第一篇文章中,安装了Node.js、Ignite的Node.js瘦客户端包,并且测试了一个示例应用。在本文中,可以看一下Ignite在处理其它数据源(比如关系数据库)的已有数据时,一个很有用的场景。

通常在行业领域,很多系统还有着巨大的商业价值,它们必须得到维护甚至加强,未被开发的领域已经很少见了。而Ignite可以用于组织中的遗留系统或传统系统,以增加它们的价值并提供新的可能性,例如具有水平可扩展性的集群计算、显著的内存级性能优势以及使用机器和深度学习的新应用等等。

具体可以看一个示例,其中在关系数据库中已经有了一些数据,然后了解Ignite如何将该数据缓存到内存中,对该内存数据执行SQL操作并将更改回写关系数据库,这里将使用一些Node.js代码来访问Ignite并执行一些SQL查询。

已有的数据库系统

本文中使用了MySQL,并且其中已经准备好了一个名为world的数据库,里面已经加载了部分数据。

这个world数据库的结构为有三张关系表,具体如下:

  • country:代表世界上的国家(239行数据);
  • city:代表国家的部分城市信息(4079行数据);
  • countrylanguage:各个国家说的语言(984行数据)。

接下来,确认MySQL是否已经成功启动,并接受外部连接。

Web控制台和Web代理

为了访问MySQL数据库的模式信息,需要使用Ignite的Web控制台,在本文中为了方便,使用的是GridGain托管的服务,不过Web控制台的源代码是可以下载的,可以在本地构建然后在公司的防火墙后面运行,具体细节可以参见相关的文档。

还需要一个Web代理,它可以从Web控制台中下载,如下图所示:

图1:下载Web代理

Web代理的zip包下载完成之后,可以解压该文件,目录结构大致如下图所示:

图2:Web代理的目录结构

注意这里有个名为jdbc-drivers的目录,因为本例需要访问MySQL,所以需要下载MySQL的驱动,然后将jar文件放在该文件夹中,如下图所示:

图3:MySQL的JDBC驱动

下面从终端窗口中启动Web代理,如下:

./ignite-web-agent.sh

输出大致如下图所示:

图4:启动Web代理

从MySQL中导入模式

下面就可以导入模式信息了,在Web控制台的Configuration页面中,右上角有一个Import from Database按钮,如下图所示:

图5:从数据库导入

点击该按钮之后,输出大致如下图所示:

图6:从数据库导入

在这个界面中,需要输入MySQL服务器的JDBC URLUserPassword,大致如下图所示:

图7:从数据库导入

填完之后点击Next,这时就会看到各个数据库模式,然后把除了world模式之外的都取消掉,如下图所示:

图8:从数据库导入

选好之后,点击Next,就会看到3张表,如下图所示:

图9:从数据库导入

对于本文来说,这页面中的默认值就可以了,然后点击Next,这会跳到如下图所示的页面:

图10:从数据库导入

对于本文来说,这个页面的默认值就可以,然后点击Save

接下来在Configuration页面,可以看到列出了一个新的名为ImportedCluster配置项,如下图所示:

图11:ImportedCluster

为了满足业务需求,这个配置是可以修改的。

修改配置

如果点击上图中的ImportedCluster,就会跳转到下面的页面:

图12:基本集群配置

这个界面中有两个选项卡:BasicAdvanced

Basic选项卡中,集群的配置名(第一步),如果往下滚动,Ignite存储的名字(第二步),还有其它的若干个参数,都可以修改,在本例中,会维持这个页面中的默认值。

Advanced选项卡中,还有其它的子项,包括ClusterSQL SchemeCachesIGFSGridGain,如下图所示,如果需要,这里面的很多参数都可以微调:

图13:高级集群配置

这里选择SQL Scheme选项卡,选中City这一行,如下图所示,然后向下滚动并展开Domain model for SQL query部分:

图14:SQL Scheme

这里有一个indexes子项,值为CountryCode,如果点击它,可以进行修改,如下图所示:

图15:CountryCode索引

这里将索引名改为idx_country_code,然后点击Save按钮。接下来为Countrylanguage重复前图和上图的过程,将索引名改为idx_lang_country_code之后保存更改,做这些修改,可以确保索引名在整个Ignite模式中是唯一的。

下面选择Caches选项卡,首先选择CityCache,如下图所示,然后往下滚动并展开Queries & Indexing部分:

图16:Caches

Queries & Indexing中,有一个值为空名为SQL schema name的字段,在这里输入PUBLIC后保存变更,然后为CountryCacheCountrylanguageCache重复这个过程。

最后,返回到Configuration页面,选中ImportedCluster然后在Actions下拉框中下载这个工程,如下图所示:

图17:下载工程

这时会保存一个名为ImportedCluster-project.zip的文件,解压这个文件之后就可以在IDE中通过读取其中的pom.xml文件创建一个新的工程,如下图所示:

图18:在IDE中加载工程

pom.xml文件中,在dependencies下面,需要检查一下mysql-connector-java依赖,如果缺失,需要加一下,如下所示:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version>
</dependency>

这里的版本号匹配了之前使用的JDBC驱动的版本号。

在这个工程中,在resources文件夹下面,有一个名为secret.properties的文件,如下图所示:

图19:secret.properties

这里需要填入之前使用的JDBC URLUsernamePassword,然后保存修改。

工程重新构建之后,就可以启动一个Ignite服务端节点,如下图所示:

图20:ServerNodeCodeStartup

接下来,通过运行LoadCaches,可以把MySQL中的数据加载进Ignite存储,如下图所示:

图21:LoadCaches

在Web控制台中,转到Monitoring > Dashboard > Caches,可以看到Ignite存储已经创建并且数据也已经成功加载,如下图所示:

图22:Monitoring > Dashboard > Caches

Ignite现在已经运行起来,创建了存储并且从MySQL中加载了数据,这时就可以通过任意数量不同的接口接入Ignite,不过本文会使用Node.js瘦客户端。

Node.js瘦客户端

使用Ignite提供的Node.js版本SQL示例作为模板,可以创建若干个Node.js应用,然后执行下表中列出的SQL查询,完整的Node.js应用代码可以参见GitHub,在下面的例子中,该Node.js应用在Ignite的Node.js示例文件夹中运行:

Q1:3个人口最多的国家

SELECT name, MAX(population)
AS max_pop FROM country
GROUP BY name, population
ORDER BY max_pop
DESC LIMIT 3

Q2:US、RUS和CHN中3个人口最多的城市

SELECT country.name, city.name, MAX(city.population)
AS max_pop FROM country
JOIN city ON city.countrycode = country.code
WHERE country.code IN ('USA','RUS','CHN')
GROUP BY country.name, city.name
ORDER BY max_pop
DESC LIMIT 3

Q3:更新国家名称

UPDATE country
SET name = 'USA'
WHERE name = 'United States'

Q4:恢复国家名称

UPDATE country
SET name = 'United States'
WHERE name = 'USA'

Q1的输出如下图所示:

图23:Q1输出

Q2比Q1复杂些,包含了两个表的关联,Q2的输出大致如下图所示:

图24:Q2输出

Q3执行了一个更新操作,Q3执行完之后,Ignite的缓存会被更新,并且更新会被回写到MySQL中,保持两者之间的同步。可以使用DBeaver确认一下,首先在Country表中找到值为United States的行,如下图所示:

图25:Country表

Q3执行完之后刷新一下DBeaver,可以看到Name字段的值已经变为USA,如下图所示:

图26:Country表

Q4恢复了原来的值,通过执行这个SQL然后刷新一下DBeaver可以进行验证,如下图所示:

图27:Country表

下一步

通过修改和调整Ignite附带的示例,可以进一步测试Node.js瘦客户端。此外,Web控制台提供了许多选项,可用于从现有数据库系统微调和调整模式信息,具体可以参见Web控制台的相关文档。

总结

在本文中,了解了如何从现有的MySQL数据库系统中获取模式信息并创建一个Ignite工程。这个Ignite工程能够将数据从MySQL服务器复制到Ignite存储,然后在该数据中执行查询。从规模上看,Ignite可以利用集群计算的强大功能使操作并行化,在内存中快速执行查询并进行分析,甚至机器和深度学习,同时还保留现有系统的商业价值。虽然在本示例中使用了Node.js瘦客户端,不过Ignite还支持其它编程语言的瘦客户端。

转载于:https://my.oschina.net/liyuj/blog/3017620

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)

一、集合Collection1. 集合介绍变量&#xff1a;表示的内存中的一个空间&#xff0c;只能保存确定类型的单个数据数组&#xff1a;表示的是内存中的多个连续的空间&#xff0c;这些空间中可以存储多个同类型的数据。后期继续学习面向对象技术&#xff0c;我们在程序中开始创建对…

Vue进阶知识笔记

利用v-for循环出的多个li标签&#xff0c;点击不同的li变换颜色 方法一 <ul v-for"(item,index) in list" :key"index" class"details"><li ref"lisd" click"faillist(index)" :class"{active:ind index}&qu…

teamcity mysql 配置_CentOS 7 上 TeamCity 安装

CentOS 7 上 TeamCity 安装非入门教程, 初次接触centos/docker的朋友需要谨慎一. 安装 MySQL为了后续的需要, 这里安装了 Docker, 当然如果你已经有了 MySQL 或者其它推荐的数据库[MySQL, PostgreSQL, Oracle, MS SQL], 则可忽略1. 安装 Docker补充:# 启动dockersudo systemctl…

Python网络请求库Requests,妈妈再也不会担心我的网络请求了(二)

本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注&#xff0c;每个工作日都有文章更新。 一、概况 接着上篇说&#xff0c;如果你真以为Requests网络请求库只有Get请求和Post请求&#xff0c;那就大错特错了。它还一些其他用法&…

dbunit java_java - 错误地抛出了Java DBUnit AmbiguousTableNameException - 堆栈内存溢出

我正在尝试DBUnit(2.6.0)&#xff0c;我正在尝试导出我的完整数据库(PostgreSQL)。 但是抛出以下异常&#xff1a;线程“main”中的异常org.dbunit.database.AmbiguousTableNameException&#xff1a;FLYWAY_SCHEMA_HISTORY这是正确的行为&#xff0c;因为我有两个具有相同名称…

Docker 命令详解(run篇)

参考&#xff1a;https://www.cnblogs.com/yfalcon/p/9044246.html 命令格式&#xff1a;docker run [OPTIONS] IMAGE [COMMAND] [ARG...]Usage: Run a command in a new container中文意思为&#xff1a;通过run命令创建一个新的容器&#xff08;container&#xff09; 常用选…

java 同步 lock_关于java:同步是否像Lock.lock()一样驻留并发线程?

当我们调用lock.lock()或尝试输入synchronized块时&#xff0c;如果其他某个线程已经获得了该锁&#xff0c;则我们的线程将阻塞。 现在我的问题是&#xff0c;当我们查看lock.lock()的实现时&#xff0c;它会将获取锁委托给AQS&#xff0c;而AQS实际将当前线程驻留在该线程中(…

Idea项目中常见错误及笔记(Old)

1、Idea基础设置&#xff1a; File-->settings--> 1>修改字体&#xff1a;Font 2>修改编码格式&#xff1a;File Encodings(全部UTF-8,右下方复选框勾中--防止程序中的汉字转为ASCII码) 3>修改行号&#xff1a;Appearance&#xff1a;show line numbers show me…

java接口服务编排_GOKU API Gateway CE V3.1.0 发布:新增服务编排、配置版本管理等...

Goku API Gateway (中文名&#xff1a;悟空 API 网关)是一个基于 Golang 开发的微服务网关&#xff0c;能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的&#xff0c;拥有强大的自定义插件系统可以自行扩展&#xff0c;并且提供友好的图形化配置界…

maxcompute 2.0复杂数据类型之array

2019独角兽企业重金招聘Python工程师标准>>> 1. 含义 类似于Java中的array。有序、可重复。 2. 场景 什么样的数据&#xff0c;适合使用array类型来存储呢&#xff1f;这里列举了几个我在开发中实际用到的场景。 2.1 标签类的数据 为什么说标签类数据适合使用array类…

java中匿名数组_Swagger UI:数组中的多个匿名对象

对象数组的定义如下&#xff1a;type: arrayitems:type: objectproperties:prop1:type: stringprop2:type: integer# etc.在您的示例中&#xff0c;响应包含具有属性 balanceDisplaySettings 的对象&#xff0c;并且此属性包含对象数组 . 这可以定义如下&#xff1a;paths:/Pat…

java ioutils 写入文件_文件输入输出流工具: IOUtils使用总结

序言以前写文件的复制很麻烦&#xff0c;需要各种输入流&#xff0c;然后读取line&#xff0c;输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法&#xff0c;非常方便。下面就结合源码&#xff0c;看看IOUTils都有什么用处吧&#xff01;常用的静态变…

权限组件(6):权限分配的角色管理

效果图&#xff1a; 为了方便开发&#xff0c;先把中间件注释掉&#xff0c;要不还要在角色-权限表中添加对应关系。又因为二级菜单和面包屑导航需要中间件的变量&#xff0c;所以要在layout.html里面把这两个也注释掉。setting.py# rbac.middlewares.rbac.RbacMiddleware layo…

java 面试700问_JAVA面试700问(一)

1、Java环境中的字节码是什么&#xff1f;由Java 编译器生成的一种代码。由JVM生成的一种代码。Java源文件(Java Source File)的别名。一种写在类的实例方法中的代码。答案&#xff1a;由Java 编译器生成的一种代码。2、什么是Java垃圾回收机制&#xff1f;操作系统周期性的删除…

02-Django基础知识

一、内容回顾 1、web应用程序 2、HTTP协议 a、http协议特性 b、http请求格式 c、http响应格式 3、wsgiref模块 4、Django下载与简单应用 a、Django简介&#xff08;MTV&#xff09; b、下载django命令 c、创建项目命令 d、创建app应用 e、启动项目   二、今日概要 1、路由层&…

java条码大小_java - ML Kit条形码扫描:无效的图像数据大小

我想在捕获的图像中检测条形码。我使用android的camera2捕获图像。此后&#xff0c;将检索图像的元数据并将图像保存到设备。元数据全部传递到下一个活动&#xff0c;该活动是应用程序尝试检测条形码的地方。下一个活动是从先前保存的文件创建一个byte []。接下来&#xff0c;使…

MongoDB数据库泄露8亿电邮地址;微软开源Windows计算器;Linux 5.0 Kernel发布丨Q新闻...

本周要闻&#xff1a;华为正式宣布起诉美国政府&#xff1b;360 首席安全官谭晓生宣布离职&#xff1b;阿里开源 Flutter 应用框架 Fish Redux&#xff1b;微软开源 Windows 计算器&#xff1b;Linux 5.0 Kernel 发布&#xff1b;电邮验证服务泄漏 8 亿电邮地址&#xff1b;Chr…

mysql 视图 分页_mysql查看所有存储过程,函数,视图,触发器,表,分页

查询数据库中的存储过程和函数方法一&#xff1a;select name from mysql.proc where db your_db_name and type PROCEDURE //存储过程select name from mysql.proc where db your_db_name and type FUNCTION //函数方法二&#xff1a;show procedure status; //存储过程sh…

postman里测试文件上传(MultipartFile)

1、后台方法&#xff1a; Override PostMapping("/importNumberSpaceData") public DataImportOutDTO importNumberSpaceData(MultipartFile file) throws Exception { return dataImportOutDTO; } 2、启用postman 1、POST方法&#xff1b; 2、Body-form-data,key为后…

java解析上的jar包里的pom_Maven引入本地Jar包并打包进War包中的方法

1.概述在平时的开发中&#xff0c;有一些Jar包因为种种原因&#xff0c;在Maven的中央仓库中没有收录&#xff0c;所以就要使用本地引入的方式加入进来。2. 拷贝至项目根目录项目根目录即pom.xml文件所在的同级目录&#xff0c;可以在项目根目录下创建文件夹lib&#xff0c;如下…