NoSQL 박훈 2013.08.13
[ ] 1. NoSQL 2. Mongo DB Contents
Not Only SQL What is NoSQL? 기존의 RDBMS 의 한계를 극복하기 위한 비관계형 DB로 분산시스템을 기반으로 한 수평적 확장성을 특징으로 함 데이터 량의 급격한 증가 > RDBMS는 확장이 어렵다. > 수직적확장 비용이 비싸다. 사용자의 데이터 요구가 다양 > 저장할 데이터 형태가 변화 > 비정형 데이터 저장 불가 RDBMS에 필요 없는 특성이 존재 > UPDATE, DELETE > JOIN > ACID 트랜잭션 > 고정된 스키마 Not Only SQL Update와 Delete는 전통적으로 정보의 손실이 발생하기 때문에 잘 사용되지 않으며 후에 데이터 검사 및 재활성화를 위해서 기록해둘 필요가 있습니다. 그리고 사용자가 커뮤니티를 탈퇴한다고 그들의 글을 지우지 않듯이 도메인 관점에서는 실제로 삭제되지 않습니다. 이런 접근을 하게 되면 Update / Delete를 모두 Insert로 모델할수 있고 과거 데이터는 버전을 붙혀서 기록할 수 있으며 이 데이터들은 비활성데이터들이 됩니다. 이 INSET-only 시스템에서는 2개의 문제가 있는데 데이터베이스에서 종속(cascade)에 대한 트리거를 이용할 수 없으며 Query가 비활성 데이터를 걸러내야 할 필요가 있습니다. JOIN 데이터가 많을 때 JOIN은 많은 양의 데이터에 복잡한 연산을 수행해야 하기 때문에 비용이 많이 들며 파티션을 넘어서는 동작되지 않기 때문에 피해야 합니다. 정규화는 일관된 데이터를 가지기 쉽게 하고 스토리지의 양을 줄이기 위해서 하는건데 반정규화(De-normalization)를 하면 JOIN문제를 피할 수 있습니다. 반정규화로 일관성에 대한 책임을 디비에서 애플리케이션으로 이동시킬수 있는데 이는 INSERT-only라면 어렵지 않습니다. ACID 트랜젝션 Atomic (원자성) : 여러 레코드를 수정할 때 원자성은 필요없으며 단일키 원자성이면 충분합니다. Consistency (일관성) : 대부분의 시스템은 C보다는 P나 A를 필요로 하기 때문에 엄격한 일관성을 가질 필요는 없고 대신 결과의 일관성(Eventually Consistent )을 가질 수 있습니다. Isolation (격리성) : 읽기에 최선을 다하는(Read-Committe) 것 이상의 격리성은 필요하지 않으며 단일키 원자성이 더 쉽습니다. Durability (지속성) : 각 노드가 실패했을때도 이용되기 위해서는 메모리가 데이터를 충분히 보관할 수 있을정도로 저렴해지는 시점까지는 지속성이 필요합니다. 고정된 스키마 RDBMS에서는 데이터를 사용하기 전에 스키마를 정의해야하고 Index등을 정의해야 하는데 현재의 웹환경에서는 빠르게 새로운 피쳐를 추가하고 이미 존재하는 피쳐를 조정하기 위해서는 스키마 수정이 필수적으로 요구됩니다. 하지만 컬럼의 추가/수정/삭제는 row에 lock을 걸고 index의 수정은 테이블에 락을 걸기 때문에 스키마 수정이 어렵습니다.
What is NoSQL? – Cap Theorem 데이터베이스는 Availability, Consistency, Partitioning 세가지 중 두 가지만 만족시킬 수 있다. Consistency Availability Partition Tolerance 일관성 : 모든 사용자들에게 같은 시간에 같은 데이터를 보여 주어야 한다 유효성 : 모든 클라이언트 들이 읽기 및 쓰기가 가능해야 한다. 즉, 하나의 노드가 장애가 일어 나더라도 다른 노드에는 영향을 미치면 안된다. 분산가능 : 물리적 네트워크 분상 환경에서 시스템 동작이 원할하게 이루어 져야 한다. 즉, 네트워크 전송 중 데이터 손실 상황이 와도 시스템은 정상적으로 동작을 해야한다
Why NoSQL? NoSQL은 기존의 RDBMS의 한계를 극복 NoSQL은 데이터간 관계를 정의하지 않는다. > 고정되지 않은 테이블 스키마로 테이블간 Join도 불가능하다. RDBMS에 비해 대용량의 데이터를 저장할 수 있다. 분산형 구조로, 비용이 저렴하고 장애 발생시 대처가 유연하다. > 하나의 고성능 머신에 DB를 구축하는것이 아니라, 일반적인 서버 수십대를 연결해 데이터를 저장, 처리한다. 하지만.. > RDBMS는 자체적으로 무결성을 지원하기 위한 방법이 있지만 NoSQL은 어플리케이션 단에서 모든 무결성을 보장해야 한다. > Schemaless 이므로, Join과 같은 복잡한 형태의 데이터 조회가 어렵다. Update와 Delete는 전통적으로 정보의 손실이 발생하기 때문에 잘 사용되지 않으며 후에 데이터 검사 및 재활성화를 위해서 기록해둘 필요가 있습니다. 그리고 사용자가 커뮤니티를 탈퇴한다고 그들의 글을 지우지 않듯이 도메인 관점에서는 실제로 삭제되지 않습니다. 이런 접근을 하게 되면 Update / Delete를 모두 Insert로 모델할수 있고 과거 데이터는 버전을 붙혀서 기록할 수 있으며 이 데이터들은 비활성데이터들이 됩니다. 이 INSET-only 시스템에서는 2개의 문제가 있는데 데이터베이스에서 종속(cascade)에 대한 트리거를 이용할 수 없으며 Query가 비활성 데이터를 걸러내야 할 필요가 있습니다. JOIN 데이터가 많을 때 JOIN은 많은 양의 데이터에 복잡한 연산을 수행해야 하기 때문에 비용이 많이 들며 파티션을 넘어서는 동작되지 않기 때문에 피해야 합니다. 정규화는 일관된 데이터를 가지기 쉽게 하고 스토리지의 양을 줄이기 위해서 하는건데 반정규화(De-normalization)를 하면 JOIN문제를 피할 수 있습니다. 반정규화로 일관성에 대한 책임을 디비에서 애플리케이션으로 이동시킬수 있는데 이는 INSERT-only라면 어렵지 않습니다. ACID 트랜젝션 Atomic (원자성) : 여러 레코드를 수정할 때 원자성은 필요없으며 단일키 원자성이면 충분합니다. Consistency (일관성) : 대부분의 시스템은 C보다는 P나 A를 필요로 하기 때문에 엄격한 일관성을 가질 필요는 없고 대신 결과의 일관성(Eventually Consistent )을 가질 수 있습니다. Isolation (격리성) : 읽기에 최선을 다하는(Read-Committe) 것 이상의 격리성은 필요하지 않으며 단일키 원자성이 더 쉽습니다. Durability (지속성) : 각 노드가 실패했을때도 이용되기 위해서는 메모리가 데이터를 충분히 보관할 수 있을정도로 저렴해지는 시점까지는 지속성이 필요합니다. 고정된 스키마 RDBMS에서는 데이터를 사용하기 전에 스키마를 정의해야하고 Index등을 정의해야 하는데 현재의 웹환경에서는 빠르게 새로운 피쳐를 추가하고 이미 존재하는 피쳐를 조정하기 위해서는 스키마 수정이 필수적으로 요구됩니다. 하지만 컬럼의 추가/수정/삭제는 row에 lock을 걸고 index의 수정은 테이블에 락을 걸기 때문에 스키마 수정이 어렵습니다.
There is.. NoSQL은 데이터 저장 구조에 따라 4종류로 나눌 수 있다. Key-Value, Document, Column Family, Graph ey/Value Store의 확장된 형태로, 기본적으로는 Key/Value Store이다. Key에 해당하는 Value 필드에 데이타를 저장하는 구조는 같으나, 저장되는 Value의 데이타 타입이 Document 라는 타입을 사용하는데, Document 타입은 MS-WORD와 같은 문서를 이야기 하는것이 아니라, XML,JSON,YAML과 같이 구조화된 데이타 타입으로, 복잡한 계층 구조를 표현할 수 있다. Key/Value Store의 확장된 형태로 Key/Value Store와 데이타 저장 방식은 동일하나, 데이타가 내부적으로 Key를 순서로 Sorting되서 저장된다.
There is.. 데이터 모델 제품 언어 설명 Column, Column Family HBase Java 하둡 기반에서 동작하고, 다양한 하둡 도구와 상호 운영성이 좋다. 아파치 라이선스. Cassandra 구글 BigTable 데이터 모델과 Dynamo의 분산 기술을 결합해 구현. 아파치 라이선스. Document MongoDB C++ 설치 개발이 매우 쉽고, 빠른 성능을 제공. JSON과 같이 웹서비스 영역에서 많이 활용되는 데이터를 바로 저장, 접근할 수 있는 다양한 언어의 API를 제공한다는 강점. PaaS와 같은 플랫폼 클라우드에서 기본적으로 지원. Key / Value DynamoDB Unknown 최근 아마존이 클라우드 기반으로 공개한 NoSQL 데이터베이스. Graph Neo4J C++, Java 속성을 가진 노드와의 관계 정보를 저장, 처리하고 ACID 트랜잭션을 지원하는 데이터베이스다. 시멘틱 웹에서 곧잘 얘기하는 RDF정보를 저장 처리하는데 최적이라 할 수 있으며 이를 위한 SparQL라는 질의 도구도 제공. 월드와이드웹(WWW)에서의 정보검색은 사람의 해석과 판단을 요구한다. 만약 검색엔진에 `술'을 입력했다면 이 단어가 포함된 수없이 많은 웹문서가 나온다. 이의 대부분은 필요치 않은 문서인 경우가 많다. 검색자는 문서 하나 하나를 열어 확인하면서 원하는 정보를 재차 확인하는 번거로움을 감내해야 한다. 사람이 눈으로 보고 이해해야 하는 웹인 셈이다. 여기서 한발 더 나아가 컴퓨터가 이해할 수 있는 웹을 만들려는 시도가 활발히 이뤄지고 있다. `시맨틱 웹'(Semantic Web)은 생각하는 웹이다. 텍스트 위주에서 벗어나 단어의 유사성과 상관관계 등을 파악해서 결과물을 보여주려는 것이다. 웹 상에서의 그림, 문서 등의 모든 객체를 대상으로 에이전트라는 소프트웨어를 이용해 목적에 맞는 정보를 수집ㆍ가공ㆍ응용까지 시도한다. 인간의 언어를 이해하고 어떤 측면에서는 인간과 의사소통을 하는 똑똑한 웹기술이다. 자원 속성 표현의 세분화로 인해 자원에 대한 좀 더 정교한 기술이 가능해지고, 자원들 간의 관계 설정이 속성(Predicate)를 통해 무한으로 가능하게 되어진다.