검색 팝업창

    tech Neo4j 구조 톺아보기
    2023.02.20 17:16
    • 작성자 관리자
    • 조회 3,390

    Neo4j 구조 톺아보기
    - DSC 전종희 선임 -

     

     

     

    안녕하세요, 엔코아 DSC에서 그래프 데이터베이스 관련 두번째 블로그 글을 게시합니다.

    두번째 게시글 주제는 그래프 데이터베이스 중 가장 대중적으로 사용하고 있으며 현재 엔코아와 파트너쉽을 체결하여 협력 관계를 이어가고 있는 Neo4j사의 그래프 데이터베이스 플랫폼 구성과 데이터베이스 아키텍처에 대해서 소개해 드리겠습니다.

     

    목차는 아래와 같습니다

    ㆍNeo4j 그래프 플랫폼

    ㆍNeo4j 데이터베이스 아키텍쳐

    ㆍNeo4j 메모리 아키텍쳐

     

    

     


     

     

     

    ㆍNeo4j 그래프 플랫폼

     

    □ Include secondary database models 39 systems in ranking, February 2023
    Rank DBMS Database Mode Score
    Feb
    2023
    Feb
    2023
    Feb
    2023
    Feb
    2023
    Feb
    2023
    Feb
    2023
    1. 1. 1. Neo4j  Graph 55.43 - 0.41 - 2.81
    2. 2. 2. Microsoft Azure Cosmos DB   Multi-model   36.51 - 1.45 - 3.45
    3. 3. 4. Virtuoso   Multi-model   6.11 + 0.23 + 0.72
    4. 4. 3. ArangoDB   Multi-model   5.29 + 0.22 - 0.11
    5. 5. 5. OrientDB Multi-model   4.54 + 0.06 - 0.49

    6.

    7. 8. JanusGraph Graph 2.79 + 0.16 + 0.44

    7.

    6. 6. Amazon Neptune Multi-model   2.73 - 0.08 - 0.26

    8.

    8. 7. GraphDB   Multi-model   2.44

    - 0.09

    - 0.49

    9.

    9. 9. TigerGraph Graph 2.16

    - 0.04

    - 0.08
    10. 11. 12. Graph Multi-model   1.89 +0.12 +0.57

     

    ​그림 1. 그래프 데이터베이스 순위, 2023-02-14일자(https://db-engines.com/en/ranking/graph+dbms)​

     

     

    Neo4j는 NoSQL 데이터베이스의 하나인 그래프 데이터베이스로, 네이티브 그래프 저장 및 처리 기능을 갖추고 ACID를 준수하는 Transactional 데이터베이스입니다. 그래프 데이터베이스 중에서 전세계적으로도 사용(점유율 1위)하고 있는 데이터베이스입니다. 그래프 데이터베이스 중에서 역사가 가장 길고 많은 레퍼런스를 가지고 있으나 국내에서는 아직 저변화되지 못한 실정이기는 합니다. 그럼에도 그래프 기술은 2019년 가트너 유망 트렌드로도 선정된 만큼 그 잠재력은 무궁무진 하다고 볼 수 있습니다. 그럼 바로 본 게시글의 주제로 넘어가도록 하겠습니다.

     

     

     

    ㆍNeo4j 그래프 데이터 플랫폼

    그림 2. Neo4j 그래프 데이터 플랫폼(1/2, https://neo4j.com/developer/graph-platform/)

     

    

    ✔ Neo4j 그래프 데이터베이스

    ◽ 연결된 데이터(그래프 데이터)를 저장하고 검색 가능한 그래프 데이터베이스이며, Community Edition과 Enterprise Edition의 두 가지 버전이 있습니다.

     

    ✔ Neo4j Desktop

    ◽ Neo4j의 로컬 인스턴스를 관리하는 애플리케이션입니다. 무료 다운로드에는 Neo4j Enterprise Edition 라이선스가 포함되어 있습니다.

     

    ✔ Neo4j 브라우저

    ◽ 데이터베이스의 데이터를 쿼리하고 보기 위한 온라인 브라우저 인터페이스이며, Cypher 쿼리 언어를 사용한 기본 시각화 기능이 탑재되어 있습니다.

     

    ✔ Neo4j Bloom

    ◽ 데이터를 시각화하고 분석하는데 코드나 프로그래밍 기술이 필요하지 않은(노-코드) 비즈니스 분석가를 위한 도구입니다.

     

    ✔ Neo4j AuraDB

    ◽ 클라우드 그래프 데이터베이스를 위해 Neo4j에서 제공하는 클라우드 서비스입니다.

     

    ✔ Graph Data Science

    ◽ Neo4j로 그래프 알고리즘을 실행하기 위한 공식으로 지원하는 라이브러리입니다.

     

     

     

    ※ Neo4j 그래프 데이터 플랫폼 상세

     

    •대규모 상호 연결된 데이터 세트를 실시간으로 탐색하는 지능형애플리케이션을 구축
    •네이티브 그래프 스토리지 및 처리엔진으로 구동되는데이터베이스를 제공

    •데이터 과학자가 네트워크 관련 계산을 위한 유연한 맞춤형 데이터 구조
    •수백억 개의 노드에 대한 결과를 신속하게 계산할 수 있는 강력하고 강력한 그래프 알고리즘 저장소

     

    •Cypher 쿼리는 유사한 SQL 쿼리보다 훨씬 짧고 단순하며 보다 유연한 처리 가능
    •Cypher 코드는 유지 관리가 쉽고 애플리케이션 유지 관리를 단순화

     

    •Neo4j 그래프와 시각적으로 상호 작용을 위한 사용하기 쉬운 그래프 탐색 응용 프로그램
    •설명적이고 코드 없는 검색, 시각화 설계는 상호간의 커뮤니케이션을 촉진하는데 이상적인 인터페이스 제공

     

    •특정 아키텍처에서 Neo4j를 쉽게 사용할 수 있도록 여러 커넥터를 제공(Spark, Kafka, Tableau 등)
    •일부 타사 및 커뮤니티 도구에 대한 교육 지원과 온라인 커뮤니티를 지원

    •클라우드 친화적 데이터베이스(50% 이상이 AWS, Azure 및 GCP 에서 사용)
    •온 프레미스, 프라이빗 클라우드, 하이브리드 환경에서도 실행

     

     

     

    

    •그래프 애플리케이션을 보다 쉽게 학습/운영하고 개발할 수 있는 고급 도구를 제공

     

    그림 3. Neo4j 그래프 데이터 플랫폼(2/2)

     

     

    시티즌 데이터 분석가도 손쉽게 설치하고 그래프 데이터 분석에 사용할 수 있는 Neo4j 데스크탑 부터 다양한 환경에서 데이터를 수집하기 위한 ETL 기능과 애플리케이션을 위한 드라이버와 API를 제공하고 있습니다. 그리고 그래프 데이터를 탐색하고 시각화 또는 분석 할 수 있는 Neo4j 브라우저와 그래프 알고리즘(경로 탐색, 중심성, 커뮤니티 탐지, 링크 예측, 유사도, 그래프 임베딩 등)을 제공하고 있습니다.

     

     

    

    그림 4. https://neo4j.com/press-releases/announcing-neo4j-5/

     

     

    최근에는 버전이 5로 업그레이드 되면서 그래프 데이터 질의, 스케일-아웃, 새로운 운영 관리 툴 제공 등 다양한 성능/관리적으로 향상되었습니다.

     

     

     


     

     

     

    ㆍNeo4j 데이터베이스 아키텍쳐

     

    그림 5. Neo4j High-Level Architecture(Graph Database 2e Neo4j, p.153)

     

    

    Neo4j 데이터베이스는 그래프 데이터베이스의 특징 중 하나인 인덱스 없는 인접성(IFA, Index-Free-Adjacency)의 특성을 갖추고 고성능의 순회 및 질의를 지원하는 네이티브 그래프 데이터베이스입니다. 위 그림은 Neo4j의 상위 수준의 아키텍처이며 데이터가 저장되는 디스크 파일에서 프로그램 API를 통해 Cypher 쿼리까지 상향식으로 수행됩니다. 그 수행 과정에서 Neo4j의 성능 및 의존성 특성들이 존재합니다.

     

    ✔ Disks

    ◽ Neo4j는 ACID(Atomicity,Consistency,Isolation,Durability)의 모든 속성을 지원하는 완전 트랜잭션 데이터베이스입니다. 따라서 파일 시스템이 플러시(fsync, fdatasync)(http://en.wikipedia.org/wiki/Sync_(Unix)) 와 같은 기능도 지원해야 하므로 Neo4j는 최소한 ext4(http://en.wikipedia.org/wiki/Ext4) 를 사용할 것을 권장하고 있습니다.

    ◽ 디스크 성능은 Neo4j의 읽기/쓰기 작업에 직접적인 영향을 미치기도 하며 프로덕션 환경에서는 SDD(http://en.wikipedia.org/wiki/Solid-state_drive)를 사용하는 것을 권장하고 있습니다.

     

     

    ✔ Record Files

    ◽ Neo4j는 다양한 유형의 파일을 사용하여 노드, 관계 및 속성을 저장합니다.

     * Neo4j의 저장 구조에 대해서는 관계형 데이터베이스 RDB VS 그래프데이터베이스 GDB, 그래프 데이터베이스 성능 최적화를 위한 IFA (Index-Free-Adjacency)(https://blog.naver.com/new_encore/222987987381)를 참고하시면 되겠습니다. 

    ◽ Neo4j 데이터 구성 파일 주요 내용

    eostore.nodestore.*: 노드에 대한 정보를 저장합니다. 생성한 모든 노드는 총 15바이트의 간단한 고정 크기 레코드로 여기에 저장됩니다. 첫 번째 바이트는 플래그로 사용됩니다. 다음 4개는 정수, 즉 노드의 첫 번째 관계 ID입니다.

    neostore.relationshipstore.*: 노드 간의 관계에 대한 모든 정보를 34바이트의 레코드에 저장합니다. 첫 번째 바이트는 이 관계의 방향성 유(1) 무(0) 여부에 따라 방향을 나타냅니다. 그런 다음 8바이트는 연결된 두 노드의 ID를 정의하는 데 사용됩니다(각각 4바이트). 다음 4바이트는 관계 유형을 나타내는 레코드의 ID입니다. 다음 16바이트는 첫 번째 노드의 이전 관계 ID, 첫 번째 노드의 다음 관계 ID, 두 번째 노드의 이전 관계 ID, 마지막으로 다음 관계 ID를 정의하는 데 사용됩니다.

    neostore.relationshiptypestore.*: 여기에는 관계 유형의 이름이 포함됩니다. 사용 유무에 대한 정보와 관계 유형을 저장하는 문자열의 블록 ID를 저장합니다.

    neostore.propertystore.*: Neo4j의 속성은 키-값 형식으로 노드와 관계 모두에 할당될 수 있습니다. 여기서 키는 문자열이고 값은 Java 기본 유형 또는 기본 유형의 배열입니다. 속성 레코드의 유형을 포함하고 속성 색인의 ID를 포함합니다. 그리고 값 또는 실제 값을 저장하는 ID를 포함하는 값이 차지합니다.

     

     

    

     

    그림 6. Neo4j Desktop 윈도우 환경에서 생성된 데이터 파일 예시

     

    

    ✔ Page Cache

    ◽ Neo4j 데이터베이스에서 중요한 구성 요소 중 하나이며 데이터 읽기 및 쓰기에 영향을 미칩니다. 디스크에 저장된 그래프 데이터를 캐싱하는데 사용되며 메모리에 캐싱하면 시스템 자원 비용이 많이 드는 디스크 액세스를 방지하고 최적의 성능을 얻을 수 있습니다.

     

    ✔ Lock Manager

    ◽ 데이터베이스에 대한 쓰기 상태를 나타내는 메모리 내의 객체가 생성, 업데이트 및 삭제될 때 노드 및 관계에 대한 쓰기 상태를 관리합니다.

     

    ✔ Transaction Manager

    ◽ 그래프 데이터에 대한 무결성을 완벽하게 유지하고 트랜잭션 동작(ACID)을 보장하고 관리합니다.

    ◽ 그래프 데이터, 인덱스 또는 스키마에 액세스하는 모든 작업과 더 높은 수준의 격리(Isolation)을 달성하기 위해 수동으로 획득할 수도 있습니다.

    ◽ 교착 상태 감지는 핵심 트랜잭션 관리에 내장되어 있습니다.

     

    ✔ Transaction Log

    ◽ 트랜잭션 로그는 데이터베이스의 모든 쓰기 작업을 기록하며 최신 트랜잭션 로그가 유지됩니다.

    ◽ 데이터베이스를 복구해야 하는 시나리오에서도 유용하게 사용되며, 클러스터 작업 뿐만 아니라 차등 백업을 제공하는데도 사용됩니다.

    ◽ 트랜잭션 로그 디렉토리는 neo4j.conf 파일의 server.directories.transaction.logs.root 에서 지정됩니다.

     

     

    

     

    그림 7. 사용자 수준의 Neo4j API(Graph Database 2e Neo4j, p.158)

     

    

    ✔ Kernel API

    ◽ Neo4j 커널은 테이블이 아닌 그래프로 구조화된 데이터를 저장하도록 설계된 경량 임베디드 Java 데이터베이스.

     

    ✔ Core API

    ◽ Core API는 노드, 관계, 속성 및 레이블의 그래프 정보를 사용자에게 제공하는 명령형 Java API입니다.

     

    ✔ Traversal API

    ◽ 순회 탐색을 위한 선언적 Java API이며 사용자는 순회가 가능한 그래프 부분을 제한하는 일련의 제약 조건을 지정할 수 있습니다.

     

    ✔ Cypher

    ◽ Neo4j에서 개발한 그래프 질의 언어입니다.

     

     

     


     

     

     

    ㆍNeo4j 메모리 아키텍쳐

     

     

    그림 8. Neo4j 메모리 아키텍처(https://neo4j.com/docs/operations-manual/current/performance/memory-configuration/)

     

    

    Neo4j 메모리 아키텍처는 크게 Neo4j가 설치되고 운영되는 운영체제 메모리 영역, Java JVM Heap 영역, Neo4j가 운영체제로 부터 직접 할당 받고 관리되는 네이티브 메모리 영역으로 3가지 구성요소로 구성됩니다. 각각의 구성 요소의 설명은 아래와 같습니다.

     

    ✔ OS Memory : 운영 체제 자체의 프로세스를 위한 영역

     

    ✔ JVM Heap : Neo4j가 인스턴스화된 Java 객체를 저장하는데 사용되는 동적 메모리 영역입니다. Java 객체의 메모리는 Gabage Collector에 의해 자동으로 관리됩니다.

    ◽ DBMS : 데이터베이스 관리 시스템 또는 DBMS에는 Neo4j 인스턴스의 전역 구성 요소가 포함되어 있습니다. 예를 들어 볼트 서버, 로깅 서비스, 모니터링 서비스 등이 있습니다.

    ◽ Transaction : 트랜잭션을 실행할 때 Neo4j는 아직 Commit 되지 않은 데이터, 결과 및 쿼리의 중간상태를 메모리에 저장합니다. 메모리 설정은 dbms.memory.transaction.total.max 설정으로 관리할 수 있습니다.

    ◽ Database : Neo4j 데이터베이스의 오버헤드를 위한 영역이며, 여러 데이터베이스가 있는 환경에서는 이 오버헤드를 고려하여 구성해야합니다.

     

    ✔ Native Memory : 오프힙 메모리 라고 하기도 하며 네이티브 메모리는 Neo4j가 운영 체제에서 직접 할당한 메모리입니다. 이 메모리는 동적으로 증가하며 가비지 콜렉터의 영향을 받지 않습니다.

    ◽ Page Cache : 페이지 캐시는 디스크에 저장된 그래프 데이터를 캐시하는데 사용됩니다. 그래프 데이터 및 인덱스를 메모리에 캐싱하면 시스템 자원의 비용이 많이 드는 디스크 액세스(I/O)를 방지하고 최적의 성능을 얻을 수 있습니다. Neo4j가 페이지 캐시에 사용할 수 있는 메모리 양을 지정하는 매개변수는 server.memory.pagecache.size입니다.

    ◽ Network Buffer : Neo4j에서 데이터를 보내고 받는데 사용되며, 네이티브 코드와 Java 코드가 데이터를 복사하지 않고 공유할 수 있도록 하므로 성능 향상에 중요합니다. 그러나 생성하는데 비용이 많이 들기 때문에 버퍼는 생성되면 일반적으로 재사용됩니다.

    ◽ Other shared buffers : 여기에는 지정되지 않은 공유 버퍼가 포함됩니다.

    ◽ JVM overhead : JVM이 정상적으로 동작하려면 아래와 같은 상황에서 약간의 여유 메모리가 필요합니다.

     

    * 스레드 스택 – 각 스레드에는 자체적인 호출 스택이 있습니다. 스택은 호출 스택(메서드 호출 목록) 자체와 함께 기본 지역 변수 및 개체 참조를 저장합니다. 스택 프레임이 컨텍스트에서 벗어나면 스택이 정리되므로 여기에서 가비지 콜렉터가 수행되지 않습니다.

    * Metaspace – Metaspace는 Java 클래스 정의 및 일부 기타 메타데이터를 저장합니다.

    * 코드 캐시 – JIT 컴파일러는 생성한 네이티브 코드를 코드 캐시에 저장하여 재사용하여 성능을 향상시킵니다.

     

    메모리 초기 구성과 관련해서는 운영하는 환경에 따라 다르겠지만 neo4j-admin server memory-recommendation 명령을 이용하여 메모리 설정에 대한 초기 권장사항을 획득 할 수 있습니다.

     

    예) Neo4j 데이터베이스에 대한 페이지 캐시 추정

    먼저 데이터 및 인덱스의 총 크기를 추정한 다음 곱(약 20%)하여 메모리 증가를 추정합니다

    $ neo4j-home> bin/neo4j-admin server memory-recommendation

    ...
    #Total size of lucene indexes inall databases: 6690m
    #Total size of data and native indexes inall databases: 35050m
    데이터 볼륨과 기본 인덱스가 약 35GB를 차지하는 것을 볼 수 있습니다. 현재 운영하고 있는 환경의 메모리 20% 정도의 증가가 예상 된다면 아래 처럼 설정 할 수 있습니다.
    neo4j.conf > server.memory.pagecache.size = 1.2 * (35GB) = 42GB

     

     

    메모리 초기 구성과 관련해서는 운영하는 환경에 따라 다르겠지만 neo4j-admin server memory-recommendation 명령을 이용하여 메모리 설정에 대한 초기 권장사항을 획득 할 수 있습니다.

    끝으로 Neo4j 데이터베이스 플랫폼 구성과 아키텍처에 대해서 알아보았습니다. 입춘이 지났지만 아직 쌀쌀합니다 건강 챙기시고, 게시물을 보신뒤 궁금한 사항은 질문 부탁드립니다. 여러분의 질문에 답을 찾는 과정이 그래프 데이터베이스를 이해하는 데 많은 도움이 될 것입니다.

     

    감사합니다.