Исторически наше S3-хранилище проектировалось для небольшого числа больших бакетов, содержащих миллиарды объектов, но масштабирование решения на всю компанию показало, что клиентам нужно много сравнительно небольших бакетов. Однако оказалось, что система, способная эффективно работать с миллиардами объектов в одном бакете, вовсе не готова к эксплуатации в качестве мультитенантной платформы. Создание отдельного S3-кластера под каждого клиента привело нас в тупик, где нам пришлось администрировать сотни сервисов, что съедало все ресурсы команды и от чего страдала надежность. Так мы пришли к необходимости объединить федерацию из отдельных S3-кластеров в единый коммунальный сервис для тысяч независимых клиентов. Нам пришлось пересмотреть организацию хранения метаданных, изменить подход к изоляции бакетов на API и построить распределенный rate limiting.
В докладе обсудим:
— Почему в нашей архитектуре поддержка миллиардов объектов в одном бакете еще не значит готовность к поддержке тысячи бакетов.
— Как организовать изоляцию различных типов нагрузки на API с помощью виртуальных потоков и семафоров.
— Почему локальных лимитов недостаточно и как работает распределенный rate limiting на основе CRDT.
— Какие изменения потребовались в метасторадже и API для перехода к мультитенантной архитектуре.
Доклад будет полезен разработчикам распределенных систем, объектных хранилищ и платформенных сервисов, которым приходится строить масштабируемые и коммунальные сервисы.