1. updateItem 구현 고민
Elasticsearch를 사용해 updateItem 기능을 구현하려고 했습니다. 하지만 단순한 업데이트 작업을 넘어, 데이터 일관성(Consistency)과 동시성 제어에 대한 고민이 필요했습니다. 특히, 동시에 여러 작업이 일어나는 경우 어떻게 처리해야 할지가 핵심 이슈였습니다.
2. ACID에 대한 고민
일반적인 데이터베이스는 ACID(Atomicity, Consistency, Isolation, Durability) 특성을 제공합니다. 하지만, Elasticsearch는 완벽한 ACID를 보장하지 않기 때문에 여러 업데이트 작업이 동시에 발생하는 상황에서 데이터 일관성을 유지하는 것이 어려울 수 있습니다.
3. 낙관적 동시성 제어 방법
Elasticsearch에서 동시성 제어를 위한 적절한 방법으로 낙관적 동시성 제어(Optimistic Concurrency Control, OCC)를 선택했습니다. 이 방식은 작업이 충돌하지 않을 것이라고 가정한 후, 최종적으로 문제가 발생했을 때 수정하는 방식입니다. 이를 통해 여러 클라이언트가 동시에 데이터를 업데이트할 때, 최신 데이터를 기준으로 작업을 보장할 수 있습니다.
4. _seq_no와 _primary_term
Elasticsearch에서는 _seq_no(Sequence Number)와 _primary_term을 사용해 낙관적 동시성 제어를 구현합니다.
- _seq_no: 각 문서에 대한 작업 순서를 나타냅니다. 문서에 대한 각 작업이 발생할 때마다 이 값이 증가합니다. 이 값은 문서의 변경 순서를 추적하는 데 사용됩니다.
- _primary_term: 샤드(Shard)가 리더 샤드(Primary Shard)로 승격될 때마다 증가하는 값입니다. 이는 샤드의 리더 역할이 변경될 때마다 갱신되며, 어떤 샤드에서 작업이 발생했는지를 구분하는 역할을 합니다.
5. 각각의 역할
- _seq_no는 문서에 대한 작업 순서를 보장해줍니다. 동일한 문서에 여러 번의 업데이트가 있을 때, 그 작업들이 올바른 순서로 처리되도록 합니다.
- _primary_term은 주 샤드(Primary Shard)가 변경되었음을 나타냅니다. 샤드 변경이 발생했을 때, 이전 주 샤드에서 발생한 작업이 새로운 샤드에서 적용되는 것을 방지합니다.
6. 제어 방식
이 두 값은 함께 사용되어 동시성 문제를 방지합니다. 작업을 수행할 때 클라이언트는 현재 문서의 _seq_no와 _primary_term을 가져와서, 이 값이 일치하는 경우에만 업데이트 작업을 진행합니다. 만약 업데이트 도중 문서가 다른 작업에 의해 변경되었거나, 주 샤드가 변경되었다면, 작업이 거부되며 클라이언트는 이를 처리해야 합니다.
7. _version과의 차이점
Elasticsearch에서는 과거에 _version을 사용한 동시성 제어 방법도 있었습니다. 하지만 _version은 클라이언트가 임의로 값을 설정할 수 있어 보안이나 신뢰성 측면에서 문제가 있었습니다. 따라서 현재는 _version 대신 _seq_no와 _primary_term을 사용하는 것이 일반적입니다. 이 두 값은 클라이언트가 임의로 수정할 수 없기 때문에, 더 안전하고 신뢰성 있는 동시성 제어 방식으로 사용됩니다.
'BE 공부 > 검색엔진' 카테고리의 다른 글
[OpenSearch]클러스터 구성: 마스터 노드 + 데이터 노드 (1) | 2025.03.07 |
---|---|
[OpenSearch] FGAC(Fine-Grained Access Control)와 JWT 활용 (1) | 2025.01.22 |
[OpenSearch] OpenSearch Dashboards를 활성화하지 않고 JWT 인증 설정하기 (0) | 2024.09.02 |
[OpenSearch] OpenSearch에서 JWT 인증 사용하기 (2) | 2024.09.02 |
[ElasticSearch] 메모리, 디스크, 캐시 접근 과정 (0) | 2024.08.29 |
댓글