在前兩篇文章中,咱們把Ignite集羣當作一個黑盒子,用二進制包自帶的腳本啓動Ignite節點後,咱們用不一樣的客戶端鏈接上Ignite進行操做,展現了Ignite做爲一個分佈式內存緩存,內存數據庫的基本功能。從這篇文章開始,讓咱們打開這個黑盒子,逐步的深刻到Ignite內部瞭解更多的特性。java
Ignite集羣沒有采用master/slave架構設計。在集羣裏,每一個節點都是平等的,而且能夠互相通信,這樣的架構保證Ignite集羣能夠添加,移除節點,對集羣的內存容量進行不間斷的擴容/減容。也使得Ignite集羣有很強的容錯能力,能夠快速的檢測到一個或多個失效節點並恢復。 但在前面的文章中,咱們提到過在Ignite集羣裏有client和server節點,還有thin client。剛開始我也不理解爲何要引入這麼多不一樣角色的節點,但Ignite做爲一個數據網格,計算網格以及服務網格,不一樣角色的節點在不一樣的場景下都有其做用。 這篇文章裏,咱們先比較一下client和server節點有什麼不一樣;而後介紹下不一樣場景下,應該採用什麼樣的節點來搭建集羣;最後咱們看看如何在你本身的Java程序裏啓動一個server或者client節點。node
下圖就展現了不一樣節點能提供的能力,以及它們互相之間的鏈接關係:
git
Thin client是跑在Ignite集羣外的,它只能鏈接集羣中某些節點,全部的操做和數據傳輸都須要經過這些節點。Client和server節點組成了Ignite集羣的拓撲,它們之間是能夠互相發現以及互相通信的,能夠充分利用不一樣節點間的帶寬進行數據傳輸。除了不能存儲數據,client和server節點基本同樣。那爲何Ignite還須要引入client和server不一樣的節點呢?Ignite同時提供了數據網格,計算網格和服務網格服務,經過client和server節點,能夠很方便的實現存儲和計算分離的架構。設想一下,若是全部服務都部署在同一組節點來提供,若是計算任務須要消耗大量系統資源,或者須要升級計算/服務網格,勢必要影響要影響數據服務。反之,對數據網格的減容,擴容也會影響計算和服務網格。所以,咱們能夠將計算網格和服務網格部署在client節點上,而數據網格部署在server節點上,這樣保證了計算和數據服務不會互相競爭資源,並且能夠獨立的對計算和數據網格進行減容/擴容。固然,這麼作的一個缺點client節點都須要經過server節點獲取數據,對一些追求高性能的計算任務來講,網絡延時和帶寬就有可能成爲瓶頸。對於這種場景,咱們能夠將client節點和server節點部署在同一臺主機上,減小一部分的網絡傳輸。spring
前兩篇文章,咱們經過二級制安裝包中的腳本啓動幾個server節點,組成Ignite集羣,如今讓咱們來看看怎麼在本身的代碼裏啓動一個server節點或者是client節點。數據庫
咱們先來看看啓動server節點的代碼:apache
public class IgniteServerNodeExample { public static void main(String[] args) { Ignite ignite; if(args.length == 1 && !args[0].isEmpty()) { //若是啓動時指定了xml配置文件,則用指定的配置文件 System.out.println("Use " + args[0] + " to start."); ignite = Ignition.start(args[0]); } else { //若是啓動時沒指定配置文件,則生成一個配置文件 System.out.println("Create an IgniteConfiguration to start."); TcpDiscoverySpi spi = new TcpDiscoverySpi(); TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder(); ipFinder.setMulticastGroup("224.0.0.251"); spi.setIpFinder(ipFinder); IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setDiscoverySpi(spi); ignite = Ignition.start(cfg); } // 建立一個TEST緩存並寫入一些數據, key是城市的名字,value是省的名字 IgniteCache<String, String> cityProvinceCache = ignite.getOrCreateCache("TEST"); cityProvinceCache.put("Edmonton", "Alberta"); cityProvinceCache.put("Markham", "Ontario"); cityProvinceCache.put("Montreal", "Quebec"); } }
在啓動Ignite節點時,咱們須要傳入節點的配置信息。代碼裏咱們用了兩種方式:1)若是啓動時傳入一個xml配置文件路徑,咱們就用該配置文件啓動節點;2)若是沒指定配置文件,咱們就在代碼裏生成一個IgniteConfiguration對象,並配置Ignite節點用multicast的方式發現局域網內的其餘節點並組成集羣(除了multicast,Ignite還支持指定靜態ip地址或者用zookeeper進行節點探測發現,具體的配置方式會有一篇文章專門來介紹)。xml配置文件中的每一個配置項均可以經過IgniteConfiguration對象用代碼進行配置,因此兩者是等效的。和代碼裏IgniteConfiguration對象等效的xml配置以下:緩存
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="multicastGroup" value="224.0.0.251"/> </bean> </property> </bean> </property> </bean> </beans>
在用Ignite.start()啓動節點後,咱們在server節點上建立了一個名字叫「TEST」的緩存,緩存的key是城市的名字(String),value是城市所在省份的名字(String)。 而後往緩存裏插入三條數據。網絡
下面是啓動client節點的代碼:架構
public class IgniteClientNodeExample { public static void main(String[] args) { Ignite ignite; if(args.length == 1 && !args[0].isEmpty()) { //若是啓動時指定了配置文件,則用指定的配置文件 System.out.println("Use " + args[0] + " to start."); ignite = Ignition.start(args[0]); } else { //若是啓動時沒指定配置文件,則生成一個配置文件 System.out.println("Create an IgniteConfiguration to start."); TcpDiscoverySpi spi = new TcpDiscoverySpi(); TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder(); ipFinder.setMulticastGroup("224.0.0.251"); spi.setIpFinder(ipFinder); IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setDiscoverySpi(spi); //顯式配置client模式啓動該節點. cfg.setClientMode(true); ignite = Ignition.start(cfg); } //從ignite中讀取緩存,並讀取數據 IgniteCache<String, String> cityProvinceCache = ignite.getOrCreateCache("TEST"); System.out.println("Montreal is in " + cityProvinceCache.get("Montreal")); System.out.println("Edmonton is in " + cityProvinceCache.get("Edmonton")); System.out.println("Markham is in " + cityProvinceCache.get("Markham")); System.out.println("Toronto is in " + cityProvinceCache.get("Toronto")); } }
和server節點的代碼相似,啓動client節點時咱們一樣能夠傳入一個xml配置文件,或者在代碼中生成一個IgniteConfiguration對象,而後進行配置。和server節點不一樣的是,若是須要啓動一個client節點,須要顯式的配置client mode爲true(對應代碼爲cfg.setClientMode(true))。和代碼裏等效的xml配置文件以下:maven
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"> <property name="multicastGroup" value="224.0.0.251"/> </bean> </property> </bean> </property> <property name="clientMode" value="true"/> </bean> </beans>
在用Ignite.start()啓動節點後,client節點從Ignite集羣中獲取名爲「TEST」的緩存,而後試着從緩存裏讀取不一樣城市對應的省份名字。
啓動server和client時有兩點須要注意的:
$cd ignite-client-server-node-example/target $java -cp ./ignite-client-server-node-example-1.0-SNAPSHOT.jar:$IGNITE_HOME/libs/*:$IGNITE_HOME/libs/ignite-spring/* IgniteServerNodeExample ../src/main/resources/ignite-server-config.xml
同理,用下面的命令啓動client節點:
$cd ignite-client-server-node-example/target $java -cp ./ignite-client-server-node-example-1.0-SNAPSHOT.jar:$IGNITE_HOME/libs/*:$IGNITE_HOME/libs/ignite-spring/* IgniteClientNodeExample ../src/main/resources/ignite-client-config.xml
在啓動client節點先後,咱們能夠稍微留意下server節點關於Ignite集羣拓撲結構的相關日誌,在啓動client節點前:
[00:55:52] Ignite node started OK (id=42996817) [00:55:52] Topology snapshot [ver=1, servers=1, clients=0, CPUs=2, offheap=1.6GB, heap=1.7GB] [00:55:52] ^-- Node [id=42996817-925A-4FF5-8B5D-4B80D4774905, clusterState=ACTIVE] [00:55:52] Data Regions Configured: [00:55:52] ^-- default [initSize=256.0 MiB, maxSize=1.6 GiB, persistenceEnabled=false]
集羣的拓撲版本爲1,集羣內有1個server節點,0個client節點。 在啓動client節點後:
[00:59:06] Topology snapshot [ver=2, servers=1, clients=1, CPUs=2, offheap=1.6GB, heap=3.5GB] [00:59:06] ^-- Node [id=42996817-925A-4FF5-8B5D-4B80D4774905, clusterState=ACTIVE] [00:59:06] Data Regions Configured: [00:59:06] ^-- default [initSize=256.0 MiB, maxSize=1.6 GiB, persistenceEnabled=false]
集羣的拓撲版本爲2,集羣內有1個server節點,1個client節點,這表明咱們成功的啓動了一個server節點和client節點。
在client節點啓動後,它會試着讀取server節點寫入「TEST」緩存的數據,因此咱們應該能夠在client節點日誌中看到如下的輸出:
Montreal is in Quebec Edmonton is in Alberta Markham is in Ontario Toronto is in null
除了Toronto之外,其餘的城市都能讀到對應的省份信息。這也驗證了client節點讀取的就是server節點寫入的那份緩存。
咱們介紹了Ignite集羣節點中兩個不一樣的角色--server和client,並比較了它們之間的不一樣。咱們還展現瞭如何在java程序中啓動server和client節點。 完整的代碼和maven工程能夠在這裏找到。 Server和client對應的xml配置文件在src/main/resources目錄下。
Ignite集羣的配置,節點發現以及集羣管理,感興趣的同窗能夠參考下官方文檔。在後面會有專門的文章介紹細節和例子。從下一篇文章開始,讓咱們先聚焦在Ignite的數據網格服務上,看看和其餘key/value緩存系統相比,Ignite提供了哪些不同的能力。