Содержание
Discord раскрыл, как масштабировал поиск на триллионы сообщений: отказ от монолита, новые кластеры, PubSub и 5-кратное снижение задержек
Discord поделился историей масштабного обновления своей системы поиска, которая теперь справляется с триллионами сообщений.
Компания рассказала, как отказалась от монолитных Elasticsearch-кластеров, переписала архитектуру индексации и смогла не только удвоить пропускную способность, но и снизить задержки запросов в пять раз.
Как все ломалось
Изначально поиск в Discord строился на двух Elasticsearch-кластерах, где сообщения шардировались по серверам (гильдиям) и личным сообщениям. Работало неплохо, пока объем данных не стал рушить все вокруг.
Redis-очередь теряла сообщения при сбоях, кластер из 200+ узлов сыпался от малейшего отказа, а обновление ПО превращалось в квест с полной остановкой сервиса.
Особые проблемы были с большими серверами: Lucene не умеет обрабатывать более 2 млрд документов на один индекс и единственным «решением» было… удалять спам-гильдии.
Новый подход: кластеры в «ячейках»
Discord ушел от гигантских кластеров в сторону так называемых «ячеек» — наборов небольших Elasticsearch-кластеров, управляемых через Kubernetes.
Какие есть паттерны в React и для чего они нужны: часть 2tproger.ru
Каждая ячейка обслуживает определенную категорию данных: отдельные кластеры теперь хранят только сообщения из ЛС, другие — сообщения по серверам.
Это позволило безопасно делать rolling-restart, обновлять Elasticsearch, масштабировать нагрузку и сохранять отказоустойчивость даже при падении отдельных узлов.
Для больших гильдий (внутри Discord их зовут BFG — Big Freaking Guilds) выделяются отдельные индексы с несколькими шардами для повышения производительности.
Очередь PubSub и умная маршрутизация
Redis-очередь заменила PubSub — теперь ни одно сообщение не теряется. Для индексации сообщений Discord внедрил свой роутер, который собирает батчи сообщений, сгруппированных по конечному кластеру и индексу. Так массовые операции больше не рассыпаются из-за падения одного из узлов.
Результат: всё быстрее, стабильнее и масштабируемо
После внедрения новой архитектуры:
- индексируются триллионы сообщений в 2 раза быстрее прежнего;
- задержка поиска снизилась с 500 до <100 мс (p50) и с 1 с до <500 мс (p99);
- работают 40 кластеров с тысячами индексов;
- все обновления проходят без остановки сервиса.
И главное — теперь можно искать сообщения в личке сразу по всем чатам, а не только по отдельным диалогам.