IT/Tech Notes | Posted by 철규님(최규철) 2011.02.23 01:22

NoSQL - 클라우딩 컴퓨팅 환경에서의 데이터 관리



NoSQL(Not only SQL)은 데이터베이스 관리 시스템(Database Management System, DBMS)을 의하는 용어인데, 최근에는 그 동안 사용되어 온 관계형 데이터베이스 관리 시스템(Relational Database Management System, RDBMS)과 대치되는 용어로 자주 사용된다.

덕분에 가장 쉽게 NoSQL에 대한 개념을 정리하려면 RDBMS와 어떻게 다른가를 찾아보면 된다. 대표적으로 정리되는 NoSQL의 특징은 아래와 같다.

  • 고정된 테이블 스키마 없음
  • 테이블 간의 JOIN 연산을 하지 않음
  • 수평적인 확장성이 있음
  • 대용량(heavy) 읽기/쓰기 성능이 좋음

개략적은 특징은 위와 같이 정리할 수 있지만, 더 자세한 내용을 알기 위해서는 DB의 기본적인 이론, RDBMS의 특징, NoSQL의 등장 배경 등에 대해서도 알아보아야 한다.


CAP Theorem은 분산형 시스템에서 아래의 세 가지 특성 모두를 제공하는 것이 불가능하다는 것을 언급하고 있는 정리이다.

 

  • Consistency : 모든 노드는 동시에 같은 데이터를 가지고 있음
  • Availability : 모든 노드는 항상 동작 해야함
  • Partition Tolerance : 전체 시스템은 물리적으로 분리된 노드 상에서도 잘 동작해야 함

CAP Theorem에 따르면 위의 세 가지 중에 최대 두가지 특성만을 적용할 수 있고, 때문에 분산형 시스템을 설계할 때는 그 시스템의 특성에 따라 필요한 특성을 골라 시스템을 구성해야 한다.

기존의 RDBMS를 위의 특성에 대입해서 판단한다면, RDBMS가 사용될 당시에는 데이터의 항시성과 무결성이 가장 중요한 요소이었기 때문에 RDBMS는 CA 특성을 가진 시스템에 해당 된다.

하지만 네트워크 발전으로 인해 많은 양의 데이터가 생겨나고 이를 처리하기 위해 클라우드 컴퓨팅 등 분산 처리 시스템이 도입되면서 기존의 RDBMS는 이를 위한 확장성을 지원하는 못하는 한계를 드러내게 된다. 때문에 기존의 RDBMS가 가지는 CA 특성 중 하나를 포기하고 P 특성을 도입하기 위한 다양한 시도들이 나오게 되는데, 그 과정에서 NoSQL이 나타나게 된다.

시스템이 사용되는 환경에 따라서 P를 중심으로 C 또는 A 특성을 추가하게 되는데, 대표적인 실사용예는 다음과 같다.

  • Google: BigTable - Consistency + Partition Tolerance
  • Amazon: Dynamo - Availability  + Partition Tolerance
  • Digg.com: Cassandra - Availability  + Partition Tolerance
  • Twitter: Cassandra - Availability  + Partition Tolerance


이처럼 NoSQL이 기존의 RDBMS가 가지던 CA 특성 중 하나를 포기하고 P를 선택함에 따라서 RDBMS가 가지는 일부의 장점을 잃게 되었다. 대표적인 것이 ACID이다.

  • Atomic : 데이터 처리의 원자성. 성공 또는 실패만 존재. 처리 중간에 정지할 수 없음
  • Consistent : 데이터의 일관성. 서로 다른 세션에서 동시에 참조할 경우 데이터는 항상 동일 해야 함
  • Isolated : 데이터 처리 트랜젝션 중에는 다른 세션에서 데이터를 참조할 수 없음
  • Durable : 데이터 처리 트랙젝션이 종료되면 완료된 값은 항상 유지되어야 함.


NoSQL의 경우에는 위의 네 가지를 모두 보장하지 않는데, 예를 들면 CAP 중 C를 포기하고 AP를 채용한 Cassandra 같은 경우에는 100%의 Consistency를 포기하고 Eventually consistency를 지원한다. 즉, Cassandra를 이용하는 시스템의 경우 동일한 데이터에 어떤 클라이언트에서는 값을 쓰고, 어떤 클라이언트에서는 값을 읽는 다면 두 클라이언트가 가지는 데이터 값이 다를 수도 있다는 것이다.

NoSQL은 구조화된 스키마를 가지지 않고 STL의 MAP 컨테이너와 유사한 Key-Value 방식으로 데이터를 저장한다.
분류적으로는 Key-Value 방식 이외에도 GraphDB, Documente-Oriented DB, Column-Orinted DB 등이 있지만, 넓은 의미에서 MAP 컨테이너의 Key-Value 방식으로 저장된다고 보면 된다.

NoSQL을 구성하는 아키텍처는 구현하는 시스템에 따라 매우 다양하지만, 큰 공통점은 아래와 같다.

  • 각각의 물리적 노드는 내부에 가상의 노드를 가지기도 함
  • 가상의 노드는 여러 물리적 노드에 복제본을 가지고 있음 => 물리적 노드 및 그 내부에 가상의 노드를 추가하고 기존의 데이터를 복제함으로써 수평적 확장성 지원
  • Key를 기준으로 검색 요청이 올 경우 물리적 노드를 대상으로 Hashing, Tree searching, Key meta server 등을 이용하여 해당 노드에 접근함


특정한 표준에 의해 만들어진 기술이 아닌 필요에 의해서 만들어진 기술이기 때문에 구체적인 내용에서는 많은 차이점을 가진다. 하지만 어떤 NoSQL 제품을 사용하던 개념적인 큰 틀은 이러한 내용에서 벗어나지 않는다고 볼 수 있다.

댓글을 달아 주세요

IT/Tech Notes | Posted by 철규님(최규철) 2011.02.09 22:10

[용어] Cloud computing



Cloud computing
<출처 : Wikiepedia / http://en.wikipedia.org/wiki/Cloud_computing >

아래는 Wikiepedia 검색 결과의 abstract 부분을 번역한 내용이다.


Cloud computing is location-independent computing, whereby shared servers provide resources, software, and data to computers and other devices on demand, as with the electricity grid.
클라우드 컴퓨팅은 위치 독립적인 컴퓨팅 방식으로, 이를 통해 공유된 서버는 컴퓨터나 다른 장치의 요구에 따라 리소스, 소프트웨어, 데이터 등을 제공한다.

Cloud computing is a natural evolution of the widespread adoption of virtualization, service-oriented architecture and utility computing.
클라우드 컴퓨팅은 가상화 기술의 광범위한 적용, 서비스 기반 아키텍처, 유틸리티 컴퓨팅의 자연스러운 진화이다.

Details are abstracted from consumers, who no longer have need for expertise in, or control over, the technology infrastructure "in the cloud" that supports them.
상세한 사항은 그들이 사용하는 "클라우드"라는 기술적 기반에 전문성이 없거나 그것을 제어할 수 없는 사용자들로부터 모아졌다.

Cloud computing describes a new supplement, consumption, and delivery model for IT services based on the Internet, and it typically involves over-the-Internet provision of dynamically scalable and often virtualized resources.
클라우드 컴퓨팅은 인터넷 기반의 IT 서비스에 있어서 새로운 공급과 수요, 전달 방식을 설명한다. 그리고 일반적으로 동적인 규모로 때론 가상화된 리소스의 인터넷 상 제공을 포함하기도 한다.

It is a byproduct and consequence of the ease-of-access to remote computing sites provided by the Internet.
그것은 인터넷에 의해서 제공되는 원격 컴퓨팅에 손쉽게 접할 수 있게 하는 방법의 부산물이자 결과이다.

This frequently takes the form of web-based tools or applications that users can access and use through a web browser as if it were a program installed locally on their own computer.
이것은 주로 컴퓨터에 프로그램이 설치만 되어 있다면 웹 브라우저를 통해 사용자가 쉽게 접근하고 사용할 수 있는 웹 기반 툴 또는 어플리케이션의 형태를 가진다.

The National Institute of Standards and Technology (NIST) provides a somewhat more objective and specific definition here.
미국 국립 표준 기술원(NIST)은 이제 좀 더 명확하고  구체적인 정의를 제공한다.

The term "cloud" is used as a metaphor for the Internet, based on the cloud drawing used in the past to represent the telephone network, and later to depict the Internet in computer network diagrams as an abstraction of the underlying infrastructure it represents.
"클라우드"라는 용어는 과거 전화망을 나타낼 때 사용되어오다 이후에 인터넷이 나타내는 하부 구조의 추상화를 나타내는 컴퓨터 네트웍 다이어그램을 묘사하는데 사용된 "cloud drawing"이라는 단어에서 나온 인터넷을 은유하는 것으로 사용된다.

Typical cloud computing providers deliver common business applications online that are accessed from another Web service or software like a Web browser, while the software and data are stored on servers.
일반적인 클라우드 컴퓨팅 제공자는 소프트웨어와 데이터는 서버에 저장되지만, 브라우저와 같은 웹 서비스나 소프트웨어를 통해 접근이 가능한 일반적인 온라인 비지니스 어플리케이션을 제공한다.

Most cloud computing infrastructures consist of services delivered through common centers and built on servers.
대부분의 클라우드 컴퓨팅 인프라들은 공용 센터와 기반 서버로 부터 제공되는 서비스들로 구성되어 있다.

Clouds often appear as single points of access for consumers' computing needs.
클라우드는 때로 사용자의 컴퓨팅 필요에 의해 단일 접근 포인트 형태가 되기도 하다.

Commercial offerings are generally expected to meet quality of service (QoS) requirements of customers, and typically include service level agreements (SLAs).
상업적으로 제공되는 것들은 일반적으로 사용자의 QoS 요구 사항을 만족시켜야하고, 보통 서비스 수준의 계약(SLAs)을 포함한다.

 

댓글을 달아 주세요

IT/Tech Notes | Posted by 철규님(최규철) 2011.02.08 02:10

[용어] Parallel programming / Concurrent programming

Wikipedia에서 'parallel computing'을 검색하면 'parallel computing'의 검색 결과로 redirect된다. 아직 기초 지식이 없어서 두 용어의 의미가 동일한 것인지는 모르겠지만, 구할 수 있는 정보가 이것뿐이니, 일단은 확인하고 넘어가자.


Parallel computing
<출처 : Wikiepedia / http://en.wikipedia.org/wiki/Parallel_programming >

아래는 Wikiepedia 검색 결과의 abstract 부분을 번역한 내용이다.


Parallel computing is a form of computation in which many calculations are carried out simultaneously, operating on the principle that large problems can often be divided into smaller ones, which are then solved concurrently ("in parallel").
병렬 컴퓨팅은 대규모의 프로그램은 대게 작은 단위로 구분되고, 이것들이 동시에("병렬적으로") 수행될 수 있다는 원리에 기반하여, 대규모의 연산이 동시에 실행되도록 하는 형태를 가진 컴퓨팅 방식이다.

There are several different forms of parallel computing: bit-level, instruction level, data, and task parallelism.
병렬 컴퓨팅에는 비트레벨, 명령어레벨, 데이터와 태스크 병렬화 등의 몇 가지 방법이 있다.

Parallelism has been employed for many years, mainly in high-performance computing, but interest in it has grown lately due to the physical constraints preventing frequency scaling.
병렬화는 오랫동안 고성능 컴퓨팅을 중심으로 도입되어 왔지만, 주파수 제어를 저해하는 물리적 제약으로 인해 최근 관심이 증가하고 있다.
(역주: 원문의 'physical constraints preventing frequency scaling'은 물리적 제약으로 인해서 CPU의 clock frequency가 무한히 증가할 수 없는 것을 의미하는 듯 하다. CPU clock은 기술적으로는 향상시킬 여지가 충분히 있으나, 소비전력 증가와 이로 인한 발열로 인해 실용성에는 한계에 부딪혔다.)

As power consumption (and consequently heat generation) by computers has become a concern in recent years, parallel computing has become the dominant paradigm in computer architecture, mainly in the form of multicore processors.
컴퓨터의 소비 전력 문제(와 동시에 발열 문제)이 최근 들어 관심받고 있음에 따라, 병렬 컴퓨팅은 특히 멀티코어 프로세스의 형태에 있어서 중요한 패러다임이 되고 있다.

Parallel computers can be roughly classified according to the level at which the hardware supports parallelism—with multi-core and multi-processor computers having multiple processing elements within a single machine, while clusters, MPPs, and grids use multiple computers to work on the same task.
병렬 컴퓨터는 하드웨어가 병렬화를 지원하는 레벨에 따라 대략 다음과 같이 분류 될 수 있다. 한 대의 기계에 다수의 프로세서를 가진 멀티코어/멀티프로세서 컴퓨터, 클러스터, MPP, 동일한 task를 수행하는 다수의 컴퓨터를 이용하는 그리드.

Specialized parallel computer architectures are sometimes used alongside traditional processors, for accelerating specific tasks.
특정 task를 빠르게 수행하기 위해서 일반적인 프로세서를 이용한 특별한 병렬 컴퓨터 구조가 사용되기도 한다.

Parallel computer programs are more difficult to write than sequential ones, because concurrency introduces several new classes of potential software bugs, of which race conditions are the most common. 
동시성에 의해서 잠재적인 S/W 버그가 새로 나타나기 때문에 병렬 컴퓨터 프로그램은 일반적인 프로그램보다 작성하기가 더 어렵다. 대표적으로는 race condition을 들 수 있다. 

Communication and synchronization between the different subtasks are typically one of the greatest obstacles to getting good parallel program performance.
서로 다른 subtask간의 커뮤니케이션과 동기화는 좋은 병렬 프로그램 성능의 가장 큰 장애물 중에 하나이다.

The speed-up of a program as a result of parallelization is observed as Amdahl's law.
병렬화에 의한 프로그램 성능 향상의 결과는 Amdahl's law로 확인할 수 있다.



'Parallel programming'을 보다보면 'Concurrent programming'이라는 단어도 심심치 않게 볼 수 있는데, 이 단어 또한 Wikipedia에서는 'Concurrent computing'으로 결과가 redirect 된다.


Concurrent computing
<출처 : Wikiepedia http://en.wikipedia.org/wiki/Concurrent_programming >

아래는 Wikiepedia 검색 결과의 abstract 부분을 번역한 내용이다.


Concurrent computing is a form of computing in which programs are designed as collections of interacting computational processes that may be executed in parallel.
병행 컴퓨팅은 병렬 수행이 가능한 프로세스간의 상호 연산 집합체의 형식으로 구현된 프로그램에 의해서 수행되는 컴퓨팅 형태를 말한다.

Concurrent programs can be executed sequentially on a single processor by interleaving the execution steps of each computational process, or executed in parallel by assigning each computational process to one of a set of processors that may be close or distributed across a network.
병행 프로그램은 싱글 프로세서 상에서 각 프로세스의 수행 순서를 교차는 방식, 또는 각 프로세스를 제한된 또는 네트워크 상에 분산된 프로세서 셋 중의 하나에 할당하는 방식으로 실행될 수 있다.

The main challenges in designing concurrent programs are ensuring the correct sequencing of the interactions or communications between different computational processes, and coordinating access to resources that are shared among processes.
병행 프로그램을 설계함에 있어서의 가장 큰 과제는 다른 프로세스간의 상호작용이나 커뮤니케이션의 순서의 정확성을 보장하고, 프로세스 간에 공유되는 리소스에 대한 접근을 관리하는 것이다.

A number of different methods can be used to implement concurrent programs, such as implementing each computational process as an operating system process, or implementing the computational processes as a set of threads within a single operating system process.
병행 프로그램을 구현하기 위해서는 몇가지 다른 방법이 사용되는데, 각각의 프로세스를 OS 프로세스로 구현하는 방법, 각각의 프로세스를 단일 OS 프로세스내의 thread 셋으로 구현하는 방법이 있다.

Pioneers in the field of concurrent computing include Edsger Dijkstra, Per Brinch Hansen, and C.A.R. Hoare.
병행 프로그래밍 분야의 선구자로는  Edsger Dijkstra, Per Brinch Hansen, C.A.R. Hoare가 있다.


Wikipedia의 결과만으로는 (그것도 abstract 부분만으로는) parallel computing과 concurrent computing이 동일한 의미인지, 전혀 다른 의미인지 정확하게 파악할 수는 없지만, 일단 살펴본 바로는 유사한 의미를 가지지만 구현에 있어서는 약간의 차이점을 가진 개념으로 생각된다.

 

댓글을 달아 주세요