DBMS는 데이터베이스 내 데이터에 접근하도록 도와주는 시스템입니다. DBMS는 크게 질의처리기와 저장시스템으로 이루어져 있습니다.
DBMS는 각 제품마다 구조가 다르기는 하지만, 크게 질의 처리기(Query Processor)와 저장 시스템(Storage System)으로 나눠볼 수 있습니다. MySQL의 경우에는 InnoDB, MyISAM 등과 같이 여러 하부 저장 시스템을 선택할 수 있는데, 이와 같은 모델은 상부의 질의 처리기와 하부의 저장 시스템 간의 명확하게 구분되는 계층(layered) 구조에 해당됩니다. CUBRID 역시 질의 처리기와 저장 시스템 두 개의 구성 요소로 이루어져 있으며, 질의 처리기와 저장 시스템이 좀 더 밀접하게 연결되어 있습니다.
사용자가 원하는 작업을 가장 효과적으로 실행 할 수 있는 최적의 경로를 선택해서 자동으로 프로시저를 생성해주는 DBMS의 핵심엔진입니다. 종류로는 비용기반 옵티마이저와 규칙기반 옵티마이저가 있습니다.
비용기반 옵티마이저
- 말그대로 실행계획에 따른 비용을 기반으로 최적화를 수행하는 옵티마이저 입니다.
- 비용이란 쿼리를 수행하는데 소요되는 양이나 시간을 말합니다.
규칙기반 옵티마이저
- 미리 정해 놓은 우선순위에 따라 경로를 평가하고 실행계획을 선택하는 옵티마이저 입니다.
- 중소형 데이터베이스에 적합하고, 대용량 데이터에는 다양한 변수를 고려하지 못하기 때문에 부적합 합니다.
join
- 두 개 이상의 테이블을 하나의 집합으로 만드는 연산(두 테이블 사이에서 수행) 입니다.
- 자주 사용하는 Join으는 NL Join, Sort Merge Join, Hash Join이 있습니다.
NL Join( Nested Loop Join )
- 중첩된 반복문과 유사한 방식으로 사용합니다.
- 랜덤 액세스 방식으로 데이터를 읽습니다.
- 외부 테이블의 각 행에 대해 내부 테이블을 한 번만 스캔합니다.
장점은,
처리량이 많을 때 성능상 이점이 있습니다.
단점은,
정렬에 따른 부담이 있습니다. (메모리 사용 증가)
Sort Merge Join
- 칼럼을 기준으로 데이터를 정렬하여 조인을 수행합니다.
- 스캔 방식으로 데이터를 읽습니다.
- 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않을 경우데도 사용할 수 있는 기법입니다.
- 조인 작업을 위해 항상 정렬 작업이 발생하는 것은 아닙니다.
Hash Join
- 해싱 기법을 이용하여 조인을 수행합니다.
- 조인을 수행할 테이블의 조인 칼럼을 기준으로 해쉬 함수를 수행하여, 서로 동일한 해쉬 값을 갖는 것들 사이에서 실제 값이 같은지를 비교하면서 조인을 수행합니다.
- 조인 칼럼의 인덱스를 사용하지 않기 때문에 조인 칼럼의 인덱스가 존재하지 않을 경우데도 사용할 수 있는 기법입니다.
- 해쉬 함수를 이용하여 조인을 수행하기 때문에 '='로 수행하는 조인에서만 사용가능 합니다.
- 해쉬함수를 적용한 값은 어떤 값으로 해슁될 지 알 수 없습니다.
- 해쉬 함수가 적용될 때 동일한 값은 항상 같은 값으로 보장됩니다.
- But. 큰값이 항상 큰값으로 해슁되고 작은 값이 항상 작은 값으로 해슁된다는 보장은 없습니다.
JDBC란,
Java가 Database를 사용할 수 있도록 연결해주는 응용프로그램 인터페이스인 JAVA API 입니다.
이 응용프로그램 인터페이스는 데이터베이스 관리 시스템에 넘겨질 SQL 형태의 데이터베이스 접근요구 문장을, 각 시스템에 맞도록 바꾸는 역할을 합니다.
API는 동적으로 올바른 Java 패키지를 로드하고, JDBC 드라이버 매니저에 등록하기 위한 메커니즘을 제공합니다. 드라이버 매니저가, JDBC connection을 생성하기 위한 connection factory로서 사용됩니다.ODBC는,
데이터베이스를 액세스하기 위한 표준 개방형 응용 프로그램 인터페이스를 말합니다.
마이크로소프트사에 의해 만들어진, 데이터베이스에 접근하기 위한 소프트웨어의 표준 규격으로, 프로그램 내에 ODBC 문장을 사용하면 MS-Access, dBase, DB2, Excel, Text 등의 여러 종류의 데이터베이스에 접근 할 수 있습니다.
DDL (Data Definition Language) 이란,
객체의 생성, 변경, 삭제 명령어를 뜻합니다. 예를 들어, create, alter, drop, rename 등이 있습니다. schema, domain, table, view, index를 정의, 변경, 삭제할 때 사용하는 언어입니다.
주로 데이터베이스 관리자나 데이터 베이스 설계자가 사용합니다. 데이터 정의어는 3가지 유형으로 craete, alter, drop이 있습니다.DML (Data Manipulation Language) 이란,
레코드 제어 명령어 입니다. 예를 들어, select, insert, update, delete 등이 있습니다. 데이터 베이스 사용장와 데이터 베이스 관리 시스템 간의 인터페이스를 제공합니다.
데이터 베이스 사용자가 응용 프로그램이나 질의어를 통합니다. 저장된 데이터를 실질적으로 처리하는 데 사용하는 언어입니다. 데이터 조작어는 4가지 유형으로 select, insert, delete, update가 있습니다.DCL (Data Control Language) 이란,
객체 권한 부여 등의 제어어 입니다. 데이터의 보안, 무결성, 데이터 회복, 병행 수행 제어 등을 정의하는 데 사용하는 언어입니다.
데이터 베이스 관리자가 데이터 관리를 목적으로 사용합니다. 데이터 제어어의 종류로는 commit, rollback, grant, revoke 등이 있습니다.
key란 검색, 정렬 시 tuple을 구분할 수 있는 기준이 되는 attribute입니다.
- candidate key : tuple을 유일하게 식별하기 위해 사용되는 속성들의 부분 집합입니다. key로 하나의 tuple을 유일하게 식별할 수 있는 "유일성"과 꼭 필요한 속성으로만 구성되는 "최소성" 조건을 만족합니다.
- primary key : 후보키 중 선택한 main key입니다. null 값을 가질 수 없고, 동일한 값이 중복될 수 없습니다.
- alternative key : 후보키 중 기본키를 제외한 나머지 키입니다(=보조키)
- super key : 유일성은 만족하지만, 최소성은 만족하지 못하는 키입니다.
- foreign key : 두 테이블을 서로 연결하는 데 사용하는 키입니다.
인덱스는 데이터베이스에서 조회 및 검색을 더 빠르게 할 수 있는 방법 또는 자료구조 자체를 의미합니다. select문을 사용하여 원하는 조건의 데이터를 검색할 때, 저장된 데이터의 양이 많아지면 검색을 하는데 많은 자원과 시간이 소모되는데, 이 때 도움이 되는게 인덱스입니다.
클러스터 인덱스
- 테이블당 1개씩만 허용된다.
- 물리적으로 행을 재배열한다.
- PK설정 시 그 칼럼은 자동으로 클러스터드 인덱스가 만들어진다.
- 인덱스 자체의 리프 페이지가 곧 데이터이다. 즉 테이블 자체가 인덱스이다. (따로 인덱스 페이지를 만들지 않는다.)
- 데이터 입력, 수정, 삭제 시 항상 정렬 상태를 유지한다.
- 비 클러스형 인덱스보다 검색 속도는 더 빠르다. 하지만 데이터의 입력. 수정, 삭제는 느리다.
- 30% 이내에서 사용해야 좋은 선택도를 가진다.
넌 클러스터 인덱스
- 테이블당 약 240개의 인덱스를 만들 수 있다.
- 인덱스 페이지는 로그파일에 저장된다.
- 레코드의 원본은 정렬되지 않고, 인덱스 페이지만 정렬된다.
- 인덱스 자체의 리프 페이지는 데이터가 아니라 데이터가 위치하는 포인터(RID)이기 때문에 클러스터형보다 검색 속도는 더 느리지만 - 데이터의 입력, 수정, 삭제는 더 빠르다.
- 인덱스를 생성할 때 데이터 페이지는 그냥 둔 상태에서 별도의 인덱스 페이지를 따로 만들기 때문에 용량을 더 차지한다
- 3% 이내에서 사용해야 좋은 선택도를 가진다.
UNIQUE한 값을 생성해주는 객체입니다. 시퀀스를 생성하면 PK와 같이 순차적으로 증가하는 컬럼을 자동 생성할 수 있습니다.
뷰는 테이블과 유사하지만 실제 데이터가 없는 테이블을 바라보는 매개체이자 거울과 같은 개념입니다. 테이블에서 사용자가 필요로 하는 부분만 선택하여 만들어 놓은 데이터 집합입니다. 데이터베이스에 존재하는 일종의 가상 테이블이라고 생각하면 됩니다.
뷰를 사용하는 이유는,
사용자의 편의와 데이터베이스의 보안 때문입니다. 원본 테이블에 직접 접근하지 않아도 사용자가 임의의 뷰를 구성하여 별도의 이름을 붙이거나 접근 가능한 사람을 지정할 수 있기 때문입니다.장점
- 특정 사용자에게 테이블 전체가 아닌 필요한 필드만 보여줄 수 있다.
- 복잡한 쿼리를 단순화해서 사용할 수 있다.
- 위와 같이 사용한 쿼리를 재사용할 수 있다.
단점
- 한 번 정의된 뷰는 변경이 불가능하다.
- 삽입,삭제,갱신 작업에 많은 제한 사항을 가짐
- 뷰는 자신만의 인덱스를 가질 수 없다.
DML(데이터 조작어)가 수행됐을때 데이터베이스에서 자동으로 동작하도록 작성된 프로그램.
무결성이란 데이터의 정확성, 일관성, 유효성을 유지하는 것을 말합니다. 그리고 무결성이 유지가 되어야 DB에 저장된 데이터 값과 거기에 해당하는 현실 세계의 실제값이 일치하는지 신뢰할 수 있습니다.
- 개체 무결성 : 기본키로 선택된 필드는 빈 값을 허용하지 않는다.
- 참조 무결성 : 서로 참조 관계에잇는 두 테이블의 데이터는 항상 일관된 값을 유지한다.
- 도메인 무결성 : 테이블에 존재하는 필드의 무결성을 보장하기 위한 것으로 올바른 데이터가 입력됬는지를 체크하는 것이다.
- 고유 무결성 : 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성값은 모두 고유한 값을 가진다. 같으면 안되는 것
- NULL 무결성 : 특정 속성값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성값은 NULL이 될 수 없다는 제약조건
- 키 무결성 : 한 릴레이션에는 최소한 하나의 키가 존재해야하는 제약조건
관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업입니다. 좀 더 구체적으로는 불만족스러운 나쁜 릴레이션의 애트리뷰트들을 나누어서 좋은 작은 릴레이션으로 분해하는 작업을 말합니다.
정규화 과정을 거치게 되면 정규형을 만족하게 됩니다. 정규형이란 특정 조건을 만족하는 릴레이션의 스키마의 형태를 말하며 제 1 정규형, 제 2 정규형, 제 3 정규형, … 등이 존재합니다.
1. 제 1 정규형
애트리뷰트의 도메인이 오직 원자값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 합니다. 즉, 복합 애트리뷰트, 다중값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태를 말합니다.
2. 제 2 정규형
모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속이면 제 2 정규형을 만족한다고 볼 수 있습니다.
완전 함수적 종속이란, X -> Y 라고 가정했을 때, X 의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말합니다. 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말합니다.
3. 제 3 정규형
어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있습니다.
이행 함수적 종속이란, X - >Y, Y -> Z의 경우에 의해서 추론될 수 있는 X -> Z의 종속관계를 말한다. 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태를 말합니다.
4. BCNF(Boyce-Codd) 정규형
여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용입니다. 복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 제 3 정규형을 보완하는데 의미가 있습니다. 비주요 애트리뷰트가 후보키의 일부를 결정하는 분해하는 과정을 말합니다.
어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 의존 관계를 '속성 B는 속성 A에 종속한다' 라고 하는 것을 함수적 종속성 이라 합니다.
반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나입니다.
디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나, 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 됩니다. 일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 됩니다.
- 삽입 이상(insertion anomalies) : 원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점을 말합니다.
- 삭제 이상(deletion anomalies) : 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말합니다.
- 수정(갱신)이상(modification anomalies) : 정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점을 말합니다.
해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법을 말합니다.
파티셔닝은 테이블을 컬럼 단위로 나누는 기법입니다. 파티셔닝을 사용함으로써의
- 장점은, update나 insert 같은 작업이 분산되어서 성능이 향상됩니다.
- 단점은, 테이블간 join 비용이 증가하게 되고 index를 별도로 파티셔닝할 수 없다는 단점을 가지고 있습니다.
샤딩은, 테이블을 row(가로) 단위로 분산하여 저장하는 방법입니다. 수평 파티셔닝 이라고도 불립니다.
샤드 Key를 정하는 방법에 따라서 샤드 종류가 결정되는데, 크게 Hash Sharding과 Dynamic Sharding이 있습니다.
리플리케이션(Replication)은 복제를 뜻하며 2대 이상의 DBMS를 나눠서 데이터를 저장하는 방식이며, 사용하기 위한 최소 구성은 Master / Slave 구성을 해야 합니다.
-> 여러 개의 DB를 권한에 따라 수직적인 구조(Master-Slave)로 구축하는 방식
DB를 이중화, DB 복제 라고 생각하시면 됩니다.
데이터베이스의 무결성과 일관성을 위해서 트랜잭션은 4가지 특징인 ACID를 만족해야 합니다. ACID는 각 특징의 앞글자로 만들어졌고 원자성, 일관성, 격리성, 지속성을 뜻 합니다.
- 특징 중 첫번째는 원자성으로, 한 트랜잭션내 실행한 작업은 모두 성공하거나 실패해야됩니다.
- 두번째는 일관성으로, 일관성 있는 데이터베이스 (상태)를 유지시키는 것 입니다.
- 그리고 격리성은, 동시에 실행되는 트랜잭션은 서로에게 영향을 미치지 않아야 된다는 의미입니다.
- 마지막으로 지속성은, 트랜잭션 완료시 결과가 영구적으로 반영되어야 한다는 뜻 입니다.
- 활동 (Active)
- 트랜잭션이 실행 중에 있는 상태, 연산들이 정상적으로 실행 중인 상태
- 장애 (Failed)
- 트랜잭션이 실행에 오류가 발생하여 중단된 상태
- 철회 (Aborted)
- 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- 부분 완료 (Partially Committed)
- 트랜잭션이 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
- 완료 (Committed)
- 트랜잭션이 성공적으로 종료되어 Commit 연산응 실행한 후의 상태
격리 수준이란, 트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준입니다.
- Read Uncommitted (레벨 0) = A트랜잭션 중 커밋되지 않은 데이터를 B트랜잭션에서 읽기가능
- select 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 Level
- 트랜잭션에 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다
- 따라서, 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 아직 완료되지 않은 (Uncommitted 혹은 Dirty) 트랜잭션이지만 변경된 데이터인 B를 읽을 수 있다
- 데이터베이스 일관성을 유지할 수 없다
- Read Committed (레벨 1) = A트랜잭션이 커밋하지 않는다면 B트랜잭션에서 A 데이터를 읽을 수 없다 (기본값)
- select 문장이 수행되는 동안 해당 데이터에 Shared Lock 이 걸리는 Level
- 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 된다
- Commit이 이루어진 트랜잭션만 조회할 수 있다
- 따라서, 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근 할 수 없다
- SQL Server가 Default 로 사용하는 Isolation Level
- Repeatable Read (레벨 2)
- 트랜잭션이 완료될 때까지 select 문장이 사용하는 모든 데이터에 Shared Lock 이 걸리는 Level
- 트랜잭션이 범위 내에서 조회한 데이터의 내용이 항상 동일함을 보장한다
- 따라서, 다른 사용자는 그 영역에 해당되는 데이터 대한 수정이 불가능하다
- 예) member 조회, board 조회, post 조회 시 Lock 이 걸리고, commit 또는 rollback 될 때 까지 접근 불가?
- Serializable (레벨 3)
- 트랜잭션이 완료 될 때까지 select 문장이 사용되는 모든 데이터에 Shared Lock 걸리는 Level
- 완벽한 읽기 일관성 모드를 제공한다
- 따라서, 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다
- Dirty Read
- 커밋되지 않은 수정 중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상
어떤 트랜잭션에서 아직 실행이 끝난지 않은 다른 트랜잭션에 의한 변경 사항을 보게 되는 되는 경우- Non-Repeatable Read
- 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써 두 쿼리의 결과가 상이하게 나타나는 비 일관성 현상
- Phantom Read
- 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽을 때, 첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상
이는 트랜잭션 도중 새로운 레코드가 삽입되는 것을 허용하기 때문에 나타난다.
Unified Modeling Language의 약자로 ‘객체 모델링 언어’ 또는 ‘통합 모델링 언어’를 뜻합니다. 시스템 설계, 요구분석, 시스템 구현 등의 과정에서 사용되는 모델링 언어로 표기법의 표준화를 목적으로 합니다.
시스템에 대해 동일한 의미를 공유할 수 있게 하여 언어를 가시화 시킬 수 있고 시스템 구조와 모든 상세 내역에 대해 문서화하여 모델링하는 기능들을 제공하며, 다양한 모델링 도구로서의 다이어그램들로 이루어져 있습니다.
MySQL은,
구조화된 쿼리 언어(SQL)를 기반으로 하는 무료 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)이며 웹사이트 및 애플리케이션을 위한 기본 관계형 데이터 스토리지 솔루션입니다.
PostgreSQL은 오픈 소스 객체-관계형 데이터베이스 시스템(ORDBMS)으로, Enterprise급 DBMS의 기능과 차세대 DBMS에서나 볼 수 있을 법한 기능들을 제공합니다. 다른 관계형 데이터베이스 시스템과 달리 연산자, 복합 자료형, 집계 함수, 자료형 변환자, 확장 기능 등 다양한 데이터베이스 객체를 사용자가 임의로 만들 수 있는 기능을 제공함으로써 마치 새로운 하나의 프로그래밍 언어처럼 무한한 기능을 손쉽게 구현할 수 있습니다.
SQL은 RDBMS(관계형 데이터 베이스 관리 시스템)의 데이터를 관리하기 위해서 설계된 프로그래밍 언어로, SQL을 사용하면 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색을 할 수 있습니다.
NoSQL은 Not Only SQL의 약자로, SQL을 보완한다는 의미를 가지고 있습니다. NOSQL은 스키마가 없어서 데이터를 조회하고 삽입하는 속도가 빠릅니다. 또한 대량의 분산 데이터를 저장하는데 특화 되어있습니다.
NoSQL은 최대한 단순하면서 많은 데이터, RDBMS는 복잡하면서 무결성이 중요한 데이터에 용이합니다..
- 즉, 금융, 결제와 같이 데이터 간 관계가 복잡하거나 무결성이 중요하다 그리고 데이터베이스의 ACID 성질을 준수해야한다? SQL
- 변경에 유연해야 하거나 데이터의 양이 많거나 샤딩이 필요하다면 NoSQL
데이터베이스의 구조와 제약조건에 관해 전반적인 명세를 기술한 것 입니다.
개체의 특성을 나타내는 속성(Attribute)과 속성들의 집합으로 이루어진 개체(Entity), 개체 사이에 존재하는 관계(Relation)에 대한 정의와 이들이 유지해야 할 제약조건들을 기술한 것입니다.
쉽게 정리하여, DB내에 어떤 구조로 데이터가 저장되는가를 나타내는 데이터베이스 구조를 스키마라고 합니다.
CAP 이론은 분산 데이터베이스 시스템에서 의미있는 이론입니다. 분산 데이터베이스의 세 가지 속성인 일관성(Consistency), 가용성(Availability), 네트워크 파티션 허용(Partition tolerance)을 나타냅니다. 처음 CAP 이론이 발표된 후, 시간이 지나면서 이론의 허점이 발견되었고 이를 보완하는 PACELC 이론이 나오게 되었습니다.
CP 시스템
완벽한 일관성을 갖는 분산 시스템에서 데이터 변경은 존재하는 모든 노느에 복제되어야 완료된다. 이는 가용성과 성능에 크나큰 악영향을 끼친다. 만약 하나의 노드라고 문제가 있으면 트랜잭션은 실패한다. 그리고 노드가 늘어날 수록 지연시간은 길어진다.
AP 시스템
완벽한 가용성을 갖는 분산 시스템에서는 모든 노드가 어떤 상황에서도 응답할 수 있어야 한다. 네트워크 문제가 발생해서 어떤 노드에 Replication이 제대로 이루어지지 않아도 가용성을 위해서 해당 노드에 접근한 사용자에게 데이터를 반환한다고 생각해보자. 일관성이 깨진 것은 당연하고 사용자는 문제가 발생한 것을 인지도 못할 것이다.
CA 시스템
일관성과 가용성을 동시에 완벽히 만족하려면, 네트워크 장애를 허용하지 않아야 한다. 네트워크 장애가 절대 일어나지 않는 네트워크 구성이 가능할까? 그런 것은 이 세상에 존재하지 않는다. 결국 CAP 이론은 네트워크 파티션 허용은 기본적으로 깔고 시작해야 한다. 무조건 P를 선택하고, C와 A 중 하나를 골라야 한다. 하지만, 앞서 설명한 CP, AP 시스템도 뭔가 답답하다. 어느 한쪽을 완벽히 만족하는 시스템을 구축하는 것이 아니라 일관성과 가용성을 서비스 목적에 맞게 균형잡힌 시스템을 가지고 싶다.PACELC 이론
PACELC 이론은 CAP 이론으로 부족한 부분을 보완하기위해 네트워크 장애 상황과 정상 상황으로 나누어서 설명하는 이론이다. 아래의 그림을 보자. P(네트워크 파티션)상황에서 A(가용성)과 C(일관성)의 상충 관계와 E(else, 정상)상황에서 L(지연 시간)과 C(일관성)의 상충 관계를 설명한다.
- Key-Value
- 다이나모(dynamodb), 리악(Riak), 레디스(Redis), 캐시(Cash), 프로젝트 볼드모트(Voldmort)
- Column
- H베이스, 아큐물로
- Document
- 몽고DB(MongoDB), 카우치베이스(Couchbase)
- Graph
- Neo4J, AgensGraph, 알레그로그래프, 버투오소
Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다.
데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소입니다.Redis 사용에 주의할 점으로는,
- 서버에 장애가 발생했을 경우 그에 대한 운영 플랜이 꼭 필요합니다.
: 인메모리 데이터 저장소의 특성상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문입니다.- 메모리 관리가 중요합니다.
- 싱글 스레드의 특성상, 한 번에 하나의 명령만 처리할 수 있습니다. 처리하는데 시간이 오래 걸리는 요청, 명령은 피해야 합니다.
아파치 카산드라(Apache Cassandra)는,
자유 오픈 소스 분산형 NoSQL 데이터베이스 관리 시스템(DBMS)의 하나로, 단일 장애 점 없이 고성능을 제공하면서 수많은 서버 간의 대용량의 데이터를 관리하기 위해 설계 되었습니다.
카산드라는 여러 데이터센터에 걸쳐 클러스터를 지원하며 마스터리스(masterless) 비동기 레플리케이션을 통해 모든 클라이언트에 대한 낮은 레이턴시 운영을 허용하며, 성능 면에서 높은 가치를 보입니다.
Amazon의 Dynamo 분산 스토리지 및 복제 기술과 Google의 Bigtable 데이터 및 스토리지 엔진 모델이 결합된 모델로 처음에 단계적 이벤트 기반 아키텍처 (SEDA)를 사용하여 Facebook에서 설계되었습니다.
카산드라 특징은,
- 여러개의 데이터 베이스가 복제된다. (마스터기준)
- 짧은 지연 시간
- 프로세스가 추가될 때마다 선형 처리량 증가
- 온라인 부하분산
- 분할된 키 지향 쿼리
- 유연한 스키마
Oracle은 대규모 트랜잭션 로드를 처리하고 성능을 최적화하기 위해 여러 서버에 대용량 DB분산 절차적 언어를 통해 DB에 내장된 프로그램의 작성을 지원합니다. MySQL은 단일 DB로 제한되어 있어, 매일 수백만번 액세스하는 대용량 DB에는 부적합합니다. DB를 이전 상태로 복원하는데 도움이 되는 저장점이 없고 COMMIT과 ROLLBACK만 존재합니다.