- 용어
- consensus: 여러 node가 특정 주제에 대해 동의하도록 함
- FLP result: node crash의 가능성이 있다면 consensus 보장은 불가
- timeout, crash node identifying으로 일부 해결 가능
- weak guarantee: eventual consistency를 포함하는 개념
- limitation 파악이 중요
- fault-tolerant 관점에서는 유리
- linearizability: single copy, 모든 operation이 atomic한 경우
- 모든 req, res의 timestamp를 수집했을 때 이를 시간 순으로 정렬 가능한 경우
- atomic, strong ,immediate, external consistency
- write skew 등과는 무관
- serializability: transaction 별로 순서 정리가 가능한 경우
- register: 특히 linearizable 상황에서 추적중인 key
- compare-and-set: compare 시 인지하는 값과 db 값이 다르면 error
- read repair: write 시 version 명시, replica lag에 대한 대비책
- CAP theorem: consistency, availability, partition를 모두 만족할 수 없음
- consistency는 linearizability만, fault로는 network partition만을 고려한다는 한계
- casual dependency: 질문-답변처럼 논리 구조 상의 dependency. event order 정의
- consistent with casualty: answer를 포함하면 이에 대한 question도 포함해야 함
- read skew: casuality가 깨진 data를 읽는 상황
- casually consistent: casualty가 정의한 order를 따르는 경우
- total order: 논리 구조와 별개로 모든 두 단위의 순서 비교 가능
- state machine replication: 모든 replica가 같은 순서, process로 write
- XA transactions: heterogeneous 상황의 2PC를 위한 표준
- 기본적으로 C이나 JTA, JDBC, JMS 등 java api 도입
- deadlock across different system은 감지 불가
- PostgreSQL, MySQL, DB2, SQL Server, Oracle
- ActiveMQ, HornetQ, MSMQ, IBM MQ
- coordinator: multi node db transaction의 관리자
- library, 별도 process로 적용 가능
- DB의 일종이며 stateful
- Narayana, JOTM, BTM, MSDTC
- participants: multi node db transaction 상황에서 각 node
- epoch: leader의 세대
- Linearizability: 가장 강력한 consistency model 중 하나
- write 직후 모든 client에서 write된 내용 열람 가능해야 함
- concurrent한 read 요청: 한 번 new value가 return되면 이후에는 모두 new value return
- 사용 사례: lock이 사용되는 경우라고 보면 됨
- leader election situation
- uniqueness for db: 같은 email로 두 user가 동시에 register하는 경우
- 오류 사례
- read repair와 lww의 조합으로 문제 발생 가능
- leaderless의 경우 linear하지 않다고 보는 것이 안전
- 성능과 fault tolerance 측면에서 불리
- network problem 상황에서 linearize하기 위해 process stop
- casualty만 만족하도록 조정
- Casualty
- 사례
- Serializable snapshot isolation
- read repair에서의 version number
- sequence number나 timestamp 활용
- timestamp는 logical clock 활용이 일반적
- node 별로 sequence number에 규칙 지정해 concurrency 조절
- 충분히 높은 resolution을 갖는 clock 참고
- lamport timestamp: counter, node ID pair 활용. total ordering
- node간 counter sync: total order broadcast의 일종
- sync에 걸리는 시간이 있으므로 real time 어려움
- total order broadcast: reliable, totally ordered
- fault 상황에서 무한 retry
- fencing token에도 사용 가능
- linearizability와 달리 stale 상황 존재 가능
- 연속적인 consensus algorithm 적용 필요
- consensus algorithms: 여러 node의 제안 값 중 선택하는 algorithm
- zookeeper(Zab), etcd(Raft), VSR, Paxos
- 특성
- Uniform agreement: 모든 node의 동의
- Integrity: 결정 수정 불가
- Validity: 최초 제안된 값들 중 선택
- Termination: 모든 node는 결국 하나의 값을 결정해야 함
- fault-tolerant. in doubt 상태로 무한 대기해서는 안 됨
- 재해 상황 등 영구 failure도 고려
- atommic commit
- single db node
- make transaction durable: wal
- disk에 commit log 남김: 핵심 step
- log 남기는 중에 crash: node restarts 후 recover
- log 남긴 후 crash: commit 완료
- log 남기기 전 crash: abort
- multi nodes: commit success 여부가 node 간 동일해야 함
- 2 Phase Commit: atommic commit에 특화
- prepare phase와 commit phase
- coordinator의 prepare request 결과가 모두 yes면 commit 진행
- 절차
- coordinator가 transaction ID 발행
- 각 participants가 transaction ID 부착한 채로 transaction 진행
- coordinator가 transaction ID tag해서 prepare request send
- commit point: coordinator commit/abort 결정
- commit/abort request send: 무한 재시도
- 3 phase commit: bounded delay, perfect failure detector 필요
- Distributed transaction in practice