"매 distributed 의 매 3 중 매 2 만" — Eric Brewer (2000). Consistency + Availability + Partition tolerance — 매 partition 가 inevitable → 매 CP / AP 의 trade-off. 매 modern 의 PACELC 의 보완 — 매 partition 외 의 latency-consistency.
Partition → A or C; Else → L (latency) or C (consistency).
System
PA / PC
EL / EC
MongoDB
PC (default)
EL
DynamoDB
PA
EL
Cassandra
PA
EL
HBase
PC
EC
Spanner
PC
EC
Postgres (sync replica)
PC
EC
Postgres (async)
PA
EL
Consistency level
Strict / Linearizability
매 like 매 single machine.
매 expensive (cross-region 의 round trip).
Sequential
매 program order.
Causal
매 cause-effect 만.
Read-your-writes
매 own write 의 read OK.
Eventual
매 결국 의 converge.
매 weakest 가 매 fastest.
매 BASE (vs ACID)
BASE = Basically Available, Soft state, Eventual consistency.
매 NoSQL 의 paradigm.
매 ACID 의 strong vs BASE 의 loose.
매 modern reality
매 hybrid: 매 region 별 의 다른 model.
매 Spanner: 매 global linearizable (TrueTime API).
매 CRDTs: 매 commutative 의 eventual consistency 의 conflict-free.
매 Raft / Paxos: 매 majority quorum 의 CP.
매 응용 의 결정
CP 선호
매 financial transaction.
매 distributed lock.
매 counter (unique).
매 schema migration.
AP 선호
매 social feed.
매 product catalog (cache).
매 shopping cart.
매 click tracking.
매 misconception
"CP = always consistent": 매 partition 시 의 unavailable.
"AP = always available": 매 partition 시 만 의 stale.
"Eventual = OK": 매 conflict resolution 의 critical.
"P 의 optional": 매 X — 매 distributed 의 P 의 inevitable.
💻 패턴
Eventual consistency (Cassandra)
fromcassandra.clusterimportClusterfromcassandraimportConsistencyLevelsession=Cluster(['127.0.0.1']).connect('mykeyspace')# 매 write — 매 ANY (가장 weak)write_stmt=session.prepare("INSERT INTO users (id, name) VALUES (?, ?)")write_stmt.consistency_level=ConsistencyLevel.LOCAL_ONEsession.execute(write_stmt,[user_id,name])# 매 read — 매 strong consistency 가 필요 시 의 QUORUMread_stmt=session.prepare("SELECT * FROM users WHERE id = ?")read_stmt.consistency_level=ConsistencyLevel.LOCAL_QUORUMresult=session.execute(read_stmt,[user_id])# 매 quorum write + quorum read = 매 strong consistency.
Raft consensus (etcd)
importetcd3client=etcd3.client(host='localhost',port=2379)# 매 strong consistency 의 writeclient.put('/config/feature_flag','true')# 매 read (sequential)value,_=client.get('/config/feature_flag')# 매 distributed lock (CP)lock=client.lock('my-resource',ttl=10)iflock.acquire():try:do_critical_section()finally:lock.release()
classStickyClient:def__init__(self,replica_pool):self.pool=replica_poolself.last_write_replica=Nonedefwrite(self,key,value):# 매 write 의 leaderleader=self.pool.leader()leader.write(key,value)self.last_write_replica=leaderdefread(self,key):# 매 own write 의 read 시 matched replicaifself.last_write_replica:returnself.last_write_replica.read(key)# 매 else anyreturnself.pool.any().read(key)
Quorum (Cassandra 식)
# 매 R + W > N → 매 strong consistencyN=3# 매 replicaW=2# 매 write quorumR=2# 매 read quorum# 매 R + W = 4 > N = 3 → 매 latest 의 read 보장.
Multi-region with Spanner-like
-- 매 Spanner: 매 global strong consistency
BEGINTRANSACTION;INSERTINTOorders(id,user_id,total)VALUES(uuid(),123,100);UPDATEinventorySETcount=count-1WHEREid='item-456';COMMIT;-- 매 TrueTime 의 timestamp 의 ordering 의 보장.
Hybrid: CP critical + AP rest
classHybridStore:def__init__(self):self.cp_store=etcd3.client()# 매 CPself.ap_store=redis.Redis()# 매 AP cachedefget(self,key,strict=False):ifstrict:returnself.cp_store.get(key)[0]cached=self.ap_store.get(key)ifcached:returncachedvalue=self.cp_store.get(key)[0]self.ap_store.set(key,value,ex=60)returnvaluedefset(self,key,value):self.cp_store.put(key,value)self.ap_store.delete(key)# 매 invalidate
🤔 결정 기준
상황
Choice
Money / lock
CP (Spanner, etcd, Postgres)
Social feed
AP (Cassandra, DynamoDB)
Cart
AP + CRDT
Counter
CP (Spanner) or CRDT
Search
AP + eventual
Config
CP (etcd, Zookeeper)
Cache
AP + TTL
Multi-region linear
Spanner / FoundationDB
기본값: CP for state-of-record, AP for derived / cache.