> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sifi.life/llms.txt
> Use this file to discover all available pages before exploring further.

# Lakebase 백업·모니터링·네트워크 설정

> Lakebase의 백업/복구, 모니터링, 네트워크(Private Link), 비용 관리, 그리고 전체 설정 실습을 다룹니다.

> [Lakebase 설정](lakebase-setup) 페이지에서 이어지는 내용입니다.

***

## 6단계: 백업 및 복구

### 자동 백업

Lakebase는 **자동으로 지속적인 백업** 을 수행합니다. 별도의 백업 설정이 필요 없습니다.

| 기능                         | 설명                               |
| -------------------------- | -------------------------------- |
| **자동 백업**                  | 지속적으로 자동 수행됩니다. 별도 설정 불필요합니다     |
| **보존 기간**                  | 최대 **35일** 동안 백업이 유지됩니다          |
| **Point-in-Time Recovery** | 보존 기간 내의 **임의 시점** 으로 복원할 수 있습니다 |
| **복원 소요 시간**               | 데이터 크기에 따라 수 분\~수십 분이 소요됩니다      |

### Point-in-Time Recovery

```python theme={null}
from databricks.sdk import WorkspaceClient
from datetime import datetime, timedelta

w = WorkspaceClient()

# 2시간 전 시점으로 복원
restore_time = datetime.utcnow() - timedelta(hours=2)

restored_db = w.lakebase.restore_database(
    catalog_name="my_catalog",
    schema_name="my_schema",
    name="app_db_restored",
    source_database="app_db",
    restore_point=restore_time.isoformat()
)

print(f"복원 완료: {restored_db.name}")
print(f"복원 시점: {restore_time}")
```

> 💡 **복원은 새 인스턴스로 생성됩니다**: Point-in-Time Recovery는 기존 데이터베이스를 덮어쓰지 않고, **새로운 데이터베이스 인스턴스** 를 생성합니다. 이를 통해 원본 데이터의 안전성을 보장합니다.

***

## 7단계: 모니터링 및 메트릭

### 주요 모니터링 지표

| 메트릭                      | 설명              | 주의 기준             |
| ------------------------ | --------------- | ----------------- |
| **active\_connections**  | 현재 활성 연결 수      | 최대 연결 수의 80% 초과 시 |
| **cpu\_utilization**     | CPU 사용률         | 80% 이상 지속 시       |
| **storage\_used\_bytes** | 사용 중인 스토리지      | 7TB 이상 시 (최대 8TB) |
| **query\_latency\_p99**  | 99번째 백분위 쿼리 지연  | 요구사항 대비 초과 시      |
| **replication\_lag**     | Data Sync 복제 지연 | 목표 SLA 초과 시       |

### SQL로 상태 확인

```sql theme={null}
-- 현재 활성 연결 확인 (Lakebase에 직접 접속하여 실행)
SELECT count(*) AS active_connections
FROM pg_stat_activity
WHERE state = 'active';

-- 테이블별 크기 확인
SELECT
    tablename,
    pg_size_pretty(pg_total_relation_size(tablename::regclass)) AS total_size,
    n_live_tup AS row_count
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(tablename::regclass) DESC;

-- 느린 쿼리 확인 (5초 이상)
SELECT
    query,
    calls,
    mean_exec_time / 1000 AS avg_seconds,
    total_exec_time / 1000 AS total_seconds
FROM pg_stat_statements
WHERE mean_exec_time > 5000
ORDER BY total_exec_time DESC
LIMIT 10;
```

***

## 8단계: 네트워크 설정

### Private Link (프라이빗 연결)

프로덕션 환경에서는 **Private Link** 를 통해 인터넷을 거치지 않고 Lakebase에 접근하는 것을 권장합니다.

| 연결 방식            | 트래픽 경로        | 보안 수준 | 적합한 환경  |
| ---------------- | ------------- | ----- | ------- |
| **퍼블릭 엔드포인트**    | 인터넷 (SSL 암호화) | 중간    | 개발, PoC |
| **Private Link** | 클라우드 내부 네트워크  | 높음    | 프로덕션    |

| 구성 요소                         | 역할      | 설명                         |
| ----------------------------- | ------- | -------------------------- |
| **앱 서버 (앱 VPC)**              | 클라이언트   | 앱에서 Lakebase에 접근합니다        |
| **Private Link**              | 프라이빗 연결 | 인터넷을 경유하지 않는 안전한 연결입니다     |
| **Private Endpoint**          | 엔드포인트   | 프라이빗 네트워크 엔드포인트입니다         |
| **Lakebase (Databricks VPC)** | 데이터베이스  | Private Endpoint를 통해 접근합니다 |

> ⚠️ **Private Link 설정**: Private Link 구성에는 클라우드 네트워크 관리자의 협조가 필요합니다. AWS의 경우 VPC Endpoint, Azure의 경우 Private Endpoint를 설정해야 합니다.

***

## 9단계: 비용 관리

### 비용 구성 요소

| 항목            | 과금 기준                     | 절약 팁                         |
| ------------- | ------------------------- | ---------------------------- |
| **컴퓨팅**       | DBU (Databricks Unit) 사용량 | 오토스케일링이 자동으로 유휴 시간 비용을 절감합니다 |
| **스토리지**      | GB 단위 월별 과금               | 불필요한 데이터를 정기적으로 정리합니다        |
| **Data Sync** | 동기화된 데이터 볼륨               | TRIGGERED 모드로 비용을 줄일 수 있습니다  |
| **네트워크**      | 리전 간 데이터 전송               | 같은 리전에 앱과 Lakebase를 배치합니다    |

### 비용 절감 체크리스트

1. **개발 환경은 TRIGGERED 모드** 사용 — CONTINUOUS는 프로덕션에서만 필요합니다
2. **불필요한 인덱스 정리**— 인덱스가 많으면 스토리지와 쓰기 비용이 증가합니다
3. **오래된 데이터 아카이빙**— Delta Lake로 동기화된 데이터는 Lakebase에서 삭제할 수 있습니다
4. **Branching 정리**— 사용하지 않는 브랜치는 삭제하여 스토리지를 절약합니다

***

## 실습: 처음부터 끝까지 설정하기

다음은 이커머스 앱의 백엔드로 Lakebase를 설정하는 전체 과정입니다.

```python theme={null}
from databricks.sdk import WorkspaceClient
import psycopg2

# 1. 워크스페이스 클라이언트 초기화
w = WorkspaceClient()

# 2. Lakebase 데이터베이스 생성
db = w.lakebase.create_database(
    catalog_name="production",
    schema_name="ecommerce",
    name="shop_db"
)
print(f"✅ 데이터베이스 생성: {db.host}:{db.port}")

# 3. 연결
conn = psycopg2.connect(
    host=db.host,
    port=db.port,
    dbname="shop_db",
    user="token",
    password="dapi_your_token",
    sslmode="require"
)
cursor = conn.cursor()

# 4. 테이블 생성
cursor.execute("""
    CREATE TABLE customers (
        id          SERIAL PRIMARY KEY,
        name        VARCHAR(100) NOT NULL,
        email       VARCHAR(200) UNIQUE NOT NULL,
        tier        VARCHAR(20) DEFAULT 'standard',
        created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    CREATE TABLE orders (
        id          SERIAL PRIMARY KEY,
        customer_id INTEGER REFERENCES customers(id),
        product     VARCHAR(200) NOT NULL,
        amount      DECIMAL(10,2) NOT NULL,
        status      VARCHAR(20) DEFAULT 'pending',
        created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    CREATE INDEX idx_orders_customer ON orders(customer_id);
    CREATE INDEX idx_orders_status ON orders(status);
""")
conn.commit()
print("✅ 테이블 생성 완료")

# 5. 샘플 데이터 입력
cursor.execute("""
    INSERT INTO customers (name, email, tier) VALUES
    ('김철수', 'cs.kim@example.com', 'premium'),
    ('이영희', 'yh.lee@example.com', 'standard'),
    ('박민수', 'ms.park@example.com', 'premium');
""")

cursor.execute("""
    INSERT INTO orders (customer_id, product, amount, status) VALUES
    (1, '노트북', 1500000, 'completed'),
    (1, '마우스', 35000, 'completed'),
    (2, '키보드', 89000, 'pending'),
    (3, '모니터', 450000, 'shipped');
""")
conn.commit()
print("✅ 샘플 데이터 입력 완료")

# 6. 데이터 확인
cursor.execute("""
    SELECT c.name, o.product, o.amount, o.status
    FROM orders o
    JOIN customers c ON o.customer_id = c.id
    ORDER BY o.amount DESC
""")
for row in cursor.fetchall():
    print(f"  {row[0]}: {row[1]} - ₩{row[2]:,.0f} ({row[3]})")

# 출력 예시:
# 김철수: 노트북 - ₩1,500,000 (completed)
# 박민수: 모니터 - ₩450,000 (shipped)
# 이영희: 키보드 - ₩89,000 (pending)
# 김철수: 마우스 - ₩35,000 (completed)

conn.close()
print("✅ 설정 완료!")
```

***

## 정리

| 설정 단계       | 핵심 사항                                       |
| ----------- | ------------------------------------------- |
| **인스턴스 생성** | UI, SQL, Python SDK 모두 지원됩니다. 1\~3분 내 생성됩니다 |
| **연결 설정**   | 표준 PostgreSQL 프로토콜, SSL 필수입니다               |
| **사이징**     | 오토스케일링이 자동으로 처리하므로 기본 설정으로 시작합니다            |
| **사용자 관리**  | Unity Catalog 통합 권한 관리를 사용합니다               |
| **인증**      | 프로덕션은 OAuth/서비스 프린시펄을 사용합니다                 |
| **백업**      | 자동 백업 (35일), Point-in-Time Recovery를 지원합니다  |
| **모니터링**    | pg\_stat 뷰와 Databricks 메트릭으로 상태를 확인합니다      |
| **네트워크**    | 프로덕션은 Private Link를 권장합니다                   |

***

## 참고 링크

* [Databricks: Create Lakebase Database](https://docs.databricks.com/aws/en/lakebase/)
* [Azure Databricks: Lakebase](https://learn.microsoft.com/en-us/azure/databricks/lakebase/)
* [Databricks: Unity Catalog Privileges](https://docs.databricks.com/aws/en/data-governance/unity-catalog/manage-privileges/)
* [Databricks: Private Link](https://docs.databricks.com/aws/en/security/network/classic/privatelink.html)
* [PostgreSQL: psycopg2 Documentation](https://www.psycopg.org/docs/)
