인스타그램에서 방금 올린 내 게시물의 '좋아요' 수가 내 화면에서는 10개인데, 새로고침한 친구의 화면에서는 8개로 보인 적 없으신가요? 혹은 방금 삭제한 댓글이 잠시 동안 다른 사람에게는 그대로 보이는 현상은요? "이거 버그 아니야?" 싶겠지만, 사실 이것은 수억 명이 사용하는 거대 서비스를 지탱하는 매우 의도적이고 영리한 설계, 바로 최종 일관성(Eventual Consistency) 때문입니다.
최종 일관성이란? "언젠가는 같아진다"는 믿음
최종 일관성은 분산된 여러 컴퓨터(서버)에 데이터를 저장할 때, 데이터 변경이 일어난 직후에는 잠시 동안 서버마다 데이터가 다를 수 있지만, 결국(eventually)에는 모든 서버의 데이터가 같아지는(consistent) 것을 보장하는 모델입니다.
가장 좋은 비유는 소문을 퍼뜨리는 것입니다. 🗣️ 어떤 중요한 소식(데이터 변경)이 생겼을 때, 전 세계 모든 사람에게 동시에 확성기로 외쳐서 알리는 방법이 있습니다. 모든 사람이 즉시 똑같은 정보를 알게 되니 완벽하게 일관적이죠. 이것을 강력한 일관성(Strong Consistency) 이라고 합니다. 하지만 한 명이라도 연락이 안 되면 소식을 전파하는 데 시간이 오래 걸리거나 실패할 수 있습니다.
반면, 한 사람이 옆 사람에게, 그 사람이 또 다른 사람에게... 이렇게 입소문을 내는 방법도 있습니다. 소문이 퍼지는 과정에서는 누구에게 물어보느냐에 따라 들은 내용이 조금씩 다를 수 있습니다. 하지만 충분한 시간이 지나면, 결국 모든 동네 사람들이 그 소식을 알게 됩니다. 이것이 바로 최종 일관성입니다. 속도는 조금 느릴지언정, 소문이 중간에 끊길 위험은 훨씬 적죠.
왜 이런 '불편함'을 감수할까요?
그렇다면 왜 구글, 페이스북, 아마존 같은 거대 기업들은 데이터가 즉시 맞지 않는 위험을 감수하고 최종 일관성 모델을 선택할까요? 바로 가용성(Availability) 과 성능(Performance) 이라는 두 마리 토끼를 잡기 위해서입니다.
이는 CAP 이론이라는 유명한 분산 컴퓨팅 이론과 관련이 깊습니다. 이 이론은 "데이터의 일관성(Consistency), 가용성(Availability), 분할 용인성(Partition Tolerance) 이라는 세 가지 요소를 동시에 100% 만족시키는 분산 시스템은 존재할 수 없다"는 내용입니다.
- 일관성(C): 모든 사용자가 언제나 동일한 데이터를 보는 것.
- 가용성(A): 일부 서버에 장애가 나도, 시스템 전체는 항상 응답하는 것.
- 분할 용인성(P): 서버 간 네트워크가 끊겨도 시스템이 동작하는 것.
현대의 분산 시스템에서 네트워크 단절(P)은 언제든 일어날 수 있는 상수와 같습니다. 따라서 우리는 C와 A 사이에서 선택을 해야 합니다.
- 강력한 일관성(C)을 선택하면: 데이터를 변경할 때마다 전 세계 모든 서버에 "이 데이터로 바꿔!"라고 명령하고, 모든 서버가 "응, 바꿨어!"라고 응답할 때까지 기다려야 합니다. 이 과정에서 서버 하나라도 응답이 없으면 전체 작업이 멈추거나 실패합니다(A가 낮아짐). 은행의 계좌 이체처럼 단 1원의 오차도 용납할 수 없을 때 사용합니다.
- 가용성(A)을 선택하면 (최종 일관성): 일단 가장 가까운 서버에 데이터 변경을 기록하고 "처리 완료!"라고 즉시 응답합니다. 그리고 바뀐 내용은 다른 서버들에게 "시간 날 때 이것 좀 반영해 줘~" 하고 비동기적으로 천천히 전파합니다. 사용자는 기다림 없이 서비스를 이용할 수 있고, 서버 몇 대가 고장 나도 서비스는 멈추지 않습니다.
우리 주변의 최종 일관성
- SNS의 '좋아요'와 피드: 내가 누른 '좋아요'는 일단 내 화면에 바로 반영되고, 이 정보는 전 세계 친구들의 피드에 천천히 전파됩니다.
- 인터넷 쇼핑몰의 상품 재고: 엄청난 할인 이벤트 시, 수만 명이 동시에 구매 버튼을 누를 때마다 중앙 데이터베이스에 재고를 확인하면 서버가 터져버릴 겁니다. 대신 각 지역 서버가 일단 주문을 받은 뒤, 나중에 중앙 서버에서 재고를 정산하는 방식을 사용하기도 합니다. (그래서 가끔 주문했는데 품절이라고 취소되는 경우가 있죠.)
- DNS (Domain Name System): 우리가 www.google.com의 주소를 바꾸더라도, 전 세계의 DNS 서버에 새로운 주소가 전파되는 데에는 몇 시간에서 며칠이 걸립니다. 이것이 최종 일관성의 가장 고전적이고 확실한 예시입니다.
마치며
최종 일관성은 버그나 기술적 한계가 아닙니다. 거대한 규모의 트래픽을 감당하고, 일부 서버가 다운되어도 절대 멈추지 않는 서비스를 만들기 위한 고도의 전략적 타협입니다. ⚖️
모든 데이터가 1초의 오차도 없이 정확해야 할 필요는 없습니다. "사용자 경험에 영향을 주지 않는 선에서, 데이터 동기화를 얼마나 늦춰도 괜찮을까?"를 고민하는 것. 이것이 바로 대규모 분산 시스템을 설계하는 엔지니어들의 핵심 과제 중 하나이며, 최종 일관성은 그에 대한 가장 현실적인 해답입니다.