NoSQL이란?


NoSQL은 Not Only SQL의 약자로 기존 RDBMS와 다른 형태의 데이터로 저장하는 기술을 의미한다.



NoSQL의 등장


NoSQL은 2009년 이후에 인터넷의 발전과 함께 SNS 서비스가 활성화되면서, 전 세계 사람들을 대상으로 하는 형태의 서비스로 발전되었고 이는 기존의 기업 시스템에서 볼 수 없었던 대규모 데이터를 생산해냈다. 또한 이 데이터들은 기존 RDBMS 테이블 형태의 기업 데이터에 비해 매우 단순한 형태를 띠게 되었다.


즉 데이터의 패러다임이 한정된 규모의 복잡성이 높은 데이터에서 단순한 대량의 데이터로 넘어가기 시작했다. 이는 기존의 데이터 저장 시스템으로는 커버할 수 없는 여러 가지 한계를 야기했고 결국에는 새로운 형태의 데이터 저장 기술을 요구하게 되었다.


이때 대표적인 인터넷 기업이면서 이러한 대용량 단순 데이터를 가장 많이 보유해 단순한 대용량 데이터 처리에 대한 요구가 가장 많은 구글과 아마존에 의해 빅테이블(Bigtable)과 Dynamo라는 논문이 발표되었고, 이 두 논문은 새로운 데이터 저장 기술을 만들어내는 시발점이 되었다.


이것은 기존의 오라클 등으로 대변되는 RDBMS 중심의 데이터 저장 기술 시장에 새로운 데이터 저장 기술인 NoSQL이 등장하는 계기였다.



NoSQL의 특성


NoSQL은 제품에 따라 그 특성이 매우 달라서, 하나의 제품군으로 정의하기는 어렵다.


1. NoSQL은 데이터 간의 관계를 정의하지 않는다.

RDBMS(관계형 데이터베이스)가 기본키, 외래키 등의 제약조건으로 테이블을 정의하고, 이를 이용하여 Join 등의 관계형 연산을 하지만, NoSQL은 데이터 간의 관계를 정의하지 않는다.


2. 대용량의 데이터를 저장할 수 있다.

RDBMS의 복잡도와 용량 한계를 극복하기 위한 목적으로 등장한 만큼, 페타바이트급의 대용량 데이터를 저장할 수 있다.


3. 분산형 구조

NoSQL은 기존의 RDBMS와는 다르게 하나의 고성능 머신에 데이터를 저장하는 것이 아니라, 일반적인 서버(인텔 계열의 CPU를 사용하는 Commodity Server) 수십 대를 연결해 데이터를 저장 및 처리하는 구조를 갖는다. 즉 분산형 구조를 통해 데이터를 여러 대의 서버에 분산해 저장하고, 분산 시에 데이터를 상호 복제해 특정 서버에 장애가 발생했을 때에도 데이터 유실이나 서비스 중지가 없는 형태의 구조다.


4. 유동적인 테이블 스키마

RDBMS와는 다르게 테이블의 스키마가 유동적이다. 예를 들어 RDBMS의 경우 테이블이 <표1>과 같은 형태로 되어 있을 때 해당 테이블은 반드시 숫자, 이름 문자열, 주소 문자열만 들어갈 수 있다.


<표1> RDBMS 간단한 테이블 구조 예제


그런데 NoSQL은 대부분 이런 개념이 없다. ID로 사용하는 키 부분에만 타입이 동일하고, mandatory(생략되지 않는) 필드로 지정하면 값에 해당하는 컬럼은 어떤 타입이든, 어떤 이름이 오든 허용된다. 즉 <표2>와 같이 ID 필드는 공통이지만, 데이터를 저장하는 컬럼은 각기 다른 이름과 다른 데이터 타입을 가질 수 있다.


<표2> NoSQL 테이블 설계 예제


- CAP


NoSQL은 분산형 구조를 띠고 있기 때문에 분산 시스템의 특징을 그대로 반영하는데, 그 특성 중의 하나가 CAP 이론이다. 이 이론은 에릭 브루어(Eric Brewer) 교수에 의해 발표된 분산 컴퓨팅 이론으로, 분산 컴퓨팅 환경은 Consistency, Availability, Partitioning 세 가지 특징을 가지고 있는데, 이중 두 가지만 만족할 수 있다는 이론이다. NoSQL은 대부분이 CAP 이론을 따르고 있다


Consistency(일관성): 분산된 노드 중 어느 노드로 접근하더라도 동일한 데이터를 조회함을 보장

Availability(가용성): 클러스터링된 노드 중 하나 이상의 노드가 Fail이 되더라도, 모든 요청에 대한 정상적인 응답을 보장

Partition Tolerance(생존성): 클러스터링된 노드 간에 미리 예측할 수 없는 데이터 손실있더라도, 시스템은 항상 정상 작동을 보장


출처 : http://blog.nahurst.com/visual-guide-to-nosql-systems


NoSQL에서는 스케일 아웃이 되는 확장성의 개념으로서  Partition Tolerance(생존성)은 필수로 가져야 하는 특성이므로, Consistency(일관성), Availability(가용성) 중 어느 하나를 선택한 특성을 가진다.


이와는 반대로 RDBMS에서는 트랜잭션 데이터 처리가 가장 중요한 특성이므로 Partition Tolerance(생존성)을 포기한 Consistency(일관성), Availability(가용성)의 특성을 가진다. 이 두가지 특성을 통하여 RDBMS는 ACID(Atomicity, Consistency, Isolation, Durability)를 만족하여 트랜잭션을 제공한다.



NoSQL의 분류


1. Key/Value Model

- 가장 기본적인 패턴으로 대부분의 NoSQL은 다른 데이터 모델을 지원하더라도, 기본적으로 Key/Value의 개념을 지원한다. Key/Value Store란 Unique한 Key에 하나의 Value를 가지고 있는 형태를 이야기한다. Put(Key,Value), Value := get(Key) 형태의 API로 접근한다.

 


 

- Value는 String이나 Integer와 같은 Primitive 타입이 될 수도 있지만, 이 정도로는 우리가 일반적으로 사용하는 테이블 형태의 데이터를 저장할 수 없다. 이런 까닭에 조금 더 확장된 개념을 사용하는데, 그것이 바로 Column Family라는 개념이다. Key 안에 (Column, Value) 조합으로 된 여러 개의 필드를 갖는데 이를 Column Family라고 한다.

 


 

- 예를 들어, 사용자 프로필을 저장하는 시나리오가 있을 때 사용자의 이름을 KEY로 한다면 성별, 주소, 나이들은 각각의 Column이 될 수 있다. Key 필드는 RDBMS에서 Primary Key, Column 필드들은 RDBMS의 일반 데이터 필드로 이해하면 된다. 프로그래밍 언어와 비교해서 생각한다면 Key/Value Store는 Map 데이터 구조와 유사하다.

- 대표적인 제품으로 Amazon의 SimpleDB, Azure Table Storage, Oracle Coherence, Redis 등이 있다.


2. Ordered Key/Value Model

- Key/Value Store의 확장된 형태로, Key/Value Store와 데이터 저장 방식은 동일하나 데이터가 내부적으로 키를 순서로 정렬해서 저장한다. Sorting이 별거 아닌 것 같지만 NoSQL 관점에서는 대단히 중요한 기능을 제공하게 된다. 특히 NoSQL은 RDBMS의 ORDER BY와 같은 기능을 제공하지 않기 때문에 결과 값을 업데이트 날짜 등으로 정렬해서 보여주는 것은 이 Ordered Key/Value Store가 절대적으로 유리하다.

- 대표적인 제품으로 아파치의 Hbase, Cassandra 등이 있다.



3. Document Key/Value Model

- Key/Value Store의 확장된 형태로, 기본적으로는  Key/Value Store이다. Key에 해당하는 Value 필드에 데이터를 저장하는 구조는 같으나, 저장되는 Value의 데이터 타입이 Document라는 타입을 사용한다. Document 타입은 MS 워드와 같은 문서를 이야기하는 것이 아니라 XML, JSON, YAML과 같이 구조화된 데이터 타입으로, 복잡한 계층 구조를 표현할 수 있다. 

 


예) user: {

  name: "suspect"

       ,hobby: "soccer"

       ,address:{ state : "Seoul"

             nationality : "Korea" }

            } 


- 아울러 Document Store 기반의 NoSQL은 제품에 따라 다르기는 하지만 대부분 추가적인 기능(Sorting, Join, Grouping 등)을 제공한다.

- 대표적인 제품으로 MongoDB, CouchDB, Riak, Terrastore, OrientDB 등이 있다.


4. Graph Data Model

- Graph Data Model은 Ordered Key/Value Model에서 진화되어 온 모델이다. Graph Data Model은 RDBMS에서의 엔트리 속성을 node 로 , 관계를 노드간 edge 로 표현하여 확장성이 높은 그래프로 표현한다.

- 대표적인 제품으로 Neo4J, Sones, DEX, InfoGrid 등이 있다.


           CentOS 7 MongoDB 설치하기             



오늘은 CentOS에 몽고디비를 설치하여 테스트해 볼 일이 생겼는데, 간단하게 

설치하는 방법에 대해 알아보겠습니다. 오늘은 설치만 해보고 개념에 대한 설명은

개인적으로 공부하여 따로 포스팅하도록 하겠습니다 :)



1. 먼저 패키지 관리 시스템에 MongoDB 저장소를 추가합니다.

vi /etc/yum.repos.d/mongodb-org-3.4.repo


yum update시 mongodb가 자동으로 업데이트 되는 것을 방지하기 위해 아래 코드를 추가합니다.

vi /etc/yum.conf


exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools


2. 아래와 같은 내용을 입력하고 저장합니다.

[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc


3. 몽고디비 패키지 및 관련 도구를 설치합니다.

sudo yum install -y mongodb-org


4. Selinux를 사용한다면 mongodb의 기본 포트에 액세스 권한을 허용해줍니다.

semanage port -a -t mongod_port_t -p tcp 27017


5. 방화벽에서 mongodb의 포트를 열어줍니다.

firewall-cmd --permanent --zone=public --add-port=27017/tcp

firewall-cmd --reload

firewall-cmd --list-all


6. 시작프로그램에 mongodb 설정

sudo systemctl enable mongod

sudo systemctl start mongod


7. mongodb를 실행해봅니다.

sudo service mongod start


로그를 출력하여 정상적으로 실행되었는지 확인해봅니다.

cat /var/log/mongodb/mongod.log



8. 접근 제한 없이 MongoDB에 접속

mongod --port 27017 --dbpath /data/db


9. 인스턴스에 연결

mongo --port 27017


10. 사용자를 관리할 계정을 만듭니다.

use admin

db.createUser(

  {

    user: "myUserAdmin",

    pwd: "abc123",

    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]

  }

)


11. MongoDB 접근 제한, dbpath 설정

mongod --auth --port 27017 --dbpath /data/db


12. 위에서 생성한 사용자 관리자로 연결하고 인증합니다.

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"


13. 실행에 필요한대로 사용자도 추가해줍니다.

use test

db.createUser(

  {

    user: "myTester",

    pwd: "xyz123",

    roles: [ { role: "readWrite", db: "test" },

             { role: "read", db: "reporting" } ]

  }

)


14. 추가한 사용자로 로그인 해봅니다.

mongo --port 27017 -u "myTester" -p "xyz123" --authenticationDatabase "test"



이상으로 몽고디비를 설치해보았는데, 다음 장에서는 몽고디비 기본적인 명령어들에 대해 다뤄보겠습니다.


참고사이트 : https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/