extend _components/base.pug

block pagetitle
    title Distributed Database - Apache Ignite&reg;
    meta(name="description", content="Apache Ignite is a best distributed database management system for high-performance computing with in-memory speed. Learn how to use the Ignite decentralized database system and get started.")
    link(rel="canonical", href="https://ignite.apache.org/")

    meta(property="og:title", content="Distributed Database - Apache Ignite&reg;")
    meta(property="og:type", content="article")
    meta(property="og:url", content="https://ignite.apache.org/")
    meta(property="og:image", content="/img/og-pic.png")
    meta(property="og:description", content="Apache Ignite is a best distributed database management system for high-performance computing with in-memory speed. Learn how to use the Ignite decentralized database system and get started.")

block css
    link(rel="stylesheet", href="../js/vendor/highlight/default.min.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/night-owl.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/swiper/swiper-bundle.min.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/native-persistence.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/events.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/tooling.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/frontpage.css?ver=" + config.version)
    script(src="../js/vendor/highlight/highlight.min.js")
    script(src="../js/vendor/swiper/swiper-bundle.min.js")


block main
    - global.pageHref = ""
    - config.hdrClassName = "hdr__dark"

    .fronttop 
        include ./_components/header.pug

        section.innerhero.fronthero
            .container.innerhero__cont
                .innerhero__main.innerhero__main--long
                    //- .innerhero__pre.pb-3 Scale Across Memory And Disk With No Compromises
                    h1.h1.innerhero__h1.innerhero__mega Distributed Database For <br>High&#8209;Performance Applications <br>With In&#8209;Memory Speed
                    .innerhero__h2.h4.pt-2 Scale Across Memory And Disk With No Compromises
                    .innerhero__action.pt-5
                        a.button.fronthero__button(href="https://ignite.apache.org/docs/latest/index") Start Coding
        // /.innerhero



    section.frontblue
        aside.fronttopcards.flexi.container 
            a(href="https://blogs.apache.org/ignite/entry/apache-ignite-momentum-highlights-from", target="_blank").frontcard
                .frontcard__title.h5 A top-5 project of the Apache Software <br>Foundation
                .frontcard__prises.pt-3.flexi 
                    .frontcard__price.flexi
                        .frontcard__iconwrap
                            img(src="/img/frontpage/b1-prize1.svg", alt="")
                        span Big Data <br>Users Lists
                    .frontcard__price.flexi 
                        .frontcard__iconwrap.frontcard__iconwrap--blue
                            img(src="/img/frontpage/b1-prize1.svg", alt="")
                        span Users Lists
                    .frontcard__price.flexi 
                        .frontcard__iconwrap.frontcard__iconwrap--grey
                            img(src="/img/frontpage/b1-prize1.svg", alt="")
                        span Dev Lists
            // /.frontcard

            a(href="/use-cases/provenusecases.html").frontcard
                .frontcard__network
                    img(src="/img/frontpage/b1-planet.svg", alt="")
                .frontcard__title.h5.pt-3 Leading companies around the world select Ignite to speed and scale applications used by millions of&nbsp;people daily
            // /.frontcard
        // /.fronttopcards



        .container.forntcodes 
            h2.h3 Use Ignite Core Capabilities To Start Easily <br>And Scale Faster
            .forntcodes__wrap.flexi.jsTabWrap.pt-4
                .forntcodes__menu
                    ul.fz20
                        li
                            a(href="#", data-ftablink="frontcode-1").active Multi-Tier Storage
                        li
                            a(href="#", data-ftablink="frontcode-2") Distributed SQL
                        li
                            a(href="#", data-ftablink="frontcode-3") ACID Transactions
                        li
                            a(href="#", data-ftablink="frontcode-4") Compute APIs
                        li
                            a(href="#", data-ftablink="frontcode-5") Machine Learning
                        li
                            a(href="#", data-ftablink="frontcode-6") Continuous Queries
                    a.forntcodes__menumore.fz20(href="/features/") View all features
                
                .forntcodes__tabwraps 
                    .forntcodes__tab(data-ftab="frontcode-1").active
                        p.forntcodes__tabtitle.fz20.pb-1 Multi-Tier Storage
                        p Ignite scales up and out across memory and disk. By default, Ignite operates in a pure in-memory mode. But, by toggling a single configuration setting, you can turn a cluster into a database that can grow beyond the cluster's memory capacity:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="nativeTabXML").nativecode__link.active XML
                                a(href="#", data-tablink="nativeTabJava").nativecode__link Java
                                a(href="#", data-tablink="nativeTabNET").nativecode__link C#/.NET
                            -
                                let xmlMultiTierStorge = `<bean class="org.apache.ignite.configuration.IgniteConfiguration">
                                    <property name="dataStorageConfiguration">
                                        <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                                            <property name="defaultDataRegionConfiguration">
                                                <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                                                    <property name="persistenceEnabled" value="true"/>
                                                </bean>
                                            </property>
                                        </bean>
                                    </property>
                                </bean>`;

                                let javaMultiTierStorge = `IgniteConfiguration cfg = new IgniteConfiguration();

                                DataStorageConfiguration storageCfg = new DataStorageConfiguration();

                                // Enable Ignite Persistence
                                storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);

                                // Using the new storage configuration
                                cfg.setDataStorageConfiguration(storageCfg);
                                `;

                                let csharpMultiTierStorge = `var cfg = new IgniteConfiguration
                                {
                                    DataStorageConfiguration = new DataStorageConfiguration
                                    {
                                        DefaultDataRegionConfiguration = new DataRegionConfiguration
                                        {
                                            Name = "Default_Region",
                                            PersistenceEnabled = true
                                        }
                                    }
                                };
                                `;
                            .nativecode__tabs
                                .nativecode__tab(data-tab="nativeTabXML").active
                                    pre.nativecode__codebox 
                                        code.xml #{xmlMultiTierStorge}
                                .nativecode__tab(data-tab="nativeTabJava")
                                    pre.nativecode__codebox 
                                        code.java #{javaMultiTierStorge}
                                            
                                .nativecode__tab(data-tab="nativeTabNET")
                                    pre.nativecode__codebox 
                                        code.csharp #{csharpMultiTierStorge}
                            .forntcodes__bottom
                                a.button(href="/arch/multi-tier-storage.html") Learn More About Multi-Tier Storage
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab1 (END Multi-Tier Storage)




                    .forntcodes__tab(data-ftab="frontcode-2")
                        p.forntcodes__tabtitle.fz20.pb-1 Distributed SQL
                        p Use Ignite as a traditional SQL database by leveraging JDBC drivers, ODBC drivers, or the native SQL APIs that are available for Java, C#, C++, Python, and other programming languages. Seamlessly join, group, aggregate, and order your distributed in-memory and on-disk data:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="sqlTabSQL").nativecode__link.active SQL
                            -
                                let sqlCode = `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','BRA','ESP','JPN')
                                GROUP BY country.name, city.name
                                ORDER BY max_pop DESC LIMIT 3;`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="sqlTabSQL").active
                                    pre.nativecode__codebox 
                                        code.sql #{sqlCode}
                            .forntcodes__bottom
                                a.button(href="/features/sql.html") Learn More About Distributed SQL
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab2 (END Distributed SQL)



                    .forntcodes__tab(data-ftab="frontcode-3")
                        p.forntcodes__tabtitle.fz20.pb-1 ACID Transactions
                        p Ignite can operate in a strongly consistent mode that provides full support for distributed ACID transactions. Transact across multiple cluster nodes, caches, tables, and partitions:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="acidTabJava").nativecode__link.active Java
                                a(href="#", data-tablink="acidTabSharp").nativecode__link C#/.NET
                            -
                                let acidJava = `IgniteTransactions transactions = ignite.transactions();

                                try (Transaction tx = transactions.txStart()) {
                                    Integer hello = cache.get("Hello");

                                    if (hello == 1)
                                        cache.put("Hello", 11);

                                    cache.put("World", 22);

                                    tx.commit();
                                }`;

                                let acidSharp = `var transactions = ignite.GetTransactions();

                                using (var tx = transactions.TxStart()) {
                                    int hello = cache.Get("Hello");

                                    if (hello == 1) {
                                        cache.Put("Hello", 11);
                                    }

                                    cache.Put("World", 22);

                                    tx.Commit();
                                }`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="acidTabJava").active
                                    pre.nativecode__codebox 
                                        code.java #{acidJava}
                                .nativecode__tab(data-tab="acidTabSharp")
                                    pre.nativecode__codebox 
                                        code.csharp #{acidSharp}
                            .forntcodes__bottom
                                a.button(href="/features/acid-transactions.html") Learn More About Transactions
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab3 (END ACID Transactions)





                    .forntcodes__tab(data-ftab="frontcode-4")
                        p.forntcodes__tabtitle.fz20.pb-1 Compute APIs In Java, Scala, Kotlin, C#, C++
                        p With traditional databases, for in-place calculations, you use stored procedures that are written in a language such as PL/SQL. With Ignite, you use modern JVM languages, C# or C++ to develop and execute custom tasks across your distributed database:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="compTabJava").nativecode__link.active Java
                                a(href="#", data-tablink="compTabSharp").nativecode__link C#/.NET
                            -
                                let compJava = `// Broadcast the task to server nodes only.
                                IgniteCompute compute = ignite.compute(ignite.cluster().forServers());

                                // Each remote server node will execute the logic of the task/lambda below.
                                compute.broadcast(() -> System.out.println(
                                    "Hello Node: " + ignite.cluster().localNode().id()));`;

                                let compSharp = `// Broadcast the task to server nodes only.
                                var compute = ignite.GetCluster().ForServers().GetCompute();

                                // Each remote server node will execute the custom PrintNodeIdAction task.
                                compute.Broadcast(new PrintNodeIdAction());`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="compTabJava").active
                                    pre.nativecode__codebox 
                                        code.java #{compJava}
                                .nativecode__tab(data-tab="compTabSharp")
                                    pre.nativecode__codebox 
                                        code.csharp #{compSharp}
                            .forntcodes__bottom
                                a.button(href="/features/compute-apis.html") Learn More About Compute APIs
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab4 (END Compute APIs)





                    .forntcodes__tab(data-ftab="frontcode-5")
                        p.forntcodes__tabtitle.fz20.pb-1 Built-In Machine Learning
                        p Ignite machine learning uses built-in algorithms and tools, as well as TensorFlow integration, to enable the building of scalable machine learning models and avoid costly data transfers. Train, deploy, evaluate, and update your ML and DL models continuously and at scale:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="machineTabJava").nativecode__link.active Java
                            -
                                let machineJava = `// Create the trainer
                                KNNClassificationTrainer trainer = new KNNClassificationTrainer()
                                .withK(3).withIdxType(SpatialIndexType.BALL_TREE)
                                .withDistanceMeasure(new EuclideanDistance())
                                .withWeighted(true);

                                // Train the model
                                KNNClassificationModel knnMdl = trainer.fit(ignite, dataCache, vectorizer);

                                // Make a prediction
                                double prediction = knnMdl.predict(observation);`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="machineTabJava").active
                                    pre.nativecode__codebox 
                                        code.java #{machineJava}
                            .forntcodes__bottom
                                a.button(href="/features/machinelearning.html") Learn More About Machine Learning
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab5 (END Machine Learning)




                    .forntcodes__tab(data-ftab="frontcode-6")
                        p.forntcodes__tabtitle.fz20.pb-1 Continuous Queries
                        p With relational databases, you use triggers to react to certain events. With Ignite, you deploy continuous queries that are written in a modern programming language such as Java or C# and process streams of changes on the database and application side:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="contTabJava").nativecode__link.active Java
                                a(href="#", data-tablink="contTabSharp").nativecode__link C#/.NET
                            -
                                let contJava = `ContinuousQuery qry = new ContinuousQuery<>();

                                // The callback that will be triggered on the application side.
                                qry.setLocalListener(new MyLocalListener());

                                // The callback that will be executed on the server side.
                                qry.setRemoteFilterFactory(new MyRemoteFilterFactory());

                                // Deploy the query in the cluster.
                                cache.query(query);`;

                                let contSharp = `var cache = ignite.GetOrCreateCache("myCache");

                                var query = new ContinuousQuery(
                                    new MyLocalListener(), // Will be triggered on the application side.
                                    new MyRemoteFilter()); // Will be executed on the server side.

                                // Deploy the query in the cluster.
                                var handle = cache.QueryContinuous(query);`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="contTabJava").active
                                    pre.nativecode__codebox 
                                        code.java #{contJava}
                                .nativecode__tab(data-tab="contTabSharp")
                                    pre.nativecode__codebox 
                                        code.csharp #{contSharp}
                            .forntcodes__bottom
                                a.button(href="https://ignite.apache.org/docs/latest/key-value-api/continuous-queries", target="_blank") Learn More About Continuous Queries
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab6 (END Continuous Queries)
        // /.forntcodes
    // /.frontblue





    section.frontnewcards.container
        h2.h3 New To Ignite? <br>Three Primary Usage Scenarios
        .frontnewcards__wrap.pt-5
            article.frontsimplecard.cardsimple
                h4.cardsimple__title Application Acceleration <br>& Scale Out
                .cardsimple__text.cardsimple__text--long.
                    Accelerate your existing applications by&nbsp;100x using Ignite as&nbsp;an&nbsp;in-memory cache or&nbsp;in-memory data grid that is&nbsp;deployed over one or&nbsp;more external databases.
                .cardsimple__bottom
                    a(href="/use-cases.html#usecase2").cardsimple__button.button.button--shadow Learn More
            article.frontsimplecard.cardsimple
                h4.cardsimple__title Distributed Database For <br>HTAP Workloads
                .cardsimple__text.cardsimple__text--long.
                    Build applications that support transactional and&nbsp;analytical workloads by&nbsp;using Ignite as&nbsp;a&nbsp;database that scales beyond available memory capacity.
                .cardsimple__bottom
                    a(href="/use-cases.html#database").cardsimple__button.button.button--shadow Learn More
            article.frontsimplecard.cardsimple
                h4.cardsimple__title Digital Integration Hub<br>&nbsp;
                .cardsimple__text.cardsimple__text--long.
                    Create an&nbsp;advanced platform architecture that aggregates multiple back-end systems and databases into a&nbsp;low-latency and shared data store.
                .cardsimple__bottom
                    a(href="/use-cases.html#digitalhub").cardsimple__button.button.button--shadow Learn More
    // /.frontnewcards






    section.frontstories.container
        h2.h3 Ignite User Stories
        ul.frontstories__checkers.pt-5.capstext
            li Software & SaaS
            li Banking
            li Logistics & Transportation
            li Financial Services
            li Retail
            li Biotech
            li And others
        .frontstories__sliderwrap 
            button.ctrl.ctrl--prev
                img(src="/img/frontpage/icon-slider-arrow.svg", alt="")
            button.ctrl.ctrl--next
                img(src="/img/frontpage/icon-slider-arrow.svg", alt="")
            .swiper.jsFrontVideosSwiper
                .swiper-wrapper 
                    .swiper-slide
                        +powvideo(
                            "https://www.youtube.com/watch?v=3FFexcYIpmA",
                            "/img/poweredby/videos/001.png",
                            "",
                            "Leveraging In&nbsp;Memory Compute Grids With Core Systems Of&nbsp;Record",
                            "comvideo__txt--small"
                        )
                    .swiper-slide
                        +powvideo(
                            "https://www.youtube.com/watch?v=Mhtt2QL_qCQ",
                            "/img/poweredby/videos/002.png",
                            "",
                            "How To&nbsp;Use Apache Ignite To&nbsp;Rescue The Backend Of&nbsp;A&nbsp;Bank",
                            "comvideo__txt--black comvideo__txt--small"
                                )
                    .swiper-slide
                        +powvideo(
                            "https://www.youtube.com/watch?v=z28rthKIrDk",
                            "/img/poweredby/videos/003.png",
                            "",
                            "S9D Using Apache Ignite As&nbsp;A&nbsp;Part Of&nbsp;Real Time Campaigning",
                            "comvideo__txt--small"
                        )
                    .swiper-slide
                        +powvideo(
                            "https://techblog.yahoo.co.jp/oss/yahoo_shopping_purchases_ignite/",
                            "/img/poweredby/videos/005.png",
                            "",
                            "In-Memory Computing Patterns For High Volume, Real Time Applications",
                            "comvideo__txt--small", false
                        )
                    .swiper-slide 
                        +powvideo(
                            "https://www.youtube.com/watch?v=EdFOKJIjRSg",
                            "/img/poweredby/videos/008.png",
                            "",
                            "Fitness + In Memory Computing = Getting Ahead Of The Game",
                            "comvideo__txt--small"
                        )
                    .swiper-slide
                        +powvideo(
                            "https://www.youtube.com/watch?v=jF9T2cJB6t0",
                            "/img/poweredby/videos/009.png",
                            "",
                            "High Performance Exposure Management With Apache Ignite",
                            "comvideo__txt--black comvideo__txt--small"
                        )
                    .swiper-slide 
                        +powvideo(
                            "https://www.youtube.com/watch?v=_mnZQ3JDcn8",
                            "/img/poweredby/videos/014.png",
                            "",
                            "Ignite Success Story: How Ignite Fuels The High Throughput Messaging In&nbsp;Sentienz Akiro",
                            "comvideo__txt--black  comvideo__txt--small"
                        )
                    .swiper-slide 
                        +powvideo(
                            "https://techblog.yahoo.co.jp/oss/yahoo_shopping_purchases_ignite/",
                            "/img/poweredby/videos/004.png",
                            "",
                            "&laquo;Recent Purchases&raquo; With Apache Ignite",
                            "comvideo__txt--small", false
                        )
                    .swiper-slide 
                        +powvideo(
                            "https://www.youtube.com/watch?v=CPmwnjDJ1Sk",
                            "/img/poweredby/videos/006.png",
                            "",
                            "Embracing The Service Consumption Shift In&nbsp;Banking",
                            "comvideo__txt--small"
                        )
            .frontstories__pag
        .frontstories__bottom.pt-5
            a.button.button--shadow(href="/use-cases/provenusecases.html") Watch Other Stories
    // /.frontstories




    section.frontconfs.container 
        h2.h3 Join The Community At Events <br>And Meetups Worldwide
        .frontconfs__wrap
            a(href="https://www.meetup.com/Apache-Ignite-Virtual-Meetup/", target="_blank").frontconfcard.frontconfcard--red
                .frontconfs__iconwrap.pb-3
                    img(src="/img/frontpage/events/001.svg", alt="")
                h4.h5.frontconfcard__title.pb-2 Ignite Virtual Meetup
                p Experts and practitioners give <strong>online-talks and presentations</strong> and share their Apache Ignite experience.
                .frontconfcard__bottom
                    p.capstext Online
                    .frontconfcard__cal Regularly
            
            a(href="https://ignite-summit.org/", target="_blank").frontconfcard.frontconfcard--blue
                .frontconfs__iconwrap.pb-3
                    img(src="/img/frontpage/events/002.svg", alt="")
                h4.h5.frontconfcard__title.pb-2 Ignite Summit
                p This <strong>virtual conference</strong> is a chance to learn more about up-to-date in-memory computing solutions.
                p There are speakers from industry-leading companies and hundreds of participants from all over the world.
                .frontconfcard__bottom
                    p.capstext Online
                    .frontconfcard__cal Annually

            a(href="/events.html#upcoming", target="_blank").frontconfcard
                .frontconfs__iconwrap.pb-3
                    img(src="/img/frontpage/events/003.svg", alt="")
                h4.h5.frontconfcard__title.pb-2 Other Events
                p Join us for <strong>conferences, presentations, and webinars</strong> to learn more about in-memory computing technologies.
                .frontconfcard__bottom
                    p.capstext ONLINE <small>and</small> OFFLINE
                    .frontconfcard__cal Regularly
        .frontconfs__bottom.pt-5
            a.button.button--shadow(href="/events.html") View All Events
    // /.frontconfs


    section.event-featured.container.fronteventsbanner
        p.capstext Featured Event
        a(href="https://ignite-summit.org/schedule/", target="_blank").event-featured__banner.pt-5
            picture
                source(srcset="/img/events/event-banner-vert.jpg" media="(max-width: 767px)")
                img(src="/img/events/event-banner.jpg", alt="")
    // /.event-featured




    section.frontresourse.container 
        h2.h3 Resources To Elevate Your <br>Ignite Experience
        .frontresourse__subtitle.pt-2 Get access to a variety of free technical <br>and learning resources
        .frontresourse__wrap.flexi.fz20
            .frontresourse__col
                .capstext.pb-5 Technical resources
                a(href="/resources.html#technical").frontresitem.flexi.frontresitem--black 
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-docs.svg", alt="")
                    .frontresitem__text Apache Ignite technical documentation
                a(href="https://cwiki.apache.org/confluence/display/IGNITE/", target="_blank").frontresitem.flexi.frontresitem--gray
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-wiki.svg", alt="")
                    .frontresitem__text Ignite Wiki with a collection of low-level design documents and instructions
                a(href="/resources.html#git").frontresitem.flexi.frontresitem--gray
                    .frontresitem__icon 
                        img(src="/img/icon-github.svg", alt="")
                    .frontresitem__text Git repositories with Ignite source code and code samples and examples
            .frontresourse__col
                .capstext.pb-5 Learning resources
                a(href="/resources.html#learning").frontresitem.flexi.frontresitem--red 
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-videos.svg", alt="")
                    .frontresitem__text Dozens of essential videos and webinar <br>recordings
                a(href="/resources.html#training").frontresitem.flexi.frontresitem--rose
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-vebinar.svg", alt="")
                    .frontresitem__text Trainings and courses that help building high-performance and data-intensive applications with&nbsp;the Apache Ignite
                a(href="https://www.shamimbhuiyan.com/ignitebook", target="_blank").frontresitem.flexi.frontresitem--rose
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-book.svg", alt="")
                    .frontresitem__text Apache Ignite book to expand your knowledge <br>in in-memory computing and distributed databases
        .frontconfs__bottom.pt-5
            a.button.button--shadow(href="/resources.html") View All Resources

    section.toolingend.toolingend--front
        .container.flexi
            .toolingend__main
                p.toolingend__title.h3
                    strong Ready To Start?
                p.h5.pt-2 Discover our quick start guides and build your first <br>application in 5-10 minutes
            .toolingend__action
                a.button(href="https://ignite.apache.org/docs/latest/", target="_blank") Discover Quick Start Guide



                        