Skip to content

Latest commit

Β 

History

History
46 lines (39 loc) Β· 5 KB

File metadata and controls

46 lines (39 loc) Β· 5 KB

NoSQL

Not Only SQL 1998년도에 SQL을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κ²½λŸ‰ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 의미둜 처음 λ“±μž₯ν•˜μ˜€λ‹€. 일반적으둜 ν†΅μš©λ˜λŠ” μ •μ˜κ°€ μ—†μœΌλ©°, κ·Έ μ •μ˜λ₯Ό λ‚΄λ¦¬λŠ” κΆŒμœ„μžλ„ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

NoSQL?

빅데이터와 μ‚¬λ¬ΌμΈν„°λ„·μ˜ λ°œμ „μœΌλ‘œ λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 데이터λ₯Ό 효율적으둜 μ €μž₯ν•˜κ³  μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μƒˆλ‘œμš΄ ν˜•νƒœμ˜ λ°μ΄ν„°λ² μ΄μŠ€ ꡬ쑰가 ν•„μš”ν–ˆλ‹€.

  • κ΄€κ³„ν˜• λͺ¨λΈμ„ μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
  • λŒ€λΆ€λΆ„ μ˜€ν”ˆμ†ŒμŠ€
  • 21μ„ΈκΈ° μ›Ή ν™˜κ²½μ„ μœ„ν•΄ ꡬ좕됨
  • μŠ€ν‚€λ§ˆκ°€ μ—†μŒ

NoSQL을 전톡적인 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€κ°€ ν•΄κ²°ν•  수 μ—†λŠ” μ›Ή 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯κ³Ό ν™•μž₯μ„± μš”κ΅¬μ‚¬ν•­μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 개발된 μ‹œμŠ€ν…œλ“€μ΄κΈ° λ•Œλ¬Έμ—, λΆ„μ‚° 처리 ꡬ쑰λ₯Ό μ§€λ‹ˆκ³  μžˆλ‹€. λ”°λΌμ„œ λΆ„μ‚° μ‹œμŠ€ν…œμ— μ μš©λ˜λŠ” CAP 이둠에 λŒ€ν•˜μ—¬ μ΄ν•΄ν•˜λŠ” 것도 ν•„μš”ν•˜λ‹€. CAP 이둠은 Eric Brewκ°€ μ£Όμž₯ν•œ κ²ƒμœΌλ‘œ, λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ 보μž₯ν•΄μ•Ό ν•˜λŠ” 츑면을 λ‹€μŒκ³Ό 같이 μ •μ˜ν•˜κ³  μžˆλ‹€.

CAP

  • 일관성(consistency): λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈλ“€μ€ 항상 데이터듀에 λŒ€ν•œ 같은 λ·°λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€. 즉 λͺ¨λ“  λ…Έλ“œλ“€μ€ λ™μ‹œμ— 같은 데이터λ₯Ό 보아야 ν•œλ‹€.
  • κ°€μš©μ„±(availability): 각각의 ν΄λΌμ΄μ–ΈνŠΈλ“€μ€ 항상 읽고 μ“Έ 수 μžˆλ‹€. λͺ¨λ“  μš”μ²­μ€ μ‹€νŒ¨ν•˜λ“  μ„±κ³΅ν•˜λ“  응닡을 λ°›λŠ” 것을 보μž₯ν•œλ‹€.
  • λΆ„ν•  용인(partition tolerance): λ„€νŠΈμ›Œν¬ μ‹€νŒ¨λ‘œ μΈν•˜μ—¬ μž„μ˜μ˜ 뢄할이 λ°œμƒν•΄λ„ μ‹œμŠ€ν…œμ€ κ³„μ†μ μœΌλ‘œ λ™μž‘ν•΄μ•Ό ν•œλ‹€. μž„μ˜μ˜ λ©”μ‹œμ§€λ“€μ˜ 손싀 λ˜λŠ” μ‹œμŠ€ν…œμ˜ λΆ€λΆ„ μ‹€νŒ¨μ—λ„ λΆˆκ΅¬ν•˜κ³ , μ‹œμŠ€ν…œμ€ μ§€μ†μ μœΌλ‘œ λ™μž‘ν•œλ‹€. CAP 이둠에 λ”°λ₯΄λ©΄ C와 AλŠ” λ™μ‹œμ— λ§Œμ‘±ν•  수 μ—†κΈ° λ•Œλ¬Έμ—, 일반적으둜 C+P μ „λž΅ ν˜Ήμ€ A+P μ „λž΅μ„ μ ˆμΆ©ν•΄μ„œ μ·¨ν•œλ‹€. 일반적인 SQL μ‹œμŠ€ν…œμ˜ 경우 νŠΈλžœμž­μ…˜μ΄ μ§€λ…€μ•Ό ν•˜λŠ” 4κ°€μ§€ 속성인 ACID 속성을 λ§Œμ‘±ν•˜λŠ”λ°, CAP의 P 속성을 기본적인 츑면으둜 μ·¨ν•˜κΈ° λ•Œλ¬Έμ— BASE 속성을 λ”°λ₯Έλ‹€.

BASE

  • Basically Available: ν™•μž₯μ„±
  • Soft State: μ†Œν”„νŠΈ μƒνƒœ
  • Eventually Consistent: κ²°κ΅­ 일관성

기본적으둜 ν™•μž₯적은 NoSQL λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ΄ ν™•μž₯성을 보μž₯ν•œλ‹€λŠ” κ²ƒμœΌλ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 항상 λ™μž‘μ„ ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. μ†Œν”„νŠΈ μƒνƒœλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ“€μ΄ 항상 일관적인 μƒνƒœμ— μžˆμ„ ν•„μš”κ°€ μ—†μŒμ„ μ˜λ―Έν•œλ‹€. 점진적인 일관성은 리더(reader)듀이 μ‹œκ°„μ΄ 지남에 따라 μ“°κΈ° κ²°κ³Όλ₯Ό λ³Έλ‹€λŠ” λœ»μ΄λ‹€. μ•ˆμ • μƒνƒœμ—μ„œ μ‹œμŠ€ν…œμ€ κ²°κ΅­ λ§ˆμ§€λ§‰ μ“°κΈ° κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. μ΄λŠ” ν΄λΌμ΄μ–ΈνŠΈλ“€μ€ 변경이 진행쀑인 μƒν™©μ—μ„œλŠ” λ°μ΄ν„°μ˜ 뢈일치 μƒνƒœλ₯Ό κ²ͺ을 수 μžˆλ‹€.

λ§Žμ€ 수의 NoSQL λ°μ΄ν„°λ² μ΄μŠ€κ°€ 샀딩(sharding)을 νŠΉμ§•μœΌλ‘œ λ‚΄μ„Έμš°κ³  μžˆλ‹€. 샀딩 기법을 μ‚¬μš©ν•  λ•Œ μ€‘μš”ν•œ λ¬Έμ œμ€‘μ˜ ν•˜λ‚˜λŠ” 데이터 μ•„μ΄ν…œμ„ μ–΄λŠ 물리적인 λ…Έλ“œμ— λ°°μΉ˜ν•˜λŠ” μ§€λ₯Ό κ²°μ •ν•˜λŠ” 것이닀. κ°€μž₯ λ‹¨μˆœν•œ 방법은 NodeID = hash(key) % TotalNodes 식을 μ‚¬μš©ν•˜μ—¬ λ…Έλ“œμ˜ μœ„μΉ˜λ₯Ό μ°ΎλŠ” 것이닀. μƒˆλ‘œμš΄ λ…Έλ“œμ˜ μΆ”κ°€λ‚˜ κΈ°μ‘΄ λ…Έλ“œμ˜ μ‚­μ œκ°€ μ•ΌκΈ°ν•˜λŠ” 전체 λ°μ΄ν„°μ˜ μž¬μ •λ¦¬(reshuffling)κ°€ λ°œμƒν•˜λŠ”λ°, ν•˜μ§€λ§Œ λ‚˜λ¨Έμ§€ 연산은 이런 ν΄λŸ¬μŠ€ν„°μ˜ μž¬μ‘°μ •μ„ 효율적으둜 지원할 수 μ—†κ³  결과적으둜 λ³΅μ œμ™€ μž₯μ• μ‘°μΉ˜(failover)λ₯Ό 닀루기 맀우 μ–΄λ ΅λ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ λ°©λ²•μœΌλ‘œ NoSQL λ°μ΄ν„°λ² μ΄μŠ€λ“€ 쀑 μΌλΆ€λŠ” consistent hashing을 μ‚¬μš©ν•œλ‹€. Consistent hashing의 κΈ°λ³Έ μ•„μ΄λ””μ–΄λŠ” 데이터 μ•„μ΄ν…œκ³Ό λ…Έλ“œλ“€μ΄ 같은 ν•΄μ‹œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 것이닀. λ…Έλ“œλ“€μ—κ²Œ 간격(interval)을 λ§€ν•‘ν•˜λŠ”λ°, 각 간격은 λ§Žμ€ 수의 데이터 μ•„μ΄ν…œ ν•΄μ‹œλ“€μ„ μ €μž₯ν•œλ‹€. λ…Έλ“œκ°€ ν΄λŸ¬μŠ€ν„°μ—μ„œ 제거되면, κ·Έ λ…Έλ“œμ˜ 간격은 μ΄μ›ƒν•œ 간격을 μ§€λ‹Œ λ…Έλ“œκ°€ κ°€μ Έκ°„λ‹€. λ‹€λ₯Έ λ…Έλ“œλ“€μ—κ²ŒλŠ” μ•„λ¬΄λŸ° λ³€ν™”κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

Types of NoSQL Systems

  • Key-Value Stores: κ°€μž₯ 기본적인 ν˜•μ‹μœΌλ‘œ λŒ€λΆ€λΆ„μ˜ NoSQL이 μ§€μ›ν•˜λŠ” μ €μž₯ κ°œλ…μΈ ν‚€/κ°’ ν˜•μ‹μ„ μ§€μ›ν•œλ‹€. Memcached, Redis, Dynamo, Voldemort, BerkeleyDB, 등이 μ§€μ›ν•œλ‹€.
  • Wide Column Stores: ν‚€/κ°’ μ €μž₯μ†Œμ˜ ν™•μž₯ κ°œλ…μœΌλ‘œ, κ°’μœΌλ‘œ 컬럼 νŒ¨λ°€λ¦¬ ν˜•νƒœλ₯Ό μ‚¬μš©ν•œλ‹€. Cassandra, Hbase, Hypertable, Accumulo, λ“±μ˜ μ˜€ν”ˆμ†ŒμŠ€κ°€ μ‘΄μž¬ν•œλ‹€.
  • Document Stores: ν‚€/κ°’ μ €μž₯μ†Œμ˜ ν™•μž₯된 κ°œλ…μœΌλ‘œ, κ°’μ˜ ν˜•νƒœλ‘œ XMLκ³Ό JSON ν˜•νƒœμ˜ λ¬Έμ„œ νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€. MongoDB, CouchDB, Couchbase, Dynamo, OrientDB, λ“±μ˜ μ†”λ£¨μ…˜μ΄ μžˆλ‹€.
  • Graph Database: ν…Œμ΄λΈ”κ°„μ˜ JOIN 연산이 μ•„λ‹ˆλΌ κ·Έλž˜ν”„μ—μ„œμ˜ 경둜 탐색 ν˜•νƒœμ˜ 연산이 많이 μ‚¬μš©λ˜λŠ” μ†Œμ…œ λ„€νŠΈμ›Œν¬ 뢄석 같은 κ·Έλž˜ν”„ μ‘μš© ν”„λ‘œκ·Έλž¨μ— 주둜 μ‚¬μš©λœλ‹€. Neo4j, InfiniteGraph, Titan, ArangoDB, Trinity, λ“±μ˜ μ†”λ£¨μ…˜μ΄ μžˆλ‹€.

Acknowledgements

  • NoSQL λ°μ΄ν„°λ² μ΄μŠ€ μ΅œμ‹  동ν–₯, κΆŒμ€€ν˜Έ(λΆ€μ‚°λŒ€ν•™κ΅), μ •λ³΄μ²˜λ¦¬ν•™νšŒμ§€ 제 22ꢌ 제 4호(2015. 7)