Discord는 엄청나게 많은 사용자들이 하루에 10억 단위의 메시지를 보내곤합니다. 사용자들은 해당 메시지들을 다시 검색을 하고 싶기도 하지요. Discord에서는 메시지 검색 기능을 제공하기 위해서 데이터를 어떻게 인덱싱을 하고 있을까요?
- Discord에서는 ElasticSearch를 사용함
- ElasticSearch엔 데이터를 JSON 형태로 담음
- ElasticSearch는 내부적으로 Inverted index를 생성함.
- Inverted Index란 낱말이나 숫자와 같은 내용물로부터의 매핑 정보를 데이터베이스 파일의 특정 지점이나 문서 또는 문서 집합 안에 저장하는 색인 데이터 구조
- Inverted Index를 통해 Discord에서 데이터를 거의 실시간으로 빠르게 찾을 수 있음
- 인덱싱이 실시간으로 이뤄지지 않음. 데이터는 벌크로 등록됨. 방금 올라온 메시지를 검색하는일은 잘 없어도, 옛날 메시지는 검색하는 일이 많기 때문에 이러한 구조가 괜찮음
- 벌크 인덱싱을 하기 위해서 다음 작업을 함
- 분산화된 Queue를 사용하여 들어오는 메시지를 임시적으로 담음
- Indexer Worker 여러대를 사용해서 ElasticSearch에 데이터를 벌크로 등록함
- Discord에서는 Queue를 위해 Celery를 사용함. 오픈소스 분산 Queue 소프트웨어임.
- ElasticSearch 서버도 여러대를 사용중임. 클러스터라는 개념 사용. 데이터는 어떤 클러스터에 담길까? Sharp Allocator를 사용하여 어디에 데이터를 담을지 판단
- 돌아가고 있는 ElasticSerach 클러스터들을 관리하기 위해서 etcd 라는 오픈소스 사용함.