At-Least-Once vs Exactly-Once, 메시지 전달 보장의 차이 이해하기

메시지 전달 보장이란? 분산 시스템에서 메시지 큐나 이벤트 스트리밍(Kafka, RabbitMQ 등)을 사용할 때, 생산자(Producer)가 보낸 메시지가 소비자(Consumer)에게 얼마나 확실하게 전달되는지를 나타내는 개념이 ‘메시지 전달 보장(Delivery Guarantee)’입니다. 네트워크는 언제든 끊길 수 있고, 서버는 죽었다 살아날 수 있기 때문에 ‘메시지가 정확히 한 번만 처리됐다’는 것을 보장하기란 생각보다 까다롭습니다. 대표적으로 At-Most-Once, At-Least-Once, Exactly-Once 세 가지 방식이 있으며, 오늘은 … 더 읽기

Skip List란? 정렬된 데이터를 빠르게 탐색하는 자료구조

Skip List의 정의 Skip List(스킵 리스트)는 정렬된 데이터를 빠르게 탐색하기 위해 고안된 확률적 자료구조입니다. 이름 그대로 일부 노드를 ‘건너뛰면서(skip)’ 탐색 속도를 높이는 방식인데, 기본적으로는 연결 리스트(Linked List)를 여러 층으로 쌓아 올린 구조라고 이해하면 됩니다. 일반 연결 리스트는 원하는 값을 찾으려면 처음부터 하나씩 확인해야 해서 탐색에 O(n)의 시간이 걸리지만, Skip List는 평균적으로 O(log n)의 탐색 성능을 … 더 읽기

Read Amplification이란? 읽기 성능을 갉아먹는 숨은 비용

Read Amplification이란? Read Amplification(읽기 증폭)은 애플리케이션이 실제로 요청한 데이터양보다 훨씬 더 많은 양의 데이터를 디스크나 스토리지에서 읽어야 하는 현상을 말합니다. 예를 들어 단 1KB짜리 레코드 하나를 조회하기 위해 시스템이 내부적으로 10MB를 읽어야 한다면, Read Amplification이 매우 크다고 할 수 있습니다. 이는 CPU 연산이 아니라 I/O 비용에서 발생하는 문제이기 때문에, 겉으로 드러나지 않지만 실제 서비스의 응답 … 더 읽기

B+Tree란? 데이터베이스 인덱스가 이 구조를 쓰는 이유

B+Tree란 무엇인가 B+Tree는 정렬된 데이터를 트리 형태로 저장하는 자료구조로, 대부분의 관계형 데이터베이스(MySQL의 InnoDB, PostgreSQL 등)가 인덱스 구조로 채택하고 있습니다. 이름은 ‘B-Tree’에서 파생되었지만 몇 가지 중요한 차이가 있습니다. B-Tree는 모든 노드에 데이터를 저장하지만, B+Tree는 실제 데이터(혹은 데이터 위치 정보)를 오직 리프 노드(leaf node)에만 저장합니다. 중간 노드는 검색 경로를 안내하는 ‘이정표’ 역할만 합니다. 또한 리프 노드끼리는 연결 … 더 읽기

LSM Tree란? 쓰기 성능을 극대화하는 저장 구조

LSM Tree란 무엇인가 LSM Tree(Log-Structured Merge Tree)는 데이터를 즉시 디스크에 반영하지 않고, 메모리에 모아두었다가 순차적으로 정리해서 저장하는 자료구조입니다. 이름 그대로 로그를 쌓듯이 데이터를 기록한 뒤, 이를 병합(Merge)하며 정돈된 트리 구조를 유지하는 방식입니다. RocksDB, LevelDB, Cassandra, HBase 등 대규모 쓰기 처리가 필요한 데이터베이스에서 핵심 저장 엔진으로 사용됩니다. 기존의 B-Tree가 ‘쓰기 시점에 정렬된 위치를 찾아 바로 갱신’하는 … 더 읽기

Tombstone이란? 분산 DB에서 삭제를 처리하는 방식

Tombstone이란 무엇인가 Tombstone은 우리말로 ‘묘비’라는 뜻인데, 분산 데이터베이스에서는 데이터를 실제로 즉시 지우지 않고 ‘삭제되었다’는 표시만 남겨두는 방식을 의미합니다. Cassandra, DynamoDB, Riak 같은 분산 DB는 데이터를 여러 노드에 복제해서 저장하는데, 이런 환경에서 삭제 요청이 오면 모든 복제본에서 동시에 데이터를 지우기가 어렵습니다. 그래서 실제 삭제 대신 ‘이 데이터는 삭제됨’이라는 마커, 즉 Tombstone을 기록해두고, 나중에 별도의 정리 과정을 … 더 읽기

Anti-Entropy란? 분산 시스템에서 데이터 불일치를 복구하는 원리

Anti-Entropy의 정의 분산 시스템에서는 같은 데이터를 여러 노드에 복제해서 저장한다. 그런데 네트워크 장애, 노드 다운, 지연 등의 이유로 노드 간 데이터가 서로 달라지는 상황이 발생하는데, 이를 ‘엔트로피(entropy)’가 증가한다고 표현한다. Anti-Entropy는 이렇게 벌어진 데이터 불일치를 주기적으로 감지하고 복구해서 노드 간 데이터를 다시 동일하게 맞추는 메커니즘을 말한다. Cassandra, DynamoDB 같은 NoSQL 분산 데이터베이스에서 널리 사용되는 개념이다. 동작 … 더 읽기

Hinted Handoff란? 분산 DB가 노드 장애를 견디는 방법

Hinted Handoff란 무엇인가 분산 데이터베이스는 여러 대의 서버(노드)에 데이터를 나눠 저장한다. 이때 특정 노드가 일시적으로 다운되면 그 노드에 쓰여야 할 데이터는 어떻게 될까? Hinted Handoff는 바로 이 문제를 해결하는 메커니즘이다. 장애가 난 노드 대신 다른 정상 노드가 임시로 데이터를 대신 받아두었다가, 장애 노드가 복구되면 원래 주인에게 데이터를 넘겨주는 방식이다. Apache Cassandra, Amazon DynamoDB, Riak 같은 … 더 읽기

머클 트리(Merkle Tree)란? 블록체인과 분산 시스템에서 쓰이는 이유

머클 트리란 무엇인가 머클 트리는 대량의 데이터를 효율적으로 검증하기 위해 고안된 이진 트리 구조입니다. 이름은 고안자인 랄프 머클(Ralph Merkle)에서 따왔습니다. 가장 하위 노드(리프 노드)에는 각 데이터의 해시값이 저장되고, 상위로 올라갈수록 하위 두 노드의 해시값을 다시 합쳐서 해시한 값이 저장됩니다. 이 과정을 반복하면 최종적으로 트리 꼭대기에 단 하나의 해시값, 즉 ‘루트 해시(Merkle Root)’가 남습니다. 비유하자면 여러 … 더 읽기

체크섬과 CRC, 데이터가 손상되지 않았음을 어떻게 증명할까?

체크섬과 CRC란 무엇인가 네트워크로 파일을 전송하거나 저장 장치에 데이터를 기록할 때, 우리는 항상 ‘이 데이터가 원본 그대로 도착했는가’라는 문제를 마주하게 된다. 이를 확인하기 위한 대표적인 방법이 체크섬(Checksum)과 CRC(Cyclic Redundancy Check)다. 둘 다 원본 데이터를 특정 연산에 넣어 짧은 검증값을 만들어내고, 수신 측에서 같은 연산을 다시 수행해 값이 일치하는지 비교하는 방식으로 동작한다. 체크섬은 가장 단순한 형태로, … 더 읽기