NoSQL이란 무엇입니까? 클라우드 규모의 미래를위한 데이터베이스

애플리케이션을 개발할 때 가장 기본적인 선택 중 하나는 데이터를 저장하기 위해 SQL 또는 NoSQL 데이터베이스를 사용할지 여부입니다. 기존 SQL (즉, 관계형) 데이터베이스는 수십 년간의 기술 발전, 모범 사례 및 실제 스트레스 테스트의 산물입니다. 비즈니스 애플리케이션의 필수 요소 인 신뢰할 수있는 트랜잭션 및 임시 쿼리를 위해 설계되었습니다. 그러나 그들은 또한 다른 종류의 앱에 적합하지 않게 만드는 엄격한 스키마와 같은 제한 사항도 부담합니다.

NoSQL 데이터베이스는 이러한 제한에 대응하여 탄생했습니다. NoSQL 시스템은 개발자 측에서 높은 운영 속도와 뛰어난 유연성을 허용하는 방식으로 데이터를 저장하고 관리합니다. 대규모 웹 사이트의 콘텐츠를 저장하거나 데이터를 처리하는 더 나은 방법을 모색 한 Google, Amazon, Yahoo 및 Facebook과 같은 회사에서 개발했습니다. SQL 데이터베이스와 달리 많은 NoSQL 데이터베이스는 수백 또는 수천 대의 서버에서 수평으로 확장 할 수 있습니다.

하지만 NoSQL의 장점은 비용이 들지 않습니다. NoSQL 시스템은 일반적으로 SQL 데이터베이스와 동일한 수준의 데이터 일관성을 제공하지 않습니다. 사실, SQL 데이터베이스는 전통적으로 안정적인 트랜잭션 뒤에있는 ACID 속성에 대한 성능과 확장 성을 희생했지만 NoSQL 데이터베이스는 속도와 확장 성을 위해 이러한 ACID 보증을 대체했습니다.

간단히 말해 SQL과 NoSQL 데이터베이스는 서로 다른 장단점을 제공합니다. 응용 프로그램이나 해당 응용 프로그램 을 위해 선택할 특정 프로젝트의 맥락에서 경쟁 할 수 있지만 더 큰 그림에서는 상호 보완 적입니다. 각각은 서로 다른 사용 사례에 적합합니다. 결정은 어느 도구가 작업에 적합한 지에 대한 질문이므로 둘 중 하나의 경우가 아닙니다.

NoSQL 대 SQL

SQL과 NoSQL의 근본적인 차이점은 그다지 복잡하지 않습니다. 각각은 데이터를 저장하고 검색하는 방법에 대한 철학이 다릅니다.

SQL 데이터베이스를 사용하면 모든 데이터에 고유 한 구조가 있습니다. Microsoft SQL Server, MySQL 또는 Oracle Database와 같은 기존 데이터베이스 는 데이터베이스에 삽입되는 데이터가 구성되는 방식에 대한 공식적인 정의 인 스키마를 사용합니다 . 예를 들어, 테이블의 주어진 열은 정수로만 제한 될 수 있습니다. 결과적으로 열에 기록 된 데이터는 높은 수준의 정규화를 갖습니다. SQL 데이터베이스의 엄격한 스키마는 예를 들어 JOIN을 통해 데이터에 대한 집계를 비교적 쉽게 수행 할 수 있도록합니다.

NoSQL을 사용하면 데이터를 스키마없이 또는 자유 형식으로 저장할 수 있습니다. 모든 데이터는 모든 레코드에 저장할 수 있습니다. NoSQL 데이터베이스 중 데이터 저장을위한 네 가지 공통 모델을 찾을 수 있으며, 이는 네 가지 일반적인 유형의 NoSQL 시스템으로 이어집니다.

  1. 문서 데이터베이스 (예 : CouchDB, MongoDB). 삽입 된 데이터는 자유 형식 JSON 구조 또는 "문서"의 형태로 저장되며, 여기서 데이터는 정수에서 문자열, 자유 형식 텍스트에 이르기까지 다양합니다. 문서에 포함될 필드 (있는 경우)를 지정할 필요는 없습니다.
  2. 키-값 저장소 (예 : Redis, Riak). 단순한 정수 또는 문자열에서 복잡한 JSON 문서에 이르기까지 자유 형식 값은 키를 통해 데이터베이스에서 액세스됩니다.
  3. 넓은 열 저장소 (예 : HBase, Cassandra). 데이터는 기존 SQL 시스템에서와 같이 행이 아닌 열에 저장됩니다. 쿼리 또는 데이터보기에 필요한만큼 원하는 수의 열 (및 다양한 유형의 데이터)을 그룹화하거나 집계 할 수 있습니다.
  4. 그래프 데이터베이스 (예 : Neo4j). 데이터는 네트워크 또는 엔티티와 그 관계의 그래프로 표현되며 그래프의 각 노드는 자유 형식의 데이터 청크입니다.

스키마없는 데이터 저장소는 다음 시나리오에서 유용합니다.

  1. 데이터에 대한 빠른 액세스를 원하며 안정적인 트랜잭션 또는 일관성보다 액세스의 속도와 단순성에 더 관심이 있습니다.
  2. 많은 양의 데이터를 저장하고 있으며 나중에 스키마를 변경하면 느리고 고통 스러울 수 있으므로 스키마에 자신을 고정하고 싶지 않습니다.
  3. 이를 생성하는 하나 이상의 소스에서 비정형 데이터를 가져오고 최대한의 유연성을 위해 데이터를 원래 형식으로 유지하려고합니다.
  4. 데이터를 계층 구조로 저장하고 싶지만 이러한 계층이 외부 스키마가 아닌 데이터 자체에 의해 설명되기를 원합니다. NoSQL을 사용하면 SQL 데이터베이스가 에뮬레이션하기가 더 복잡한 방식으로 데이터가 자연스럽게 자체 참조 될 수 있습니다.

NoSQL 데이터베이스 쿼리

기존 데이터베이스에서 사용하는 구조적 쿼리 언어는 데이터를 저장하고 검색 할 때 서버와 통신하는 일관된 방법을 제공합니다. SQL 구문은 고도로 표준화되어 있으므로 개별 데이터베이스가 특정 작업 (예 : 창 기능)을 다르게 처리 할 수 ​​있지만 기본은 동일하게 유지됩니다.

대조적으로, 각 NoSQL 데이터베이스는 데이터 쿼리 및 관리를위한 자체 구문을 갖는 경향이 있습니다. 예를 들어 CouchDB는 HTTP를 통해 전송 된 JSON 형식의 요청을 사용하여 데이터베이스에서 문서를 생성하거나 검색합니다. MongoDB는 명령 줄 인터페이스 또는 언어 라이브러리를 통해 바이너리 프로토콜을 통해 JSON 개체를 보냅니다.

일부 NoSQL 제품 SQL과 유사한 구문을 사용하여 데이터 작업을 수행 할 수 있지만 제한된 범위에서만 가능합니다. 예를 들어, 열 저장소 데이터베이스 인 Apache Cassandra에는 고유 한 SQL 유사 언어 인 Cassandra 쿼리 언어 또는 CQL이 있습니다. CQL 구문 중 일부는 SELECT 또는 INSERT 키워드와 같이 SQL 플레이 북에서 바로 나온 것입니다. 그러나 Cassandra에서 JOIN 또는 하위 쿼리를 수행 할 방법이 없으므로 관련 키워드가 CQL에 존재하지 않습니다.

비공유 아키텍처

NoSQL 시스템에 공통적 인 설계 선택은 "비공유"아키텍처입니다. 비공유 설계에서 클러스터의 각 서버 노드는 다른 모든 노드와 독립적으로 작동합니다. 시스템은 데이터 조각을 클라이언트에 반환하기 위해 모든 단일 노드에서 합의를 얻을 필요가 없습니다. 쿼리는 가장 가까운 노드 또는 가장 편리한 노드에서 반환 될 수 있으므로 빠릅니다.

비공유의 또 다른 이점은 탄력성과 확장 성입니다. 클러스터를 확장하는 것은 클러스터에서 새 노드를 회전하고 다른 노드와 동기화되기를 기다리는 것만 큼 쉽습니다. NoSQL 노드가 다운되면 클러스터의 다른 서버가 계속해서 움직입니다. 요청을 처리하는 데 사용할 수있는 노드가 더 적더라도 모든 데이터는 계속 사용할 수 있습니다.

비공유 설계는 NoSQL 데이터베이스 에만 국한 되지 않습니다 . 대부분의 기존 SQL 시스템은 비공유 방식으로 설정할 수 있지만 일반적으로 성능을 위해 클러스터 전체의 일관성을 희생해야합니다.

NoSQL 제한

NoSQL이 많은 자유와 유연성을 제공한다면 SQL을 완전히 포기하지 않는 이유는 무엇입니까? 간단한 대답 : 많은 응용 프로그램은 여전히 ​​SQL 데이터베이스가 제공하는 종류의 제약, 일관성 및 보호 장치를 요구합니다. 이러한 경우 NoSQL의 일부 "장점"이 단점으로 바뀔 수 있습니다. 다른 제한 사항은 NoSQL 시스템이 비교적 새롭다는 사실에서 비롯됩니다. 

스키마 없음

자유 형식 데이터를 가져 오는 경우에도 거의 항상 유용하게 만들기 위해 제약 조건을 적용해야합니다. NoSQL을 사용하여 제약을 부과하려면 책임을 데이터베이스에서 애플리케이션 개발자로 이전하는 것이 포함됩니다. 예를 들어 개발자는 개체 관계형 매핑 시스템 또는 ORM을 통해 구조를 부과 할 수 있습니다. 그러나 스키마가 데이터 자체와 함께 유지 되기를 원한다면 NoSQL은 일반적으로 그렇게하지 않습니다.

일부 NoSQL 솔루션은 데이터에 대한 선택적 데이터 입력 및 유효성 검사 메커니즘을 제공합니다. 예를 들어 Apache Cassandra에는 기존 SQL에서 발견 된 것과 유사한 수많은 기본 데이터 유형이 있습니다.

최종 일관성

NoSQL 시스템은 더 나은 가용성과 성능을 위해 강력하거나 즉각적인 일관성을 제공합니다. 기존 데이터베이스는 작업이 원자 적 (트랜잭션의 모든 부분이 성공하거나 아예 수행되지 않음), 일관성 (모든 사용자가 동일한 데이터보기를 가짐), 격리 (트랜잭션이 경쟁하지 않음) 및 내구성 (완료되면 생존 함)을 보장합니다. 서버 오류).

집합 적으로 ACID라고하는이 네 가지 속성은 대부분의 NoSQL 시스템에서 다르게 처리됩니다. 클러스터의 즉각적인 일관성 대신 클러스터의 다른 노드에 업데이트를 복사하는 데 필요한 시간으로 인해 최종 일관성이 있습니다. 클러스터에 삽입 된 데이터는 결국 모든 곳에서 사용할 수 있지만 언제든 보장 할 수는 없습니다.

SQL 시스템에서 트랜잭션의 모든 단계 (예 : 판매 실행 재고 감소)가 완료되거나 롤백 되도록 보장하는 트랜잭션 의미 체계 는 일반적으로 NoSQL에서 사용할 수 없습니다. 은행과 같이 "단일 정보 소스"가 필요한 시스템의 경우 NoSQL 접근 방식이 제대로 작동하지 않습니다. 어떤 ATM을 사용 하느냐에 따라 은행 잔고가 달라지는 것을 원하지 않습니다. 모든 곳에서 똑같은 것으로보고되기를 원합니다.

일부 NoSQL 데이터베이스에는이 문제를 해결하기위한 부분적인 메커니즘이 있습니다. 예를 들어 MongoDB는 개별 작업에 대해 일관성을 보장하지만 데이터베이스 전체에 대해서는 보장하지 않습니다. Microsoft Azure CosmosDB를 사용하면 요청 당 일관성 수준을 선택할 수 있으므로 사용 사례에 맞는 동작을 선택할 수 있습니다. 그러나 NoSQL에서는 최종 일관성을 기본 동작으로 기대합니다.

NoSQL 잠금

대부분의 NoSQL 시스템은 개념적으로 유사하지만 매우 다르게 구현 됩니다. 각각은 데이터를 쿼리하고 관리하는 방법에 대한 고유 한 은유와 메커니즘을 갖는 경향이 있습니다.

한 가지 부작용은 애플리케이션 로직과 데이터베이스 간의 잠재적으로 높은 수준의 결합입니다. NoSQL 시스템을 선택하고 고수한다면 그렇게 나쁘지는 않지만 시스템을 변경하면 걸림돌이 될 수 있습니다.

예를 들어 MongoDB에서 CouchDB로 (또는 그 반대로) 마이그레이션하는 경우 데이터를 마이그레이션하는 것 이상을 수행해야합니다. 또한 데이터 액세스와 프로그래밍 방식의 차이를 탐색해야합니다. 즉, 데이터베이스에 액세스하는 응용 프로그램 부분을 다시 작성해야합니다.

NoSQL 기술

NoSQL의 또 다른 단점은 상대적으로 전문성이 부족하다는 것입니다. 기존 SQL 인재 시장이 여전히 상당히 큰 경우 NoSQL 기술 시장은 초기 단계입니다.

참고로 Indeed.com은 2017 년 말 현재 기존 SQL 데이터베이스 (MySQL, Microsoft SQL Server, Oracle Database 등)에 대한 채용 공고 양이 지난 3 년 동안 작업 양보다 더 많이 남아 있다고보고합니다. MongoDB, Couchbase 및 Cassandra 용. NoSQL 전문 지식에 대한 수요가 증가하고 있지만 여전히 기존 SQL 시장의 일부입니다.

SQL과 NoSQL 병합

SQL과 NoSQL 시스템의 차이점 중 일부는 시간이지나면서 사라질 것으로 예상 할 수 있습니다. 이미 많은 SQL 데이터베이스가 이제 JSON 문서를 기본 데이터 유형으로 받아들이고 해당 데이터에 대해 쿼리를 수행 할 수 있습니다. 일부는 JSON 데이터에 제약을 부과하는 기본 방법을 가지고있어 기존의 행 및 열 데이터와 동일한 엄격하게 처리됩니다.

반대로 NoSQL 데이터베이스는 SQL과 유사한 쿼리 언어뿐만 아니라 기존 SQL 데이터베이스의 다른 기능을 추가하고 있습니다. 예를 들어, MarkLogic과 RavenDB라는 두 개 이상의 문서 데이터베이스는 ACID 준수를 약속합니다.

여기저기서 미래 세대의 데이터베이스가 패러다임을 가로 질러 NoSQL과 SQL 기능을 모두 제공 할 것이라는 신호가 있습니다. 예를 들어 Microsoft의 Azure Cosmos DB는 두 종류의 시스템 동작을 상호 교환 적으로 재현하기 위해 내부에서 기본 요소 집합을 사용합니다. Google Cloud Spanner는 강력한 일관성과 NoSQL 시스템의 수평 확장 성을 결합한 SQL 데이터베이스입니다.

그러나 순수 SQL과 순수 NoSQL 시스템은 앞으로 수년 동안 그 자리를 차지할 것입니다. 자유 형식 데이터에 대한 빠르고 확장 성이 뛰어난 액세스를 위해 NoSQL을 찾으십시오. 이는 읽기 일관성 및 SQL 데이터베이스에 공통적 인 기타 보호 장치와 같은 몇 가지 비용이 발생합니다. 그러나 많은 응용 프로그램의 경우 이러한 보호 장치는 NoSQL이 제공하는 것과 거래 할 가치가 있습니다.