Apache Ignite 學習筆記(三): Ignite Server和Client節點介紹

在前兩篇文章中,咱們把Ignite集羣當作一個黑盒子,用二進制包自帶的腳本啓動Ignite節點後,咱們用不一樣的客戶端鏈接上Ignite進行操做,展現了Ignite做爲一個分佈式內存緩存,內存數據庫的基本功能。從這篇文章開始,讓咱們打開這個黑盒子,逐步的深刻到Ignite內部瞭解更多的特性。java

Ignite集羣沒有采用master/slave架構設計。在集羣裏,每一個節點都是平等的,而且能夠互相通信,這樣的架構保證Ignite集羣能夠添加,移除節點,對集羣的內存容量進行不間斷的擴容/減容。也使得Ignite集羣有很強的容錯能力,能夠快速的檢測到一個或多個失效節點並恢復。 但在前面的文章中,咱們提到過在Ignite集羣裏有client和server節點,還有thin client。剛開始我也不理解爲何要引入這麼多不一樣角色的節點,但Ignite做爲一個數據網格,計算網格以及服務網格,不一樣角色的節點在不一樣的場景下都有其做用。 這篇文章裏,咱們先比較一下client和server節點有什麼不一樣;而後介紹下不一樣場景下,應該採用什麼樣的節點來搭建集羣;最後咱們看看如何在你本身的Java程序裏啓動一個server或者client節點。node

Client和Server節點比較


  • Serve節點:存儲數據,參與緩存,執行計算和流處理,部署服務網格。換句話說,server節點是功能最全的節點。默認狀況下,啓動一個Ignite節點都是以server節點的角色啓動。
  • Client節點:不存儲數據,可是能夠經過Ignite APIs鏈接到server節點上,進行緩存的讀寫,參與計算任務,流處理,事務和服務網格。和server節點不一樣,若是須要把一個節點做爲client節點,須要修改默認的配置。Client節點和server節點同時組成了Ignite集羣,因此它們能夠相互發現,相互鏈接。
  • Thin client:上一篇文章咱們作過介紹,thin client不會加入Ignite的集羣拓撲,它也不存儲數據,也不參與執行計算和流處理。和Ignite原生的client節點不一樣,它並不感知集羣的拓撲結構變化(增長/刪除節點後,thin client並不知道),並且一次只能和Ignite集羣中的一個節點鏈接通信,當該節點失效後,它會從事先配置好節點列表中挑選一個新的節點,從新鏈接。

下圖就展現了不一樣節點能提供的能力,以及它們互相之間的鏈接關係:
git

Thin client是跑在Ignite集羣外的,它只能鏈接集羣中某些節點,全部的操做和數據傳輸都須要經過這些節點。Client和server節點組成了Ignite集羣的拓撲,它們之間是能夠互相發現以及互相通信的,能夠充分利用不一樣節點間的帶寬進行數據傳輸。除了不能存儲數據,client和server節點基本同樣。那爲何Ignite還須要引入client和server不一樣的節點呢?Ignite同時提供了數據網格,計算網格和服務網格服務,經過client和server節點,能夠很方便的實現存儲和計算分離的架構。設想一下,若是全部服務都部署在同一組節點來提供,若是計算任務須要消耗大量系統資源,或者須要升級計算/服務網格,勢必要影響要影響數據服務。反之,對數據網格的減容,擴容也會影響計算和服務網格。所以,咱們能夠將計算網格和服務網格部署在client節點上,而數據網格部署在server節點上,這樣保證了計算和數據服務不會互相競爭資源,並且能夠獨立的對計算和數據網格進行減容/擴容。固然,這麼作的一個缺點client節點都須要經過server節點獲取數據,對一些追求高性能的計算任務來講,網絡延時和帶寬就有可能成爲瓶頸。對於這種場景,咱們能夠將client節點和server節點部署在同一臺主機上,減小一部分的網絡傳輸。spring

在應用程序中啓動Ignite server/client節點


前兩篇文章,咱們經過二級制安裝包中的腳本啓動幾個server節點,組成Ignite集羣,如今讓咱們來看看怎麼在本身的代碼裏啓動一個server節點或者是client節點。數據庫

啓動server節點代碼

咱們先來看看啓動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節點的代碼

下面是啓動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 modetrue(對應代碼爲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節點的啓動

啓動server和client時有兩點須要注意的:

  • Client節點啓動時必須有可用的server節點在Ignite集羣中,因此啓動的順序是先server節點後client節點。固然,在某些狀況下,若是須要client節點不論是否有可用的server節點都必需要成功啓動,則須要在client節點上配置強制服務端發現模式
  • 若是經過傳入xml配置文件的方式啓動節點,則須要在CLASS_PATH中包含ignite-spring模塊的jar文件(若是你經過二級制包安裝了Ignite,ignite-spring模塊就在IGNITE_HOME/lib/ignite-spring目錄下)。在maven成功編譯代碼後,我用下面的命令啓動server節點:
$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提供了哪些不同的能力。

相關文章
相關標籤/搜索