Дмитрий Листвин
Авито
Аналитическое хранилище Авито — это Trino и Vertica поверх Ceph S3 на HDD, и в какой-то момент мы уперлись в потолок: хотим читать быстрее, чем способна отдать максимально доступная нам конфигурация кластера Ceph.
Масштабировать сам Ceph дальше нецелесообразно — почему, мы подробно разобрали в статье на Хабре. Вместо этого мы взяли несколько кластеров Ceph и стали размазывать каждую таблицу по всем сразу: шардируем не по бакетам, а по хешу пути объекта, поэтому каждая таблица читается со всех кластеров параллельно.
Самое интересное — где живет логика шардирования: мы не строили отдельный прокси-слой, а расширили на Lua HAProxy-сайдкары, которые и так были на каждой compute-ноде Trino и Vertica. Получился stateless-роутинг, который не добавляет в архитектуру ни нового боттлнека, ни единой точки отказа.
Расскажу, как мы писали и тестировали это расширение, как поэтапно выкатывали в прод и что получили: latency GET-запросов упала с минуты до 1–2 секунд, а реальная скорость чтения выросла с 20 до 60 ГБ/с. Отдельно разберу ListObjects — операцию с пагинацией, которая при таком подходе превращается в fan-out по всем шардам с merge ответов, и наш процесс решардирования, который работает без даунтайма на чтение и почти без даунтайма на запись.
Авито