在既有系統中打通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.pswp.cn/news/536855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536855.shtml
英文地址,請注明出處:http://en.pswp.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;如下…