개요

본 문서는 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

npm 모듈을 사용하다보면 promise 객체를 리턴하지 않아서 콜백으로만 결과를 처리해야 하는 모듈이 있다.

필자는 sqlite3 모듈을 사용중 db.get 함수의 리턴이 promiser가 아니었다.

그래서 해당 모듈의 결과는 콜백으로 받아야 하고 그 결과를 부모 호출자에게 보내기 위해서 Promise로 변환하는 작업이 필요했다.

 

import { Database } from 'sqlite3';
const db = new Database('db.sqlite');

export async function testSqlite(sender: any) {
  db.get('SELECT RANDOM() % 100 as result', (_: any, res: any) => {
    console.log(res);
  });
}

export async function testSqlite2() {
  return new Promise((resolve, reject) => {
    db.get('SELECT RANDOM() % 100 as result', (_: any, res: any) => {
      // if res 가 에러이면 reject(에러)
      //   console.log(res);
      resolve(res);
    });
  });
}

 

설치된 JDK 확인

/usr/libexec/java_home -V

 

java_home 확인

echo $JAVA_HOME

 

JAVA_HOME 수정

vi ~/.zshrc

 

  • 개요

본 문서는 PWA ( progressive web app )에 대해 조사한 문서이다. 기본 개념, 리액트 웹에 적용하는 방법 등에 대해 설명한다. 

 

  • PWA란? 

PWA는 우리가 웹 브라우저로 접속해서 보는 웹 기반 기술로 만든 ‘앱’이다. 웹 기술로 앱을 만드는 방법은 다양하게 연구되고 있다. 우리에게 친숙한 HTML,CSS,JS, React 등으로 구현가능하고, 심지어 기존 웹을 웹인걸 눈치채지 못하게 앱처럼 만들 수 있는 기능이다. 즉, 네이티브 앱 개발없이 앱을 빠르게 개발할 수 있다는 장점이 있다. 또한, 푸시 알림이나 오프라인 지원 같은 네이티브 앱만의 장점을 전부 제공할 수 있다.

 

  • 사례

우리가 많이 사용하는 사이트 중에도 PWA를 많이 찾아볼 수 있다. 본인도 구글 챗 등의 웹 앱을 PWA로 추가해서 데스크톱앱으로 사용하고 있다. 또, 트위터가 대표적이다. 트위터 사이트에 접속하면 홈화면에 트위터앱을 추가할 수 있다. 웹 사이트 북마크를 저장하는 것처럼 보이지만, 브라우저 창은 숨겨져 앱과 거의 동일한 사용경험을 제공한다. 또, os에 상관없이 한번의 개발로 동일한 경험을 제공한다. 

구글 앱들, 스타벅스, 핀터레스트, 워싱턴포스트, 우버 등도 PWA를 지원한다.

 

  • 네이티브 vs PWA

 

네이티브 앱은 보통 전용 앱으로 개발한다. 요즘은 Flutter와 같은 멀티 플랫폼 언어도 등장하고 있지만, 이 들도 네이티브 앱에 대해 어느정도 알아야 개발할 수 있다. 그러나 PWA는 웹 개발자가 쉽게 앱 개발 (정확히는 앱 사용 경험을 주는 웹앱 ) 을 할 수 있다.

 

  • 장점

 

  • 앱스토어 출시를 위한 비용이 발생하지 않는다.
  • 설치 과정이 필요 없다
  • 개발 비용이 저렴하다.
  • 반응형 웹일 경우 이는 앱에서도 잘 작동한다.
  • 부드럽고 가볍다.
  • 일반적인 웹사이트와 달리 오프라인에서도 동작한다.
  • 검색엔진에 노출된다.
  • 푸시 기능 사용이 가능하다.
  • 구성 요소

PWA를 구성하기 위해서는 크게 3가지 작업이 필요하다.

  • https or localhost
  • service worker
  • manifest.json
  • 적용

 

현재 본인이 리액트로 개발중인 솔루션에 PWA를 간단하게 적용해보았다. 앞서 말한 3가지를 잘 설정하면 어렵지 않게 적용할 수 있다. localhost 환경이기때문에 1번은 생략한다. 

  • service worker 등록
    •  npx create-react-app my-app --template cra-template-pwa
    • 위 코드를 통해 pwa 신규 프로젝트를 생성 후 서비스를 새로 개발하거나, 기존 프로젝트의 root 폴더에 service-worker.js 파일과 serviceWorkerRegistration.js 파일을 그대로 가져와 사용도 가능하다. 직접 서비스 워커 파일을 만들어 사용해도 되지만, 똑똑한 분들이 미리 만들어둔 파일을 사용하면 편리하다. 파일의 코드 내용은 생략한다.

 

  • 필요한 모듈을 설치한다.
  • manifest.json 파일 설정한다.
  • 프로젝트 실행 및 PWA 적용
  1. “yarn add ~” or “npm install ~”
  2. React 프로젝트를 빌드 후 serve 한다. ( npx serve -s build ) 
  3. yarn start / npm start 등의 개발 모드의 실행으로는 PWA를 설정할 수 없다. 반드시 빌드 후 production 모드로 serve한 웹으로 접속해야 활성 가능하다.
  4. 웹에 접속 후 개발자도구 – lighthouse – pwa 체크 후 검증
  5. 아래와 같은 축하 메세지를 받으면 PWA 적용이 완료된 것이다. ( 적용이 가능한 사이트로 인정받은 것이다.)
  6.  
  7. 웹 사이트의 주소창 옆 버튼을 순차로 클릭하면 PWA 웹앱을 데스크톱 앱처럼 활성이 된 것을 확인할 수 있다.
  8. 모바일에서는 아이폰 기준 홈화면에 추가를 누르면 홈화면에 앱 아이콘이 추가되고, 이를 실행하면 주소창 없는 PWA를  실행 가능하다. 



  • Next Plan

본 문서는 PWA의 개요와 기본 적용만 다루었다. 이후 개발을 진행하면서 push 알림과 같은 네이티브 앱의 기능들을 스터디하고 적용해볼 것이다. 네이티브 기능들을 잘 다루고 활용하고 이를 서비스에 잘 활용하면 더욱 좋은 사용자 경험을 만들 수 있다는 기대감과 웹 개발자로서 더 의미 있는 개발을 많이 할 수 있을거라 생각이 든다.



 




 

'Research' 카테고리의 다른 글

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

 

웹 3.0은 기본적으로 웹 2.0의 핵심인 읽기와 쓰기를 넘어 “소유”의 개념이 더해진 것이다. “탈중앙화된 관리자 개입이 없는 웹”이라고 할 수 있다.

데이터의 저장과 사용, 소유가 사용자에게 주어지는 완전히 개인화된 인터넷 환경을 만들 수 있다는 개념이다.

웹 2.0의 문제

  • 구글, 페이스북, 우버, 에어비엔비 등 WEB 2.0의 대표기업들은 그들의 서비스를 위해 ‘플랫폼’이라는 이름으로 폐쇄적인 네트워크 모델을 구축했다. 개인이 정보를 Read , Write, Publish 할 수 있고 이를 통해 정보는 전파되었고, 이는 곧 소셜미디어 시대의 시작이 되었다.개인 정보가 굉장한 자산이고 이는 엄청난 수익으로 연결된다는 것을 알게 된 기업들은 데이터를 대량으로 적재하기 시작하게 된다. 개인정보 데이터를 사유화하여 독점하고 이를 이용한 서비스모델을 구축하고 , 수익을 창출했다.소셜미디어의 “재미와 편의성”을 “개인 정보 및 보안”과 Trade off 한 결과를 초래하였다.

이러한 문제를 해결하기 위한 “탈중앙화” 개념은 오래전부터 있었지만, 이를 실현할 기술이 없었고 

WEB 3.0에서는 블록체인, 분산원장, NFT 등 이를 실현할 기술이 등장했다.

 

웹 3.0의 등장

  • 플랫폼을 제공하는 기업에 종속되지 않고 컨텐츠에 대한 소유권은 기업이 아닌 사용자가 소유
  • 데이터 분산 저장을 통한 보안성 향상
구분 web 1.0 web 2.0 web 3.0
특징 비교적 탈중앙화 중앙화 탈중앙화
컨텐츠 생성 및 소유 생성, 소유 X (Static) 생성O, 플랫폼 기업 소유 생성O, 사용자 소유

수익 모델 - 사용자 정보로 플랫폼 기업이 수익 창출 사용자의 참여로 수익 배분
인증 / 보안 ID / PW  ID / PW / 기타 인증 가상자산, 프라이빗 키
핵심 기술 WWW, 쿠키 빅데이터, 클라우드 블록체인, NFT, 메타버스

 

  • 플랫폼을 제공하는 기업에 종속되지 않고 컨텐츠에 대한 소유권은 기업이 아닌 사용자가 소유
  • 데이터 분산 저장을 통한 보안성 향상

웹 3.0의 블록체인

  • ‘가트너’의 하이퍼 사이클에 따르면 블록체인은 환멸기를 지나 성숙기로 향하는 중
  • 기술 자체에 대한 관심을 지나 실제 적용 가능한 영역에 투자가 집중되는 단계

웹 3.0의 분산 원장 기술

  • 네트워크에 참여하는 모든 사용자가 모든 거래 내역 등의 데이터를 분산, 저장하는 기술이다. 블록들을 체인 형태로 묶은 형태이기 때문에 블록체인이 되었다. 
  • 블록체인에서 ‘블록’은 개인과 개인의 거래(P2P)의 데이터가 기록되는 장부가 된다.
  • 이런 블록들은 형성된 후 시간의 흐름에 따라 순차적으로 연결된 ‘사슬(체인)’의 구조를 가지게 된다. 
  • 모든 사용자가 거래내역을 보유하고 있어 거래 내역을 확인할 때는 모든 사용자가 보유한 장부를 대조하고 확인해야 한다.

웹 3.0의 NFT

  • 대체 불가능 토큰으로 데이터, 자산의 거래 내역과 소유권을 저장한다. 해당 데이터, 자산, 디지털 작품은 누구나 복제하고 저장가능하다. 디지털 자산은 이미지, 영상, 음악 등이 될 수 있다. NFT는 블록체인에 제작자가 고유 식별자를 처음 입력하는 시점에 생성(민팅)된다. 트위터의 경우 NFT 이미지의 소유자만 프로필이미지로 등록 가능하게 했고, 복제된 이미지를 직접 업로드할 경우 실소유주가 아니란걸 알 수 있다.
{
    name: "이름",
    image: "ipfs://QmPZKvdf9boGsJL2CmMKadsfa2dfFFDfds39zVz96NxkEjBTDMxZoqJHWrEnP",
    description: "설명"
}
디지털 자산의 주소를 ipfs에 저장하기때문에, url 자체에 대한 보안 우려는 줄어듬
Http로 저장된 주소도 사용가능하지만 지양해야함

 

IPFS

    • https 이후의 차세대 통신 프로토콜로 주목 받는 기술이다. '분산 해시 테이블(DHT: Distributed Hash Tables)' '비트토렌트(BitTorrent)' '깃(Git)' '자체 인증 파일시스템(SFS: Self-Certified File systems)' 등 기존에 개발된 P2P 요소 기술을 종합한 분산 파일 시스템이다. 핵심 원리만 차용했을뿐 블록체인 기술은 아니다. https는 클라이언트 : 서버 = 1:1 관계를 가지지만, ipfs는 조각화되고 분산 저장된 데이터를 hash값(고유 id)을 통해 node에게 요청하고 없다면 다른 노드에게 요청하는 방식 ( 수소문(?) 해서 찾아가는 방식)
    • http(s) : 찾는 ‘주소'를 시스템에 전달하여 데이터 식별
    • ipfs : 찾는 ‘대상’을 시스템에 전달하여 데이터 식별

 

WEB 2.0 어플리케이션의 대체로 등장한 WEB 3.0 어플리케이션

마케팅 용어인 WEB 3.0

&ldquo;실리콘 밸리가 &lsquo;월가&rsquo;로부터 투자 유치를 이어나가기 위한 유행, 마케팅 용어일 뿐이다"

 

준비해야할 미래

  • WEB 3.0은 아직 모호하지만, 미래 WEB의 목표인 것은 확실하다.
  • 중앙집중적이고 독점적인 WEB 2.0의 문제를 해소하기 위한 합리적인 주장이면서 목표이다.
  • 아직까지는 뜬구름 잡는 마케팅 용어이지만, 이 목표를 위한 변화는 이미 시작되었다.
  • 한순간에 탈중앙화가 이루어지고 WEB 3.0이 도래하진 않지만, 이러한 패러다임은 반드시 다가올 것 이기때문에 준비 해야한다.

 

'Research' 카테고리의 다른 글

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

JS 배열 및 객체에서 일반적인 깊은 복사 얕은 복사 개념에 대해서는 넘어가고, 

nested된 객체 및 배열에 대해 얘기한다.

 

nested는 "중첩된"이라는 뜻인데,

일반적으로 많이 사용하는 깊은 복사 방법인 스프레드 연산 (...) 를 통해 객체를 복사하면 깊은 복사가 되긴한다.

단, 객체 안 객체, 배열 안 배열은 깊은 복사 되지 않는다.

 

// 깊은 복사
let obj = {a:'a'}
let deepCopy = {...obj}

// nested object
let obj = {a:'a', nested:{b:'b'}}
let deepCopy = {...obj}
let deepCopy2 = {...obj}


deepCopy.nested.b = 'B';
deepCopy2.nested.b = 'C';

console.log(deepCopy.nested.b) // 'C' 
console.log(deepCopy2.nested.b) // 'C'

외부 라이브러리 없이 해결 방법으로는 

let deepCopy = JSON.parse(JSON.stringify(obj));

이 있다.

 

lodash 같은 라이브러리를 활용하면

import cloneDeep from 'lodash/cloneDeep';

let deepCopy = cloneDeep(obj)

도 가능하다.

'Javascript' 카테고리의 다른 글

Promise를 지원하지 않는 NPM 모듈 Promise로 변환  (0) 2023.04.14

+ Recent posts