ποΈ 100λ§ μ¬μ©μ νμ₯μ μν μν€ν μ²: λ΄κ° 미리 μμλλΌλ©΄ μ’μμ κ²λ€
ποΈ 100λ§ μ¬μ©μ νμ₯μ μν μν€ν μ²: λ΄κ° 미리 μμλλΌλ©΄ μ’μμ κ²λ€
μ΄κΈ°μλ 100λͺ
μ μΌμΌ μ¬μ©μλ§μΌλ‘λ λ§μ‘±μ€λ¬μ μ§λ§,
λͺ λ¬ λ§μ 10,000λͺ
, 100,000λͺ
μΌλ‘ κΈμ¦νλ©΄μ κΈ°μ‘΄ μν€ν
μ²μ νκ³κ° λλ¬λ¬μ΅λλ€.
1,000λͺ
μ μν΄ μ€κ³λ μμ€ν
μ 100λ§ λͺ
μ μ¬μ©μλ₯Ό κ°λΉνμ§ λͺ»νμ΅λλ€.
μ΄ κΈμμλ μ°λ¦¬κ° κ²ͺμλ λ¬Έμ μ κ·Έ ν΄κ²° κ³Όμ μ 곡μ ν©λλ€.
π§± 1λ¨κ³: λ¨μΌ λͺ¨λ리μ μν€ν μ²μ νκ³
π» μ΄κΈ° μν€ν μ² κ΅¬μ±
- Spring Boot μ ν리μΌμ΄μ
- MySQL λ°μ΄ν°λ² μ΄μ€
- NGINX λ‘λ λ°Έλ°μ
- λͺ¨λ κ²μ΄ νλμ VMμ λ°°ν¬λ¨
β οΈ λ¬Έμ μ
- CPU μ¬μ©λ₯ μ΅λμΉ λλ¬
- 쿼리 μλ μ ν
- κ°μ©μ± 99% μ΄νλ‘ κ°μ
- DB μ κΈ, GC μ§μ°, μ€λ λ κ²½μ λ°μ
β κ΅ν
λ¨μΌ μλ²μ λͺ¨λ리μ ꡬ쑰λ‘λ μ¬μ©μκ° κΈμ¦ν λ λ³λͺ©μ΄ λ°μνμ¬ μμ€ν μ΄ λΆμμ ν΄μ§λλ€.
π 2λ¨κ³: μλ² μ μ¦κ°λ‘λ ν΄κ²°λμ§ μλ λ³λͺ© νμ
π οΈ μ‘°μΉ μ¬ν
- μλ² μλ₯Ό λλ € μν νμ₯ μλ
- λ‘λ λ°Έλ°μ±μΌλ‘ νΈλν½ λΆμ°
π₯ μ¬μ ν λ°μν λ¬Έμ
- λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ μ ν
- GC μ§μ°μΌλ‘ μΈν μλ΅ μκ° μ¦κ°
- λΆκ· νν νΈλν½ λΆμ° λ¬Έμ
β κ΅ν
λ¨μν μλ² μλ₯Ό λ리λ κ²λ§μΌλ‘λ κ·Όλ³Έμ μΈ λ³λͺ© λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
λ°μ΄ν°λ² μ΄μ€ νμ₯μ± λ¬Έμ μ GC νλμ λ¨Όμ κ³ λ €ν΄μΌ ν©λλ€.
π§© 3λ¨κ³: λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²λ‘μ μ ν
π‘ μ ν μ λ΅
- λͺ¨λ리ν±μ λ§μ΄ν¬λ‘μλΉμ€λ‘ λΆλ¦¬
- μλΉμ€λ³ λ 립 λ°°ν¬ λ° νμ₯
- μλΉμ€ κ° ν΅μ μ μν λ©μμ§ ν λμ (μ: RabbitMQ, Kafka)
π ν¨κ³Ό
- μλΉμ€λ³ λ 립μ νμ₯ κ°λ₯
- μ₯μ λ°μ μ νΉμ μλΉμ€λ§ μ€λ¨
- κ°λ° λ° λ°°ν¬ μλ ν₯μ
π‘ μμ μ½λ: FastAPIλ₯Ό μ΄μ©ν μλΉμ€ λΆλ¦¬
from fastapi import FastAPI
app = FastAPI()
@app.get("/user/{user_id}")
async def get_user(user_id: int):
return {"user_id": user_id, "status": "active"}
ποΈ 4λ¨κ³: λ°μ΄ν°λ² μ΄μ€ μ€λ© λ° μΊμ± μ λ΅
ποΈ λ°μ΄ν°λ² μ΄μ€ λ¬Έμ ν΄κ²° μ λ΅
- μ¬μ©μ ID κΈ°λ° λ°μ΄ν°λ² μ΄μ€ μ€λ©
- Redisλ₯Ό νμ©ν μΊμ±μΌλ‘ μ½κΈ° λΆν κ°μ
- μ½κΈ°/μ°κΈ° λΆλ¦¬λ‘ λ°μ΄ν°λ² μ΄μ€ λΆν λΆμ°
π‘ μμ μ½λ: Redis μΊμ±
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
# λ°μ΄ν° μΊμ±
r.set("user:1001", "active")
# μΊμ λ°μ΄ν° μ‘°ν
status = r.get("user:1001")
print(f"User 1001 status: {status.decode()}")
π 5λ¨κ³: λͺ¨λν°λ§ λ° μλ νμ₯
π λͺ¨λν°λ§ λꡬ
- Prometheus: λ©νΈλ¦ μμ§ λ° μκ°ν
- Grafana: λμ보λ κ΅¬μ± λ° κ²½κ³ μ€μ
π μλ νμ₯ μ€μ
- CPU μ¬μ©λ₯ μ΄ 80% μ΄μμΌ λ μλμΌλ‘ μΈμ€ν΄μ€ μΆκ°
- λ©λͺ¨λ¦¬ μ¬μ©λ₯ μ΄ 75% μ΄νλ‘ λ¨μ΄μ§λ©΄ μΈμ€ν΄μ€ μΆμ
π‘ μμ μ½λ: Prometheus μ€μ
global:
scrape_interval: 15s
scrape_configs:
- job_name: "my_service"
static_configs:
- targets: ["localhost:8000"]
π‘ μ μ μκ°
μμ€ν
μ νμ₯νλ κ³Όμ μμ κ°μ₯ μ€μν κ²μ μ΄κΈ° μ€κ³ λ¨κ³μμ νμ₯μ±μ κ³ λ €νλ κ²μ
λλ€.
μ΄κΈ°μλ λ¨μν κ΅¬μ‘°κ° λΉ λ₯Έ κ°λ°κ³Ό λ°°ν¬μ μ 리ν μ μμ§λ§,
μ¬μ©μ μκ° κΈμ¦νλ©΄μ ꡬ쑰μ νκ³μ λΆλͺνκ² λ©λλ€.
κ°μΈμ μΌλ‘λ λ§μ΄ν¬λ‘μλΉμ€ μν€ν
μ²μ λ°μ΄ν°λ² μ΄μ€ μ€λ©μ ν΅ν νμ₯μ΄
λκ·λͺ¨ νΈλν½μ μ²λ¦¬νλ λ° κ°μ₯ ν¨κ³Όμ μ΄μλ€κ³ λκΌμ΅λλ€.
λν, λͺ¨λν°λ§κ³Ό μλ νμ₯μ ν΅ν΄ μ€μκ°μΌλ‘ μμ€ν
μνλ₯Ό κ΄λ¦¬νλ κ²μ΄
μμ μ μΈ μλΉμ€ μ΄μμ ν΅μ¬μ
λλ€.
μμΌλ‘ μλ‘μ΄ νλ‘μ νΈλ₯Ό μμν λλ μ΄κΈ°λΆν° νμ₯μ±μ κ³ λ €ν μ€κ³λ₯Ό ν΅ν΄
λΉμ© μ κ°κ³Ό μμ μ± ν보λ₯Ό λμμ μΆκ΅¬νλ κ²μ΄ νμνλ€κ³ μκ°ν©λλ€.
μμ€ν
νμ₯μ±, λ§μ΄ν¬λ‘μλΉμ€ μν€ν
μ², λ°μ΄ν°λ² μ΄μ€ μ€λ©, μΊμ± μ λ΅, μλ νμ₯, λͺ¨λν°λ§,
Spring Boot, FastAPI, Redis, Prometheus, Grafana