개요

본 문서는 AresDB에 대한 개요, 특징, 아키텍쳐 등에 대해 설명한 문서이다. 

AresDB란?

Ares DB는 빅데이터 처리를 위한 고성능 데이터베이스 시스템으로, 높은 확장성과 성능을 제공하는 분산형 데이터베이스 시스템이다. Ares DB는 대용량 데이터 처리 및 분석을 위한 목적으로 설계되었다. Ares DB는 시계열 집계 기능을 갖춘 GPU 기반 실시간 분석 DB이다.

아키텍처 - 시스템 구성

Ares DB는 대부분의 데이터를 메모리(RAM)에 저장하여 CPU를 사용한 데이터 수집과 디스크를 통한 데이터 복구를 처리한다. 쿼리 시점에 데이터를 메모리에서 GPU 메모리로 전송하여 GPU에서 병렬 처리한다. 아래 그림처럼 메모리 저장소,메타 데이터 저장소, 디스크 저장소로 구성된다.

https://www.uber.com/blog/aresdb/
https://www.uber.com/blog/aresdb

 

 

아키텍처 - 테이블

  1. 테이블
    1. 대부분의 관계형 DBMS와 달리, AresDB에는 데이터베이스 및 스키마가 없다. 모든 테이블은 동일한 인스턴스에서 동일한 범위에 속한다. 테이블은 Dimension table과 Fact Table로 나뉜다
  2. Dimension Table
    1. 엔티티의 현재 속성을 지정한다. 일반적인 정보를 저장하는 테이블이고, 뒤에서 설명한 Fact 테이블과 달리 시간 저장되지 않기 때문에 항상 일정한 크기에 의해 제한되는 테이블이다.
  3. Fact Table
    1. 시계열 이벤트의 스트림을 저장한다. 실시간 이벤트를 저장하고 시간이 연관되어 시간별로 테이블을 쿼리하는게 일반적이다.

아키텍처 - 특징

  1. 분산 아키텍처
    1. 여러 대의 서버에 데이터를 분산하여 저장하고 처리하는 분산형 아키텍처를 가지고 있다. 이를 통해 빅데이터 처리에 필요한 고성능과 높은 확장성을 제공한다.
  2. 열 지향 저장
    1. 데이터를 열 단위로 저장하는 열 지향(columnar) 저장 방식을 사용한다. 이를 통해 빠른 쿼리 처리와 압축 기능을 제공하여 데이터 처리 성능을 향상시킨다.
  3. 분산 데이터 처리
    1. 분산 데이터 처리를 위한 기능을 제공한다. 데이터를 여러 개의 노드에 분산하여 처리하므로 데이터 처리 성능을 높이고, 장애 대응을 향상시킨다.
  4. 데이터 복제와 장애 허용성
    1. 데이터의 복제 기능을 제공하여 데이터의 안정성을 확보하고 장애에 대비할 수 있다. 노드의 장애가 발생하더라도 데이터의 손실 없이 서비스를 지속할 수 있다.
  5. 다양한 데이터 모델 지
    1. 다양한 데이터 모델을 지원. 관계형 데이터, 시계열 데이터, 그래프 데이터 등 다양한 형태의 데이터를 처리할 수 있다.

장점

  1. 대용량 데이터 처리 및 분석에 효과적인 고성능 데이터베이스 시스템으로 빠른 데이터 처리와 확장성이 뛰어나다.
  2. 분산 아키텍처와 데이터 복제 기능을 통해 높은 안정성과 가용성을 제공한다.
  3. 다양한 데이터 모델을 지원하여 다양한 분야에서 활용이 가능하다.

단점

  1. Ares DB는 고성능 데이터베이스 시스템으로써, 일반적인 작은 규모의 애플리케이션에는 오버 스펙으로 인한 부담이 될 수 있다.
  2. 사용 및 관리가 복잡할 수 있으며, 높은 수준의 기술적 지식이 필요할 수 있다.
  3. 현재의 높은 확장성과 성능은 빅데이터 처리와 분석을 필요로 하는 고급 사용자에게 적합하며, 일반적인 사용자에게는 과도한 기능과 복잡성이 될 수 있다.


GPU 관련 특징

 

  1. 병렬 연산
    1. GPU를 활용한 병렬 연산 능력을 활용하여 데이터 처리 작업을 가속화할 수 있다.
  2. 고성능 쿼리 처리
    1. GPU를 활용하여 복잡한 쿼리 작업을 고성능으로 처리할 수 있다. 예를 들어, 대용량 데이터 집합에 대한 빠른 집계, 그룹화, 정렬, 필터링 등의 작업을 GPU를 통해 효율적으로 처리할 수 있다.
  3. 실시간 데이터 처리
    1. GPU를 사용하여 Ares DB는 대용량 데이터의 실시간 처리를 지원할 수 있다. 높은 처리량과 낮은 레이턴시를 갖는 GPU는 데이터베이스에서 실시간 분석 및 처리가 필요한 경우에 효과적으로 사용될 수 있다.
  4. 확장성
    1. 분산 아키텍처를 기반으로 하며, GPU를 활용한 병렬 처리를 통해 높은 확장성을 제공한다. 새로운 GPU 노드를 추가하여 시스템의 확장이 가능하며, 데이터 처리 성능을 유연하게 확장할 수 있다.

AQL

ares DB는 일반적인 SQL을 사용하지 않는다. JSON 형태의 AQL을 사용하여 프로그래밍에 친숙한 쿼리를 작성하는 것이 특징이다. 

 

SELECT count(*) FROM trips GROUP BY city_id WHERE status = ‘completed’ AND request_at >= 1512000000

SELECT count(*) FROM trips GROUP BY city_id

위 쿼리를 AQL로 표현하면 아래와 같다.

{
  "table": "trips",
  "dimensions": [
    {
      "sqlExpression": "city_id"
    }
  ],
  "measures": [
    {
      "sqlExpression": "count(*)"
    }
  ]
}

JSON 형태의 AQL은 SQL 인젝션 보안 문제에 대한 걱정없이 쉽게 작성이 가능하고, 조작할 수 있다. 또한 이런 형태는 다양한 프로그래밍 코드에서 친숙하게 사용되고 조작될 수 있다.

소스 코드 리뷰

  1. 기본적인 DB연결, 스키마 정의, 데이터 추가, 데이터 조회
#include <ares/ares.hpp>  // Ares DB 헤더 파일을 포함.

int main() {
  // Ares DB 인스턴스를 생성.
  ares::Ares ares;

  // 데이터베이스에 연결.
  ares.connect("localhost", 8888); // 호스트와 포트를 지정.

  // 데이터 스키마를 정의.
  ares::Schema schema;
  schema.addIntegerField("id"); // id 필드를 정수형으로 추가.
  schema.addStringField("name"); // name 필드를 문자열 형태로 추가.

  // 데이터베이스에 스키마를 등록.
  ares.createTable("my_table", schema); // "my_table"이라는 테이블명으로 스키마를 등록.

  // 데이터를 추가.
  ares::Row row1; // 데이터를 나타내는 Row 객체를 생성.
  row1["id"] = 1; // Row 객체에 필드와 값을 지정.
  row1["name"] = "Alice";
  ares.insert("my_table", row1); // "my_table" 테이블에 Row 객체를 추가.

  // 데이터를 조회.
  ares::Query query;
  query.select("*").from("my_table").where("id = 1"); // "my_table"에서 id가 1인 데이터를 조회.
  ares::ResultSet result = ares.query(query); // 쿼리를 실행하고 결과를 ResultSet 객체로 받음.

  // 조회 결과를 출력.
  for (const ares::Row & row: result) {
    std::cout << "id: " << row["id"].getInt() << ", name: " << row["name"].getString() << std::endl;
  }

  // 데이터베이스 연결을 종료.
  ares.disconnect();

  return 0;
}

 

  1. GPU 연산을 활용한 데이터 처리
#include <ares/ares.hpp>
#include <cuda_runtime.h>

// Ares DB에서 GPU를 사용하여 데이터 처리하는 예시 함수
void processWithGPU() {
  // Ares DB 데이터베이스 인스턴스 생성
  ares::AresDB aresDB;

  // GPU 메모리 할당
  float * gpuData;
  cudaMalloc((void ** ) & gpuData, sizeof(float) * 1000);

  // GPU 커널 실행
  myGpuKernel << < 1, 256 >>> (gpuData, 1000);

  // GPU에서 데이터를 가져와서 Ares DB에 저장
  cudaMemcpy(aresDB.getMutableDataPtr(), gpuData, sizeof(float) * 1000, cudaMemcpyDeviceToHost);

  // GPU 메모리 해제
  cudaFree(gpuData);

  // Ares DB 데이터 처리 작업 수행
  aresDB.processData();

  // 결과 처리
  // ...
}

 

 





'Research' 카테고리의 다른 글

PWA 개념과 react에 PWA 적용하기  (0) 2023.02.21
WEB 3.0이란?  (1) 2023.02.17
Jager(예거)에 대해서  (1) 2022.12.26
Git 활용 방법과 브랜치 전략  (1) 2022.11.30
Prometheus(프로메테우스) 개념 및 timescaleDB로 변환  (0) 2022.11.30

+ Recent posts