文档章节

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

李玉珏
 李玉珏
发布于 03/04 14:07
字数 2259
阅读 455
收藏 2

介绍

在本系列的第一篇文章中,安装了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还支持其它编程语言的瘦客户端

© 著作权归作者所有

李玉珏

李玉珏

粉丝 387
博文 79
码字总数 149758
作品 0
沈阳
架构师
私信 提问
加载中

评论(5)

李玉珏
李玉珏 博主

引用来自“紫金山仙仙”的评论

请问你说的其他批量导入方式是不是 流处理器,还有个问题,我怎么感觉用SQL查询效率也不高,我看官方说明,是不是实现SQL引擎还需要优化(好像日志时间是 2018年12月),是不是ignite JDBC 连接方式目前还不适合生产环境
如果是insert语句,可以看:https://liyuj.gitee.io/doc/sql/SQLReference.html#_2-4-2-set-streaming
查询效率不高?SQL是不是复杂?看下执行计划?这个不应该的。
紫金山仙仙
紫金山仙仙
请问你说的其他批量导入方式是不是 流处理器,还有个问题,我怎么感觉用SQL查询效率也不高,我看官方说明,是不是实现SQL引擎还需要优化(好像日志时间是 2018年12月),是不是ignite JDBC 连接方式目前还不适合生产环境
李玉珏
李玉珏 博主

引用来自“紫金山仙仙”的评论

@李玉珏 你好,想跟你请教个问题:您好,我是电力行业设计师,能否请教 ignite问题,使用JDBC模式批量insert效率很低,使用了持久化,普通商用服务器32G,备份数1,PARTITIONED,其中结果大约每分钟 500条,远远低于预期

JDBC批量执行效率不高
如想批量导数据,可考虑其他的批量导入功能
紫金山仙仙
紫金山仙仙
能否加微信请教,15651886817,感谢,研究了许久,未能解决性能问题
紫金山仙仙
紫金山仙仙
@李玉珏 你好,想跟你请教个问题:您好,我是电力行业设计师,能否请教 ignite问题,使用JDBC模式批量insert效率很低,使用了持久化,普通商用服务器32G,备份数1,PARTITIONED,其中结果大约每分钟 500条,远远低于预期
Apache Ignite的Node.js客户端使用入门

介绍 Ignite原生提供了若干种主要编程语言的支持,最近,还通过瘦客户端技术对其它的编程语言提供了支持,其中在2.7版本中新增加的瘦客户端包括Python、PHP和Node.js。 瘦客户端具有如下的特...

李玉珏
02/13
267
0
Ignite内存计算平台与Oracle TimesTen Scaleout对比

1.产品介绍 Ignite Ignite内存计算平台是一个高性能、集成化、混合式的企业级分布式架构解决方案,功能强大,有先进的集群管理功能,对于分布式内存数据库、流处理技术、分布式计算、分布式服...

李玉珏
2018/08/09
728
2
内存数据组织 - Apache Ignite

1.Ignite是什么? Apache Ignite是一个以内存为中心的分布式数据库、缓存和处理平台,支持事务、分析以及流式负载,可以在PB级数据上享有内存级的性能。 1.1.Ignite定位 Ignite是不是内存数据...

匿名
2015/01/10
29K
8
GridGain 社区版面世:面向生产的 Apache Ignite

GridGain公司近日宣布,推出GridGain社区版(GCE)——一个增强的、高性能的开源内存计算平台。 GCE基于Apache®Ignite™构建,包含GridGain®开发的附加功能,调整和补丁更新,提供了更好的...

李玉珏
03/11
2K
5
Apache Ignite 2.5.0 版本发布,千级节点伸缩性

Apache Ignite 2.5: 千级节点伸缩性 Apache Ignite的用户通常知道的两个关键点是-扩展性和性能。在很多分布式系统的整个生命周期中,通常会不停地改进性能,而对扩展性相关的改进次数,会比较...

李玉珏
2018/06/01
1K
10

没有更多内容

加载失败,请刷新页面

加载更多

[2019好程序员大数据教程]SparkGraphx从入门到精通(33集视频+源码+笔记)

1、什么是Spark GraphX? Spark GraphX是一个分布式的图处理框架。社交网络中,用户与用户之间会存在错综复杂的联系,如微信、QQ、微博的用户之间的好友、关注等关系,构成了一张巨大的图,单...

好程序员官网
35分钟前
5
0
DDD(十)--仓储

1、引言 DDD中的Repository(仓储):协调领域和数据映射层,利用类似与集合的接口来访问领域对象。——《领域驱动设计-软件核心复杂性应对之道》 仓储是DDD中产生的概念,也就是说,如果应...

MrYuZixian
44分钟前
8
0
Jenkins的多种迁移方法

说明 Jenkins有时需要进行迁移,主目录会发生改变,本文主要讲解如何更改主目录。由于jenkins安装方式的不同,主目录也不一样。 本测试环境:Centos7.6 X64。注意:在更改主目录之前,请一定...

Elson
45分钟前
10
0
Table 信息转成pojo属性

import com.google.common.base.CaseFormat;import java.sql.*;/** * @author: liyhu * @date: 2019/11/22 */public class TableToPojo { static String url="jdbc:mys......

暗中观察
今天
10
0
Access数据库-C#操作类

//Access数据库-C# 操作类 代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.OleDb;using System.Data;namespace XXX{......

芳缘
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部