본문 바로가기

(18)

[Database] - Index(인덱스)

Index (인덱스) 목적 RDBMS에서 검색 속도를 높이기 위한 기술 테이블의 컬럼을 색인화한다. 마치, 두꺼운 책의 목차와 같다고 생각하면 편하다. 데이터베이스 안의 레코드를 처음부터 풀 스캔하지 않고, B+ Tree로 구성된 구조에서 Index 파일 검색으로 속도를 향상시키는 기술이다. 파일 구성 테이블 생성 시, 3가지 파일이 생성된다. FRM: 테이블 구조가 저장되어 있는 파일 MYD: 실제 데이터가 있는 파일 MYI: Index 정보가 들어있는 파일(Index 사용 시 생성) 사용자가 쿼리를 통해 Index를 사용하는 컬럼을 검색하게 되면, 이때 MYI 파일의 내용을 활용한다. (INDEX를 사용하지 않는 경우, MYI 파일은 비어져 있다) 장점 키 값을 기초로 하여 테이블에서 검색과 정렬 속..

[Database] - Key

Key Key란? : 검색, 정렬시 Tuple을 구분할 수 있는 기준이 되는 Attribute. 1. Candidate Key (후보키) 릴레이션을 구성하는 속성들 중에서 Tuple을 유일하게 식별할 수 있는 속성들의 부분 집합을 의미한다. (기본키로 사용할 수 있는 속성들을 후보키라 한다) 모든 릴레이션은 반드시 하나 이상의 후보 키를 가져야 한다. 릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 만족시켜야 한다. Tuple을 유일하게 식별하기 위해 사용하는 속성들의 부분 집합. (기본키로 사용할 수 있는 속성들) 2가지 조건 만족 유일성: Key로 하나의 Tuple을 유일하게 식별할 수 있음 최소성: 꼭 필요한 속성으로만 구성 2. Primary Key (기본키) 후보키 중 선택한 Main Ke..

[Database] - Redis

Redis 보통 데이터베이스는 하드 디스크나 SSD에 저장한다. 하지만 Redis는 메모리(RAM)에 저장해서 디스크 스캐닝이 필요없어 매우 빠른 장점이 존재함 캐싱도 가능해 실시간 채팅에 적합하며 세션 공유를 위해 세션 클러스터링에도 활용된다. RAM은 휘발성인데, 껐다키면 다 날아가지 않는가? 이를 막기위한 백업 과정이 존재한다. snapshot: 특정 지점을 설정하고 디스크에 백업 AOF(Append Only File): 명령(쿼리)들을 저장해두고, 서버가 셧다운되면 재실행해서 다시 만들어 놓는 것 데이터 구조는 key/value 값으로 이루어져 있다. (따라서 Redis는 비정형 데이터를 저장하는 비관계형 데이터베이스 관리 시스템이다) value 5가지 String(text, binary, dat..

[네트워크] - 로드 밸런싱(Load Balancing)

로드 밸런싱(Load Balancing) 둘 이상의 CPU or 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것 요즘 시대에는 웹 사이트에 접속하는 인원이 급격히 늘어나게 되었다. 따라서 이 사람들에 대해 모든 트래픽을 감당하기엔 1대의 서버로는 부족하다. 대응 방안으로 하드웨어의 성능을 올리거나(Scale-up) 여러대의 서버가 나눠서 일하도록 만드는 것(Scale-out)이 있다. 하드웨어 향상 비용이 더욱 비싸기도 하고, 여러대면 무중단 서비스를 제공하는 환경 구성이 용이하므로 Scalue-out이 효과적이다. 이때 여러 서버에게 균등하게 트래픽을 분산시켜주는 것이 바로 로드 밸런싱이다. 로드 밸런싱은 분산식 웹 서비스로, 여러 서버에 부하(Load)를 나누어주는 역할을 한다. Load Bala..

[네트워크] - 대칭키 & 공개키

대칭키 & 공개키 [대칭키 암호화] 암호화에 사용되는 키와 복호화에 사용되는 키가 동일한 암호화 기법이다. 대칭키 암호 방식으로 암호화한 정보를 누군가에게 보낼 때, 암호키도 함께 보내야 한다. 암호키 자체는 암호화가 되지 않은 평문으로 분실하거나 타인에게 노출되면 보안에 매우 취약할 수 있다. 키 전달 및 관리에 어려움이 있지만, 대칭키 암호화 방식은 암호화 연산 속도가 빠르기 때문에 효율적인 암호 시스템을 구축할 수 있다는 장점이 있다 블록 암호화, 스트림 암호화가 있다. [공개키 암호화] 대칭키 암호화 방식의 키 전달의 취약점을 해결하기 위해 나온 방식이다. 암호화에 사용하는 키와 복호화에 사용하는 키를 분리했다. 따라서 비대칭키 암호화라고도 부른다. 자신기 가지고 있는 고유한 암호키(개인키 or ..

[네트워크] - Blocking I/O & Non-Blocking I/O

I/O 작업 I/O 작업은 Input/Output의 약자이다. 주로 파일 입출력을 다룰 때, 흔히 볼 수 있다. ex) 2대 이상의 컴퓨터끼리 서로 네트워크를 통해 통신을 한다고 가정할 때, 한 컴퓨터에서 출력(send)을 하고 다른 한 컴퓨터에서 입력(read)을 받는 과정을 통해 통신할 수 있다. I/O 작업은 User Level에서 직접 진행할 수 없고, 실제 I/O 작업을 수행하는 것은 Kernel Level에서만 가능하다. User Process, Thread는 커널에게 요청하고 작업 완료 후, 커널이 반환하는 결과를 기다릴 뿐이다. Blocking Model 가장 기본적인 I/O 모델로, 리눅스에서 모든 소켓 통신은 기본 blocking으로 동작한다. I/O 작업이 진행되는 동안 유저 프로세스..

Computer Science/DB

[Database] - Index(인덱스)

728x90

Index (인덱스)

목적

RDBMS에서 검색 속도를 높이기 위한 기술

테이블의 컬럼을 색인화한다.

마치, 두꺼운 책의 목차와 같다고 생각하면 편하다.

데이터베이스 안의 레코드를 처음부터 풀 스캔하지 않고, B+ Tree로 구성된 구조에서 Index 파일 검색으로 속도를 향상시키는 기술이다.

파일 구성

테이블 생성 시, 3가지 파일이 생성된다.

  • FRM: 테이블 구조가 저장되어 있는 파일
  • MYD: 실제 데이터가 있는 파일
  • MYI: Index 정보가 들어있는 파일(Index 사용 시 생성)

사용자가 쿼리를 통해 Index를 사용하는 컬럼을 검색하게 되면, 이때 MYI 파일의 내용을 활용한다. (INDEX를 사용하지 않는 경우, MYI 파일은 비어져 있다)

장점

  • 키 값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상시킨다.
  • 인덱스를 사용하면 테이블 행의 고유성을 강화시킬 수 있다.
  • 테이블의 기본키는 자동으로 인덱스된다.
  • 필드 중에는 데이터 형식 때문에 인덱스 될 수 없는 필드도 있다.
  • 여러 필드로 이루어진(다중 필드)인덱스를 사용하면 첫 필드 값이 같은 레코드도 구분할 수 있다.

참고로 액세스에서 다중 필드 인덱스는 최대 10개의 필드를 포함할 수 있다.

단점

  • Index 생성시, .mdb 파일 크기가 증가한다.
  • 한 페이지를 동시에 수정할 수 있는 병행성이 줄어든다.
  • 인덱스 된 Field에서 Data를 업데이트하거나, Record를 추가 또는 삭제시 성능이 떨어진다.
  • 데이터 변경 작업이 자주 일어나는 경우, Index를 재작성해야 하므로 성능에 영향을 미친다.

상황 분석

  • 사용하면 좋은 경우

    • Where 절에서 자주 사용되는 Column
    • 외래키가 사용되는 Column
    • Join에 자주 사용되는 Column
  • Index 사용을 피해야 하는 경우

    • Data 중복도가 높은 Column
    • DML이 자주 일어나는 Column

DML에 취약

  1. INSERT
    • index split: 인덱스의 Block들이 하나에서 두개로 나누어지는 현상
    • 인덱스는 데이터가 순서대로 정렬되어야 한다. 기존 블록에 여유 공간이 없는 상황에서 그 블록에 새로운 데이터가 입력되어야 할 경우, 오라클이 기존 블록의 내용 중 일부를 새 블록에다가 기록한 후, 기존 블록에 빈 공간을 만들어서 새로운 데이터를 추가하게 된다.
    • 성능면에서 매우 불리하다.
      • Index split은 새로운 블록을 할당받고 Key를 옮기는 복잡한 작업을 수행한다. 모든 수행 과정이 Redo에 기록되고 많은 양의 Redo를 유발한다.
      • Index split이 이루어지는 동안 해당 블록에 대해 키 값이 변경되면 안되므로 DML이 블로킹된다.
  2. DELETE
    • 테이블에서 데이터가 DELTE될 경우, 지워지고 다른 데이터가 그 공간을 사용할 수 있다.
    • index에서 데이터가 delete될 경우, 데이터가 지워지지 않고 사용 안됨 표시만 해둔다.
    • 즉, 테이블에 데이터가 1만건 있는 경우, 인덱스에는 2만건이 있을 수 있다는 뜻이다.
    • 인덱스를 사용해도 수행 속도를 기대하기 힘들다.
  3. UPDATE
    • 인덱스에는 UPDATE 개념이 없다.
    • 테이블에 UPDATE가 발생할 경우, 인덱스에서는 delete가 먼저 발생한 후 새로운 작업의 insert 작업이 발생한다.
    • delete와 insert 두 개의 작업이 인덱스에서 동시에 일어나 다른 DML보다 더 큰 부하를 주게 된다.
728x90

'Computer Science > DB' 카테고리의 다른 글

[Database] - Injection  (0) 2020.09.25
[Database] - SQL vs NoSQL  (0) 2020.09.25
[Database] - 트랜잭션(Transaction)  (0) 2020.09.25
[Database] - Key  (0) 2020.09.25
[Database] - Redis  (0) 2020.09.25
Computer Science/DB

[Database] - Key

728x90

Key

Key란? : 검색, 정렬시 Tuple을 구분할 수 있는 기준이 되는 Attribute.

1. Candidate Key (후보키)

  • 릴레이션을 구성하는 속성들 중에서 Tuple을 유일하게 식별할 수 있는 속성들의 부분 집합을 의미한다. (기본키로 사용할 수 있는 속성들을 후보키라 한다)
  • 모든 릴레이션은 반드시 하나 이상의 후보 키를 가져야 한다.
  • 릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 만족시켜야 한다.

Tuple을 유일하게 식별하기 위해 사용하는 속성들의 부분 집합. (기본키로 사용할 수 있는 속성들)

2가지 조건 만족

  • 유일성: Key로 하나의 Tuple을 유일하게 식별할 수 있음
  • 최소성: 꼭 필요한 속성으로만 구성

2. Primary Key (기본키)

후보키 중 선택한 Main Key

특징

  • Null 값을 가질 수 없음
  • 동일한 값이 중복될 수 없음

3. Alternate Key (대체키)

후보키 중 기본키를 제외한 나머지 키 = 보조키

4. Super Key (슈퍼키)

  • 한 릴레이션 내에 있는 속성들의 집합으로 구성된 키로서 릴레이션을 구성하는 모든 튜플 중 슈퍼키로 구성된 속성의 집합과 동일한 값을 나타내지 않는다.
  • 릴레이션을 구성하는 모든 튜플에 대해서 유일성은 만족하지만, 최소성은 만족시키지 못한다.

유일성은 만족하지만, 최소성은 만족하지 못하는 키

5. Foregin Key(외래키)

  • 관계(Relation)를 맺고 있는 릴레이션 R1, R2에서 릴레이션 R1이 참조하고 있는 릴레이션 R2의 기본키와 같은 R1 릴레이션의 속성을 외래키라고 한다.
  • 외래키는 참조되는 릴레이션의 기본키와 대응되어 릴레이션 간에 참조 관계를 표현하는 데 중요한 도구로 사용된다.
  • 외래키로 지정되면 참조 테이블의 기본키에 없는 값은 입력할 수 없다 (참조 무결성의 조건)

기타

Null 값?

데이터베이스에서 아직 알려지지 않았거나, 모르는 값으로서 "해당 없음" 등의 이유로 정보 부재를 나타내기 위해 사용하는, 이론적으로 아무것도 없는 특수한 데이터를 뜻한다.

728x90

'Computer Science > DB' 카테고리의 다른 글

[Database] - Injection  (0) 2020.09.25
[Database] - SQL vs NoSQL  (0) 2020.09.25
[Database] - 트랜잭션(Transaction)  (0) 2020.09.25
[Database] - Index(인덱스)  (0) 2020.09.25
[Database] - Redis  (0) 2020.09.25
Computer Science/DB

[Database] - Redis

728x90

Redis

보통 데이터베이스는 하드 디스크나 SSD에 저장한다. 하지만 Redis는 메모리(RAM)에 저장해서 디스크 스캐닝이 필요없어 매우 빠른 장점이 존재함 캐싱도 가능해 실시간 채팅에 적합하며 세션 공유를 위해 세션 클러스터링에도 활용된다.

RAM은 휘발성인데, 껐다키면 다 날아가지 않는가?

이를 막기위한 백업 과정이 존재한다.

  • snapshot: 특정 지점을 설정하고 디스크에 백업
  • AOF(Append Only File): 명령(쿼리)들을 저장해두고, 서버가 셧다운되면 재실행해서 다시 만들어 놓는 것

데이터 구조는 key/value 값으로 이루어져 있다. (따라서 Redis는 비정형 데이터를 저장하는 비관계형 데이터베이스 관리 시스템이다)

value 5가지

  1. String(text, binary, data) - 512MB까지 저장이 가능함
  2. set (String 집합)
  3. sorted set (set을 정렬해둔 상태)
  4. Hash
  5. List (양방향 연결리스트도 가능)
728x90

'Computer Science > DB' 카테고리의 다른 글

[Database] - Injection  (0) 2020.09.25
[Database] - SQL vs NoSQL  (0) 2020.09.25
[Database] - 트랜잭션(Transaction)  (0) 2020.09.25
[Database] - Index(인덱스)  (0) 2020.09.25
[Database] - Key  (0) 2020.09.25
Computer Science/네트워크

[네트워크] - 로드 밸런싱(Load Balancing)

728x90

로드 밸런싱(Load Balancing)

둘 이상의 CPU or 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것

image

요즘 시대에는 웹 사이트에 접속하는 인원이 급격히 늘어나게 되었다.
따라서 이 사람들에 대해 모든 트래픽을 감당하기엔 1대의 서버로는 부족하다. 대응 방안으로 하드웨어의 성능을 올리거나(Scale-up) 여러대의 서버가 나눠서 일하도록 만드는 것(Scale-out)이 있다. 하드웨어 향상 비용이 더욱 비싸기도 하고, 여러대면 무중단 서비스를 제공하는 환경 구성이 용이하므로 Scalue-out이 효과적이다. 이때 여러 서버에게 균등하게 트래픽을 분산시켜주는 것이 바로 로드 밸런싱이다.

로드 밸런싱은 분산식 웹 서비스로, 여러 서버에 부하(Load)를 나누어주는 역할을 한다. Load Balancer를 클라이언트와 서버 사이에 두고, 부하가 일어나지 않도록 여러 서버에 분산시켜주는 방식이다. 서비스를 운영하는 사이트의 규모에 따라 웹 서버를 추가로 증설하면서 로드 밸런서로 관리해주면 웹 서버의 부하를 해결할 수 있다.

로드 밸런서가 서버를 선택하는 방식

  • 라운드 로빈(Round Robin): CPU 스케줄링의 라운드 로빈 방식 활용
  • Least Connections: 연결 개수가 가장 적은 서버 선택 (트래픽으로 인해 세션이 길어지는 경우 권장)
  • Source: 사용자 IP를 해싱하여 분배 (특정 사용자가 항상 같은 서버로 연결되는 것 보장)

로드 밸런서 장애 대비

서버를 분배하는 로드 밸런서에 문제가 생길 수 있기 때문에 로드 밸런서를 이중화하여 대비한다.

Active 상태와 Passive 상태

728x90
Computer Science/네트워크

[네트워크] - 대칭키 & 공개키

728x90

대칭키 & 공개키

[대칭키 암호화]

  • 암호화에 사용되는 키와 복호화에 사용되는 키가 동일한 암호화 기법이다.
  • 대칭키 암호 방식으로 암호화한 정보를 누군가에게 보낼 때, 암호키도 함께 보내야 한다. 암호키 자체는 암호화가 되지 않은 평문으로 분실하거나 타인에게 노출되면 보안에 매우 취약할 수 있다.
  • 키 전달 및 관리에 어려움이 있지만, 대칭키 암호화 방식은 암호화 연산 속도가 빠르기 때문에 효율적인 암호 시스템을 구축할 수 있다는 장점이 있다
  • 블록 암호화, 스트림 암호화가 있다.

[공개키 암호화]

  • 대칭키 암호화 방식의 키 전달의 취약점을 해결하기 위해 나온 방식이다. 암호화에 사용하는 키와 복호화에 사용하는 키를 분리했다. 따라서 비대칭키 암호화라고도 부른다.
  • 자신기 가지고 있는 고유한 암호키(개인키 or 비밀키)로만 복호화할 수 있는 암호키(공개키)를 대중에게 공개한다.
  • 공개키 암호화 방식의 진행과정
    • B 사용자는 자신의 공개키를 공개한다. 이 공개키는 암호화에 사용되는 키이며, 누구든지 열람이 가능하다. (복호화에 사용되는 키는 B 자신만 가지고 있다. 잃어버리면 안된다)
    • A 사용자는 B 사용자의 공개키로 데이터를 암호화한다.
    • 암호화된 문서를 B 사용자에게 전송한다.
    • B 사용자는 자신만의 개인키(복호화키)를 이용하여 전송받은 암호화 문서를 복호화하여 데이터를 열람한다.
  • 대칭키 암호화 방식의 키 전달 문제를 해결했지만 암호화, 복호화를 위해 복잡한 수학 연산을 수행하기 때문에 대칭키 방식에 비해 속도가 느리고 복잡하다는 단점이 있다.

공개키 기반 구조

특정 사람의 개인키와 공개키는 어떻게 생성할 것이며, 어떻게 배포할 것이고 어떻게 관리해야 하는가에 대한 이슈가 존재한다. 또한, 어떤 공개키가 특정한 사람의 공개키라는 것을 어떻게 보장할 수 있는지에 대한 이슈도 존재한다.

이를 해결하기 위해 디지털 인증서도 도입했고 이를 활용하는 소프트웨어, 하드웨어, 정책, 제도, 사용자 등을 총칭해서 공개키 기반 구조라고 한다.

대칭키와 공개키 암호화 방식을 적절히 혼합해보면?

SSL 탄생의 시초가 됨

1. A가 B의 공개키로 암호화 통신에 사용할 대칭키를 암호화고 B에게 보냄
2. B는 암호문을 받고, 자신의 비밀키로 복호화함.
3. B는 A로부터 얻은 대칭키로 A에게 보낼 평문을 암호화하여 A에게 보냄 
4. A는 자신의 대칭키로 암호문을 복호화함
5. 앞으로 이 대칭키로 암호화를 통신함

즉, 대칭키를 주고받을 때만 공개키로 암호화 방식을 사용하고 이후에는 계속 대칭키 암호화 방식으로 통신하는 것!

728x90
Computer Science/네트워크

[네트워크] - Blocking I/O & Non-Blocking I/O

728x90

I/O 작업

  • I/O 작업은 Input/Output의 약자이다. 
  • 주로 파일 입출력을 다룰 때, 흔히 볼 수 있다. 
  • ex) 2대 이상의 컴퓨터끼리 서로 네트워크를 통해 통신을 한다고 가정할 때, 한 컴퓨터에서 출력(send)을 하고 다른 한 컴퓨터에서 입력(read)을 받는 과정을 통해 통신할 수 있다. 
  • I/O 작업은 User Level에서 직접 진행할 수 없고, 실제 I/O 작업을 수행하는 것은 Kernel Level에서만 가능하다. 
  • User Process, Thread는 커널에게 요청하고 작업 완료 후, 커널이 반환하는 결과를 기다릴 뿐이다. 

Blocking Model 

가장 기본적인 I/O 모델로, 리눅스에서 모든 소켓 통신은 기본 blocking으로 동작한다. 
I/O 작업이 진행되는 동안 유저 프로세스는 자신의 작업을 중단한 채 대기하는 방식이다. 

위의 그림처럼 

  1. 유저는 커널에게 read 작업을 요청
  2. 데이터가 입력될 때까지 대기
  3. 데이터가 입력되면 유저 (커널 -> 유저)에게 결과가 전달되어야만 유저 자신의 작업에 비로소 복귀할 수 있다. 
    * 말 그대로 block이 되고, 어플리케이션에서 다른 작업을 수행하지 못하고 대기하게 되므로 자원이 낭비된다. 

Non-Blocking Model 

위와 같은 blocking 방식의 비효율성을 극복하고자 도입된 방식이다. 
I/O 작업이 진행되는 동안 유저 프로세스의 작업을 중단시키지 않는 방식이다. 

How to 

  1. 유저가 커널에게 read 작업을 요청 
  2. 데이터가 입력되었든 입력되지 않았든 요청하는 그 순간, 바로 결과가 반환된다. 
    * 이때, 입력 데이터가 없으면 입력 데이터가 없다는 결과 메시지를 반환한다.
  3. 입력 데이터가 있을 때까지 1 ~ 2번을 반복. (2번에서 결과 메시지를 받은 유저는 다른 작업 진행이 가능하다.)
  4. 입력 데이터가 있으면 유저(커널 -> 유저)에게 결과가 전달된다. 
    1. 이 경우 I/O의 진행시간과 관계가 없기 때문에(대기X) 어플리케이션에서 작업을 오랜 시간 중지하지 않고도 I/O 작업을 진행할 수 있다. 
    2. 그러나 반복적으로 시스템 호출이 발생하기 때문에 이 경우 역시 자원이 낭비된다. 
728x90