Fairy ' s

[29. March] 데이터베이스 개념 / TIL 본문

Devops Bootcamp

[29. March] 데이터베이스 개념 / TIL

berafairy 2023. 3. 29. 15:44

데이터베이스

  • 관계형 데이터베이스
  • 비관계형 데이터베이스
  • 레플리카

데이터베이스

  • 데이터를 저장하고, 요청 시 해당 데이터를 찾아서 제공한다.
  • 데이터베이스 검색 성능이 낮을 때, 좀 더 효율적이게 특정 키의 값을 확인하고 제공하기 위해 인덱스를 이용한다.
  • 인덱스를 사용하지 않으면 요청받은 데이터를 찾기 위해 전체 데이터 베이스를 스캔해야하는 문제가 발생한다.
  • 특정 기준으로 인덱싱 되어 있다면, 인덱싱 후 검색 시 효율성이 증가한다.
  • 인덱스 
    - 데이터베이스에 저장된 기본데이터에서 파생된 부가적인 메타데이터 (복사본)
    - 원하는 데이터의 위치를 찾는데 도움을 주는 이정표 역할 (ex. 목차)
    - 인덱스의 추가 삭제는 허용되지만, 데이터베이스의 내용에는 영향을 주지 않고, 쿼리 성능에만 영향을 준다.
    - 쿼리 성능이 저하되는 이유는 쿼리 문을 통해 데이터 검색을 하면 데이터를 빨리 찾을 수 있게 해주는게 인덱스인데,
      인덱스가 없어지면 데이터를 찾는 속도가 줄어들 수 있기 때문이다.

관계형 데이터베이스 (SQL)

  • 테이블의 구조와 데이터 타입을 사전에 정의하고, 테이블에 정의된 내용에 알맞는 형태의 데이터만 삽입할 수 있다.
  • 테이블 간의 관계를 직관적으로 파악할 수 있다.
  • 행과 열로 구성된 테이블에 데이터를 저장한다.
    - 열 (column) : 데이터 속성에 대한 정보 저장
    - 행 (row) : 각 열의 데이터 형식에 맞는 데이터 저장
  • SQL을 활용하여 원하는 정보를 쿼리할 수 있으며, *스키마가 뚜렷하게 보인다.
    - SQL : 구조화된 쿼리 언어 / 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있다.
    - 스키마 (schema) : 데이터가 구성되고 저장되는 방식을 정의하는 구조 또는 프레임워크
    - 쿼리 (query) : 데이터를 검색어로 필터하기 위한 질의문
  • 대표적 RDB : MySQL, Oracle, SQLite, MariaDB 등

비관계형 데이터베이스 (NoSQL)

  • 데이터가 고정되어 있지 않은 데이터베이스
  • shema-on-read : 데이터를 읽어올 때 스키마에 따라 데이터를 읽어온다.
  • 데이터를 입력하는 방식에 따라, 데이터를 읽어올 때 영향을 미친다.
  • 대표적 DB : MongoDB, Casandra

SQL vs NoSQL

종류 SQL NoSQL
데이터 저장 (Storage) SQL을 이용해서 저장 / 미리 작성된 스키마를
기반으로 정해진 형식에 맞게 저장
key-value, documemt, wide column, graph
등의 방식으로 저장
스키마 (Schema) 고정된 형식의 스키마
데이터 속성별로 열에 대한 정보를 미리 지정
데이터베이스를 전체 수정하는 경우
오프라인으로 전환할 필요가 있다.
동적으로 스키마 형태를 관리
행을 추가할 때 즉시 새로운 열을 추가할 수 있고,
개별 속성에 대해 모든 열에 대한 데이터를 
반드시 입력하지 않아도 된다.
쿼리 (Querying) 테이블 형식과 관계에 맞춰
정보를 요청하는 질의문
데이터 그룹 자체를 조회하는 것에 초점을 둔다.
UnQL로 데이터 요청
UnQL : 구조화 되지 않은 쿼리 언어
확장성 (Scalability) 수직 확장 수평 확장

레플리카 (Replica)
- 데이터베이스의 복사본을 저장하는 각각의 노드
- 원본이 되는 데이터베이스와 같은 데이터를 다른 위치에 존재하는 여러 노드에 유지하는 방식


특징

  • 시스템 장애가 발생하면 다른 레플리카를 새로운 리더로 연결하여 가용성을 확보한다.
  • 사용자의 요청이 하나의 데이터베이스에 집중될 경우, 레플리카를 읽기 전용 데이터베이스로 활용할 수 있다.
    이렇게 되면 사용자 트래픽이 각 데이터베이스로 분산되기 때문에 성능향상에 도움을 준다.
  • 레플리카의 위치를 각 지역에 분산시키면 거리에 의한 지연 시간을 감소시킬 수 있다.
  • 레플리카들의 데이터베이스가 정확히 같은 데이터를 가지고 있게 해야 한다.

데이터베이스를 레플리카에 복제하는 방법

  • 동기식 복제 : 리더의 데이터 처리와 별개로 레플리카에서의 데이터 처리까지 모두 완료되어야 프로세스가 진행된다.
    - 프로세스가 완료되면, 레플리카와 리더 DB가 일관성 있게 최신 데이터 복사본을 가지고 있는 것을 보장할 수 있다.
    - 레플리카가 데이터 처리 작업을 완료할 수 없는 경우, 리더 DB도 프로세스를 진행하기 못한다. 그 경우 리더는 모든
      쓰기를 차단하고 동기 레플리카가 회복되기를 기다리기 때문에 시스템 운영이 멈출 수 있다.
  • 비동기식 복제 : 동기와 다르게 레플리카의 처리 응답을 기다리지 않고 리더 DB가 자신의 작업을 완료하면 바로 응답한다.
    - 레플리카가 처리를 지속할 수 없더라도 리더는 쓰기 처리를 계속할 수 있다.
    - 레플리카가 읽기 전용으로 이용되고 있을 경우 사용자에게 리더와 같은 응답을 주지 못하거나, 데이터 불일치가
      발생할 수 있고, 불일치 상태가 길어지면 큰 문제가 될 수 있다.
    - 리더가 복구할 수 없는 상황이 발생하면 팔로워에게 복제되지 못한 모든 처리가 유실될 수 있으며, 클라이언트에게는
      정상 작동을 알린 이후여도 지속성을 보장하지 못하는 문제가 발생할 수 있다.
  • 반동기식 복제 : 동기식과 비동기식을 나누어 사용한다.


파티셔닝

 

  • 데이터를 작은 범위로 나누어 요청 데이터에 해당하는 파티션에만 접근하여 정보를 조회할 수 있어, 성능 저하를 피할 수 있다.
  • 쏠림 현상을 방지하기 위해 일반적으로 파티셔닝과 복제는 함께 사용된다.
  • 쏠림 현상 : 일정 파티션에 요청이 몰리는 현상 (핫스팟 : 불균형하게 부하가 높아진 파티션)
  • 파티셔닝을 진행할 때는 각 서비스의 목적에 따라 검색 효율성을 높이는 것이 좋을지, 핫스팟 발생을 방지하는 것이 좋을지, 균형을 유지할 수 있는 적절한 방법을 구현해야 한다.

캐싱 - 동일 데이터의 잦은 조회

 

  • 캐시 (Cache) : 임시로 복제된 데이터를 저장하는 장소로 사용자가 더 효율적이고 빠르게 원하는 데이터에 접근할 수 있게 하기 위해 설정된다.
  • 사용자의 요청이 반복되는 데이터를 빠르게 제공하기 위해서 캐시를 활용하면, 원본 데이터가 존재하는 데이터베이스에 액세스 하는 것보다 훨씬 빠른 속도로 데이터를 제공하면서 전반적인 애플리케이션 환경이 개선된다.
  • 캐시를 사용하며 원본 데이터베이스에 대한 쿼리 수를 줄이고, 데이터베이스 자체를 스케일링 할 필요성을 낮추면, 성능 향상과 더블어 비용을 절감하는 효과를 낼 수 있다.

캐시 타입

  • Cache-aside : 먼저 캐시에서 원하는 데이터를 검색하여, 데이터가 캐시에 존재하지 않으면 데이터베이스에 직접 연결하도록 코드를 구성하고, 데이터베이스에서 직접 데이터를 확보했다면 애플리케이션은 해당 데이터를 캐시에 복사한다. 읽기 처리가 많은 워크로드에 적합한 캐시 방법이다.
  • Read-through / Write-through Cache : 데이터베이스와 일렬로 배치되며, 캐시를 주 데이터 저장소처럼 취급한다. 데이터의 일관성을 보장하며, 애플리케이션 코드를 단순화하고 원본 데이터베이스에 전달되는 요청을 최소화할 수 있다.
    - Read-through를 통해 읽기 요청이 발생하면, 최초 데이터를 로드할 때만 캐시가 데이터베이스에 접근한다.
      읽기 처리가 많은 워크로드에 적합한 캐시 방법이다.
    - Write-through를 통해 쓰기 요청이 발생하면, 캐시에 데이터를 추가한 뒤 데이터베이스에도 데이터를 추가한다.
      항상 최신 상태를 유지하며 데이터 일관성을 보장 받을 수 있다.
  • Write-behind / write-back Cache : 일단 캐시에 데이터를 저장하여 캐시가 백그라운드에서 비동기 방식으로 데이터를 기록한다. 쓰기가 완료되는 것을 기다릴 필요 없이 다음 작업을 진행할 수 있다.
    쓰기처리가 많은 워크로드에 적합한 캐시 방법이다. 

스트림 처리 - 배치 작업에 따른 성능 저하

 

  • 데이터 배치작업 : 유입되는 데이터를 실시간 처리가 아닌 특정량 또는 특정기간 모아서 한번에 처리함. (일괄 처리)
  • 단점
    - 예약된 일이 순차적으로 실행되기 때문에 앞선 프로그램의 실행이 끝나야 뒤에 등록된 데이터가 실행된다.
    - CPU가 필요없는 시간대에도 응용 프로그램이 CPU를 점유하고 있을 수 있어, 총 실행 시간이 오래걸릴 수 있다.
    - 성능 저하의 핵심은 CPU나 메모리 부하가 아닌 비효율적인 I/0 때문이다.

  • 데이터 스트림 처리 : 스트리밍 데이터를 실시간으로 분석하며, 데이터의 크기를 알 수 없고 무한하고 연속적일 때 사용 된다.
    - 데이터 출력 속도는 데이터 입력 속도만큼 빠르며, 스트림 프로세서는 데이터를 몇 번의 패스로 처리한다.
    - 데이터가 생성되자마자 분석 시스템에 하나씩 데이터가 공급된다. 
  • 특징
    - 시간에 민감하여 특정 시간이 지나면 중요성을 잃게 되기 때문에 짧은 시간에 분석 및 처리 되어야 한다.
    - 데이터 스트림은 연속적이고 실시간으로 발생하지만 시스템 요구사항에 따라 항상 그 순간에 실행되지는 않는다.
    - 스트림 데이터는 서로 다른 소스에서 오는 경우가 많아서 소스의 불일치로 인해 다양한 형식이 포함되어 있을 수 있다.
    - 다양성과 전송 매키너짐의 차이로 데이터 요소가 누락되거나 손상될 수 있고, 요소가 순서대로 도착하지 않을 수 있다.
    - 실시간으로 이루어지기 때문에 데이터 스트림은 휘발성이 높다.  반복적인 데이터 전송이 어렵고, 새 데이터는 마지막
      데이터와 동일하지 않을 수 있다. 

  • 효율적인 DB 처리 방법 / 데이터 배치 처리 vs 데이터 스트림 처리
- Batch Stream
데이터 크기 방대한 양의 미사용 데이터 개별적이거나 소수의 기록
데이터 범위 사용 가능한 모든 데이터 최신 이벤트
성능 높은 지연 시간 (hour ~ day) 짧은 지연 시간 (msec ~ sec)
분석 대규모 데이터 세트에 복잡한 분석 간단한 분석, 실시간 응답
사용 예 은행 업무, 정산시스템 실시간 운송추적, 결제처리 시스템
서버 및 애플리케이션 로그

이벤트 : 상태 변화, 중대한 사건 발생 / 이벤트 기반 아키텍처

  • 조직이 실시간으로 변화에 대응하여 의사 결정을 내릴 수 있는 유연한 시스템을 확보할 수 있도록 지원한다.
  • 이벤트 생성자 : 이벤트를 감지하며 메시지로 해당 이벤트를 나타낸다. 이벤트 소비자 또는 이벤트 결과를 알지 못한다.
  • 이벤트 소비자 : 이벤트 발생 알림을 받으며 이벤트를 처리할 수도 있고, 영향을 받기만 할 수도 있다.

'Devops Bootcamp' 카테고리의 다른 글

[30. March] 데이터 파이프라인 / TIL #1  (0) 2023.03.30
[29. March] 발표 / TIL  (0) 2023.03.29
[24. March] WAS Web Server / TIL  (0) 2023.03.24
[23. March] HTTPS / TIL #2  (0) 2023.03.23
[23. March] REST API / TIL #1  (0) 2023.03.23
Comments