οΌ»λ…μ„œκΈ°λ‘οΌ½ 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 6μž₯

πŸ“– 제λͺ© : 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 : 6μž₯
πŸ™‹β€β™‚οΈ μ €μž : μ•Œλ ‰μŠ€ 쉬
6μž₯μ—μ„œλŠ” ν‚€-κ°’ μ €μž₯μ†Œ 섀계에 λŒ€ν•΄ 닀루고 μžˆλ‹€. μš°μ„  ν‚€-κ°’ μ €μž₯μ†Œκ°€ λ­”μ§€λΆ€ν„° μ•Œμ•„λ³Έ ν›„, 단일 μ„œλ²„ ν™˜κ²½μ—μ„œμ˜ ν‚€κ°’ μ €μž₯μ†Œμ—μ„œλΆ€ν„° λΆ„μ‚° μ‹œμŠ€ν…œμœΌλ‘œ ν™•μž₯ν•  κ²½μš°κΉŒμ§€ λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ μ„€κ³„μ˜ 핡심 κ°œλ…λ“€μ„ μ•Œμ•„λ³΄κΈ°λ‘œ ν•˜μž.

πŸ“Œν‚€-κ°’ μ €μž₯μ†Œλž€?

사싀 개발자라면 λ‹€λ“€ Map 같은 μžλ£Œν˜•μ—μ„œ ν‚€-κ°’ν˜•νƒœλ₯Ό 많이 보아왔을 것이닀. ν‚€-κ°’ μ €μž₯μ†Œλž€ μ‰½κ²Œ 말해 νŠΉμ •ν•œ ν‚€λ₯Ό μ•Œλ €μ£Όλ©΄, 그에 ν•΄λ‹Ήν•˜λŠ” 값을 λ°”λ‘œ μ°Ύμ•„μ£ΌλŠ” μ €μž₯μ†Œλ₯Ό λœ»ν•œλ‹€. 예λ₯Ό λ“€μ–΄ ν•Έλ“œν° μ „ν™”λ²ˆν˜ΈλΆ€λ₯Ό λ– μ˜¬λ €λ³΄μž.

  • β€œμ—„λ§ˆβ€ -> 010-1111-2222
  • β€œμ•„λΉ β€ -> 010-3333-4444 이런 ν˜•νƒœμ˜ 자료 κ΅¬μ‘°μ—μ„œ, 킀인 β€œμ—„λ§ˆβ€λ₯Ό μž…λ ₯ν•˜λ©΄ 그에 ν•΄λ‹Ήν•˜λŠ” 값인 β€œ010-1111-2222”λ₯Ό λ°”λ‘œ 찾을 수 μžˆλŠ” 게 ν‚€-κ°’ μ €μž₯μ†Œμ˜ ꡬ쑰이닀. ꡬ쑰가 λ‹¨μˆœν•˜κ³  λΉ λ₯΄κ²Œ 데이터λ₯Ό 찾을 수 μžˆλ‹€λŠ” μž₯점 λ•Œλ¬Έμ— μΊμ‹œ μ‹œμŠ€ν…œ, μ„Έμ…˜ 관리, κ°„λ‹¨ν•œ DB 역할에 많이 μ‚¬μš©λœλ‹€.

πŸ‘‰ λŒ€ν‘œμ μΈ ν‚€-κ°’ μ €μž₯μ†Œλ‘œ Redis, DynamoDB 등이 μžˆλ‹€.

πŸ“Œλ‹¨μΌ μ„œλ²„μ—μ„œμ˜ ν‚€-κ°’ μ €μž₯μ†Œ

단일 μ„œλ²„μ—μ„œλŠ” μ•„μ£Ό κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

1
2
3
Map<String, String> memoryStore = new HashMap<>();
memoryStore.put("μ—„λ§ˆ", "010-1234-5678");
System.out.println(memoryStore.get("μ—„λ§ˆ")); // 좜λ ₯: 010-1234-5678

πŸ‘‰ λ‹€λ§Œ μ΄λ ‡κ²Œ μ‚¬μš©ν•˜λ©΄ μ„œλ²„ λ©”λͺ¨λ¦¬ μ•ˆμ—μ„œλ§Œ μž‘λ™ν•˜κ³ , μ„œλ²„κ°€ λ‚΄λ €κ°ˆ λ•Œ μ €μž₯된 데이터듀도 λ‹€ 사라진닀.

단일 μ„œλ²„λ‘œ ν‚€-κ°’ μ €μž₯μ†Œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 건 쉽고 λΉ λ₯΄μ§€λ§Œ, μ‹€μ œ μ„œλΉ„μŠ€μ—μ„œ μš΄μš©ν•˜λ €κ³  ν•˜λ©΄ λ‹€μŒκ³Ό 같은 λ¬Έμ œλ“€μ΄ μƒκΈ°κ²Œ λœλ‹€.

  1. λ©”λͺ¨λ¦¬ ν•œκ³„ : μ €μž₯ν•  데이터가 λ„ˆλ¬΄ λ§Žμ•„μ§€λ©΄ RAM이 λΆ€μ‘±ν•΄μ§„λ‹€.
  2. μž₯애에 μ·¨μ•½ : μœ„μ—μ„œ μ„€λͺ…ν•œ κ²ƒμ²˜λŸΌ μ„œλ²„κ°€ λ‚΄λ €κ°€λ©΄ μ €μž₯된 데이터듀도 λ‹€ 사라진닀.
  3. νŠΈλž˜ν”½ 증가에 λŒ€μ‘ν•˜μ§€ λͺ»ν•¨ : λ™μ‹œμ— 수천λͺ…이 μ ‘μ†ν•˜λ©΄ λ²„λ²…κ±°λ¦¬κ²Œ λœλ‹€.

πŸ‘‰ κ·Έλž˜μ„œ μ„œλ²„λ₯Ό μ—¬λŸ¬ λŒ€λ‘œ λ‚˜λˆ μ„œ λΆ„μ‚° μ²˜λ¦¬ν•˜λŠ” 섀계가 ν•„μš”ν•΄μ§€λŠ” 것.

πŸ“Œ λΆ„μ‚° ν‚€-κ°’ μ €μž₯μ†Œλž€?

μ—¬λŸ¬ μ„œλ²„κ°€ λ‚˜λˆ μ„œ ν‚€-κ°’ 데이터λ₯Ό λ³΄κ΄€ν•˜λŠ” ꡬ쑰닀.

  • μ„œλ²„A : β€œμ—„λ§ˆβ€, β€œμ•„λΉ β€
  • μ„œλ²„B : β€œμΉœκ΅¬1”, β€œμΉœκ΅¬2”
  • μ„œλ²„C : β€œνšŒμ‚¬λ™λ£Œ1”, β€œνšŒμ‚¬λ™λ£Œ2”

이런 식이닀. μ΄λ ‡κ²Œ 데이터λ₯Ό λΆ„μ‚°ν–ˆμ„ λ•Œμ΄ μž₯점은 μ„œλ²„ ν•œ λŒ€κ°€ 망가져도 전체 μ‹œμŠ€ν…œμ€ 계속 μž‘λ™ν•œλ‹€λŠ” 것, 더 λ§Žμ€ 데이터λ₯Ό μ €μž₯ν•  수 μžˆλ‹€λŠ” 점, λ§Žμ€ μš”μ²­μ΄ λ™μ‹œμ— 듀어와도 λ‚˜λˆ μ„œ μ²˜λ¦¬ν•  수 μžˆλ‹€λŠ” 점이닀.

πŸ“Œ λ°μ΄ν„°λŠ” μ–΄λ–»κ²Œ λ‚˜λˆ μ„œ μ €μž₯ν•˜λ©΄ μ’‹μ„κΉŒ?

μ§€λ‚œ μž₯μ—μ„œ λ°°μ› λ˜ μ•ˆμ • ν•΄μ‹œκ°€ μ—¬κΈ°μ—μ„œ λ“±μž₯ν•œλ‹€. μ•ˆμ • ν•΄μ‹œλ₯Ό μ΄μš©ν•˜μ—¬ μ›ν˜• ν•΄μ‹œ 링 μœ„μ— 데이터λ₯Ό λ°°μΉ˜ν•˜κ³ , μƒˆλ‘œ μ„œλ²„λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•΄λ„ 데이터 이동이 μ΅œμ†Œν™” λ˜λ„λ‘ ν•  수 μžˆλ‹€. κ·Έ 밖에, ν˜Ήμ‹œ λͺ¨λ₯Ό μž₯μ•  λŒ€λΉ„μš©μœΌλ‘œ 데이터λ₯Ό 백업해두면 μ„œλ²„ Aκ°€ 망가져도 A-1μ—μ„œ 데이터λ₯Ό 읽을 수 μžˆλ‹€.

πŸ‘‰ CAP 이둠에 λŒ€ν•΄ μ•Œμ•„λ³΄μž

CAP은 Consistency(일관성), Availability(κ°€μš©μ„±), Partition Tolerance(λΆ„ν•  ν—ˆμš©μ„±)의 μ•½μžμ΄λ‹€. 이 이둠은 β€œμ μ ˆν•œ μ‘λ‹΅μ‹œκ°„ 내에 μ„Έ κ°€μ§€ 속성을 λͺ¨λ‘ λ§Œμ‘±μ‹œν‚€λŠ” λΆ„μ‚° μ‹œμŠ€ν…œμ„ ꡬ성할 수 μ—†λ‹€β€λŠ” 이둠이닀. 즉, λΆ„μ‚° λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ€ 뢄할이 생겼을 λ•Œ 일관성과 κ°€μš©μ„± 쀑 ν•˜λ‚˜λ₯Ό 희생해야 ν•œλ‹€λŠ” μ˜λ―Έλ‹€. μ™œ β€˜λΆ„ν•  ν—ˆμš©μ„±β€™μ„ 희생할 μˆ˜λŠ” μ—†λƒν•˜λ©΄, λΆ„μ‚° λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ€ λ°˜λ“œμ‹œ λ„€νŠΈμ›Œν¬ μž₯μ• λ‚˜ μ—¬λŸ¬ μ΄μœ λ“€λ‘œ 인해 μž₯μ• κ°€ λ°œμƒν•  μˆ˜λ°–μ— μ—†μœΌλ―€λ‘œ λΆ„ν•  ν—ˆμš©μ„±μ„ κ°€μ§€κ³  μžˆμ–΄μ•Ό ν•œλ‹€. κ·Έλž˜μ„œ λ‚˜λ¨Έμ§€ 일관성과 κ°€μš©μ„± 쀑에 ν•œ μͺ½μ„ 선택해야 ν•˜λŠ” 것이닀.
참고둜 MongoDBλŠ” CPλ₯Ό, CassandraλŠ” APλ₯Ό λ§Œμ‘±ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆλ‹€.

μ°Έκ³ ν•΄μ„œ 읽으면 쒋을 κΈ€ : CAP 이둠 μ†Œκ°œ

πŸ‘‰ μž₯μ•  상황을 μ²˜λ¦¬ν•˜λŠ” 방법

μ„œλ²„κ°€ μΌμ‹œμ μœΌλ‘œ λ‹€μš΄λ˜μ—ˆλ‹€λ©΄ : 데이터λ₯Ό λ‹€λ₯Έ μ„œλ²„μ— μž„μ‹œλ‘œ μ €μž₯ν–ˆλ‹€κ°€ λ‚˜μ€‘μ— μ „λ‹¬ν•˜λŠ” νžŒν‹°λ“œ ν•Έλ“œμ˜€ν”„ 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.
μ˜€λž«λ™μ•ˆ μ„œλ²„ μž₯μ• κ°€ λ°œμƒν•œλ‹€λ©΄ : μ„œλ²„ κ°„μ˜ 데이터λ₯Ό λΉ„κ΅ν•˜κ³  동기화 ν•œλ‹€. μ΄λ•Œ 머클 트리(Merkle Tree)λΌλŠ” 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•˜λ©΄ νš¨μœ¨μ μ΄λ‹€.

πŸ“Œ 버전 μΆ©λŒμ€ μ–΄λ–»κ²Œ ν•΄κ²°ν• κΉŒ?

예λ₯Ό λ“€μ–΄, λ‚˜μ™€ λ‹€λ₯Έ μ‚¬λžŒμ΄ λ™μ‹œμ— 같은 ν‚€ β€œμ—„λ§ˆβ€μ— μ„œλ‘œ λ‹€λ₯Έ 값을 μ €μž₯ν•˜λ € ν•˜λŠ” λ¬Έμ œκ°€ 생길 수 μžˆλ‹€. 이 λ•ŒλŠ” 버전 관리가 ν•„μš”ν•˜λ‹€. 벑터 μ‹œκ³„ 같은 기법을 μ¨μ„œ, β€œλˆ„κ°€ λ¨Όμ € μˆ˜μ •ν–ˆλŠ”μ§€β€, β€œμΆ©λŒμ΄ λ°œμƒν–ˆλŠ”μ§€β€λ₯Ό 확인할 수 μžˆλ‹€.

πŸ‘‰ 벑터 μ‹œκ³„λž€?
각각의 λ…Έλ“œκ°€ 자기만의 μ‹œκ³„λ₯Ό κ°€μ§€κ³  있고, 데이터λ₯Ό μˆ˜μ •ν•  λ•Œ λ§ˆλ‹€ 자기 μ‹œκ³„λ₯Ό μ¦κ°€μ‹œν‚¨λ‹€. κ·Έλž˜μ„œ λ³€κ²½ 이둝이 기둝되면 좩돌이 λ‚¬λŠ”μ§€, λˆ„κ°€ 더 μ΅œμ‹ μΈμ§€λ₯Ό νŒλ‹¨ ν•  수 μžˆλ‹€. μΆ©λŒν•˜λŠ” 경우 μ‚¬μš©μžμ—κ²Œ β€œλ‘˜ 쀑 ν•˜λ‚˜λ₯Ό 선택” ν•˜κ²Œ ν•˜κ±°λ‚˜, μžλ™ 병합 λ‘œμ§μ„ 적용 ν•  수 μžˆλ‹€.

πŸ“Œ κ·Έ 밖에 μ•Œμ•„λ‘λ©΄ 쒋은 것듀

  • 가상 λ…Έλ“œ : 5μž₯μ—μ„œλ„ ν•œ 번 λ‹€λ£¨μ—ˆλŠ”λ°, 가상 λ…Έλ“œ μ—¬λŸ¬κ°œλ₯Ό λ§Œλ“€μ–΄μ„œ μ„œλ²„ ν•˜λ‚˜κ°€ μ—¬λŸ¬ 쑰각의 데이터λ₯Ό λ‹΄λ‹Ήν•˜λ„λ‘ ν•˜λ©΄ 더 κ³ λ₯΄κ²Œ 데이터가 λΆ„μ‚°λ˜λŠ” 기법이닀.
  • λΈ”λ£Έ ν•„ν„° : μ–΄λ–€ ν‚€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ λΉ λ₯΄κ²Œ νŒλ³„ν•˜λŠ” 필터링 λ°©μ‹μœΌλ‘œ, DB에 μ—†λŠ” ν‚€λŠ” κ²€μƒ‰ν•˜μ§€ μ•Šκ³  λ°”λ‘œ β€˜μ—†μŒβ€™μ΄λΌκ³  μ•Œλ €μ£Όμ–΄μ„œ μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.