GCP Cloud Spanner는 Google의 완전 관리형 글로벌 분산 관계형 데이터베이스로, 수평 확장이 가능하면서도 강한 ACID 일관성과 SQL을 지원하는 독특한 제품이다.
CAP 이론과 Spanner
기존 CAP 이론에서 분산 시스템은 일관성(C)과 가용성(A) 중 하나를 포기해야 했다. Spanner는 TrueTime API(원자 시계 + GPS)를 활용해 CP를 달성하면서도 99.999% 가용성을 제공한다.
Spanner vs 경쟁 제품
| 항목 | Spanner | Aurora Global | CockroachDB |
|---|
| 일관성 | 외부 일관성 | 리전 간 지연 | 직렬화 가능 |
| 글로벌 분산 | 네이티브 | 읽기 복제본 | 네이티브 |
| 관리 | 완전 관리형 | 완전 관리형 | 자체/클라우드 |
| 호환성 | GoogleSQL, PostgreSQL | MySQL/PostgreSQL | PostgreSQL |
| 비용 | 매우 높음 | 중간 | 중간 |
인터리브 테이블 (계층 구조)
sql
-- 부모 테이블
CREATE TABLE Customers (
CustomerId INT64 NOT NULL,
Name STRING(MAX),
Email STRING(MAX),
) PRIMARY KEY (CustomerId);
-- 자식 테이블 인터리브 (물리적으로 함께 저장)
CREATE TABLE Orders (
CustomerId INT64 NOT NULL,
OrderId INT64 NOT NULL,
Amount FLOAT64,
CreatedAt TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true),
) PRIMARY KEY (CustomerId, OrderId),
INTERLEAVE IN PARENT Customers ON DELETE CASCADE;
python
from google.cloud import spanner
instance_id = "my-instance"
database_id = "my-database"
spanner_client = spanner.Client()
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
# 읽기-쓰기 트랜잭션
def create_order(transaction, customer_id: int, amount: float):
row_ct = transaction.execute_update(
"INSERT INTO Orders (CustomerId, OrderId, Amount, CreatedAt) "
"VALUES (@cid, @oid, @amount, PENDING_COMMIT_TIMESTAMP())",
params={"cid": customer_id, "oid": generate_id(), "amount": amount},
param_types={
"cid": spanner.param_types.INT64,
"oid": spanner.param_types.INT64,
"amount": spanner.param_types.FLOAT64,
},
)
return row_ct
database.run_in_transaction(create_order, customer_id=123, amount=99.99)
# 강한 읽기
with database.snapshot() as snapshot:
results = snapshot.execute_sql(
"SELECT o.OrderId, o.Amount FROM Orders o WHERE o.CustomerId = @cid",
params={"cid": 123},
param_types={"cid": spanner.param_types.INT64},
)
for row in results:
print(row)