코딩공부/백엔드개발 공부

[Apache Ignite] Apache Ignite 기본 개념

내일의기대 2023. 12. 13. 01:20

본 글에서는 Apache Ignite에 대해서 기본 개념을 공식 홈페이지 소개글을 기반으로하여 설명합니다. 

Apache Ignite 그림. 출처 ignite.apache.org

1. Apache Ignite의 기본 개념
Apache Ignite은 공식문서에 Apache Ignite을 다음과 같이 정의합니다.

Aapche Ignite은 in-memory 속도의 높은 성능을 제공하는 분산 저장소이다.

여기서 "in-memory"는 데이터 접근에 아주 빠른 속도를 제공함을 의미하고 "분산"은 무제한의 확장성(scalability)와 따라서 무제한의 throughput을 제공함을 의미합니다.

Apache Ignite는 In-Memory Cache, In-memory DB (IMDB), In-memory Data Grid (IMDG)로 사용될 수 있습니다. 여기서 IMDB는 메모리를 마치 데이터베이스처럼 쓴다는 의미입니다. IMDG는 거기서 더 나아가 메모리를 각자 가진 서버가 Cluster를 형성이 가능한 형태를 말한다. 데이터를 분산저장하고, 서버 각자가 active 모드로 동작하여 부하 분산을 하며, 서버 추가가 용이하여 확장성이 있는 것이 특징입니다.

IMDG의 모습. 출처 Hazelcast

Apache Ignite은 GridGain Systems Inc.에서 2014년 오픈 소스로 만들었고 2014년 10월 Apache Incubator 프로그램에 승인되었습니다. 그리고 2015년 9월 18일 top-level Apache 프로젝트로 승격되었습니다. 2020-2021년 조사된 자료에 따르면 Ignite가 Top 5 엑티브 프로젝트를 기록하기도 하였습니다.

Data Store의 각종 랭킹을 조사하는 DB-Engines의 자료에 따르면 2023년 12월 기준 Key-Value Data Store중에 Apache Ignite는 11위를 기록하였습니다. 

Key-value Store 랭킹. 출처 DB-Engines

공식 홈페이지에 따르면 Microsoft, Netflix, Apple, Yahoo!, BloomBerg, PayPal, Banco do Brasil 등의 수 많은 선도 기업에서 Ignite를 채택했음을 확인할 수 있습니다. 이 링크를 들어가시면 실제 기업의 Use Case에 대한 Youtube 영상들을 확인하실 수 있습니다.

2. Apache Ignite의 특징

공식 홈페이지에서는 Ignite가 다음과 같은 특징을 가지고 있다고 설명하고 있습니다. 아래 글은 공식 홈페이지에 있는 글을 직역하였습니다.

  • 다계층 저장소 (Multi-Tiered Storage)
    Ignite는 메모리와 디스크 사이 scale-up scale-out 할 수 있습니다. 기본적으로 Ignite는 순수한 in-memory mode이지만 configuration setting을 단순히 on/off하는 것으로 cluster의 메모리 용량까지 자라날 수 있는 데이터베이스로 바꿀 수 있습니다.
IgniteConfiguration cfg = new IgniteConfiguration();

DataStorageConfiguration storageCfg = new DataStorageConfiguration();

// Ignite Persistence 활성화
storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);

// 새로운 storage configuration 사용
cfg.setDataStorageConfiguration(storageCfg);
  • 분산 SQL (Distributed SQL)
    JDBC 드라이버, ODBC 드라이버, 네이티브 SQL API 등을 통하여 Ignite를 전통적인 SQL 데이터베이스로 사용할  수있습니다. 이는 Java, C#, C++, Python과 다른 언어들에 사용될 수 있습니다. 자연스럽게 join, group, aggregate, order 명령어를 당신의 distributed in-memory와 on-disk 데이터에 활용할 수 있습니다.
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;
  • ACID 트렌젝션 (ACID Transactions)
    Ignite는 분산 ACID 트렌젝션을 제공하는 강력한 consistent 모드에서 운용될 수 있습니다. 다수의 cluster 노드, 캐시, 테이블, 파티션에서 거래가 일어날 수 있습니다.
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();
}
  • 그 외에도 Compute APIs, Built-in Machine Learning, Continuous Querties 등 다양한 특징이 있습니다. 

 

3. 개인적인 의견

Key-value 데이터 저장소는 열 손가락으로 꼽을 수 없을 정도로 많습니다. 위에서 설명했듯이 Apache Ignite는 현재 최고의 인기 프로젝트는 아닌 것으로 보입니다. 그럼에도 제가 Ignite를 공부하기로 마음 먹은 이유는 크게 두 가지 입니다.
먼저 현재 제가 필요로 하는 프로젝트에 In-memory DB이면서 데이터 Consistentcy가 필요합니다. Ignite는 Cluster 환경에서도 Consistency를 제공하는 것처럼 보입니다. 반대로 가장 유명한 프로젝트인 Redis의 경우 현재까지 제가 공부한 바로는 Cluster 환경에서 느슨한 Consistency를 제공하는 것으로 보입니다.
두 번째로 제가 필요로 하는 환경에서는 다음과 같이 세 가지 요구사항이 있습니다. 1) 저장되는 데이터가 적다 2) 빠른 read time delay가 필요하다 3) read는 많이 일어나고 wrtie는 적게 일어난다. 현재까지 공부한 바로는 Ignite는 위의 조건을 잘 만족시킬 수 있는 설정이 있는것으로 보입니다. 앞으로의 Ignite를 활용하여 이 세 가지 요구사항을 만족 시킬 수 있는 Ignite Cluster를 구성하려고 합니다.

다음 글에서는 Ignite의 분산된 다계층 저장소에 대해서 좀더 깊이 있게 다뤄보려고 합니다. 그리고 본 스터디의 최종목표로 Apache Ignite으로 Fully Replicated된 In-memory DB 구축을 목표로 하고 있습니다.

참고자료
- Apache Ignite 공식 홈페이지 : https://ignite.apache.org/
- Apache Ignite 위키피디아 : https://en.wikipedia.org/wiki/Apache_Ignite
- https://cyberx.tistory.com/170