Як спроєктувати стабільну систему зберігання
За багато років ми пройшли увесь еволюційний ланцюжок технологій зберігання — від традиційних файлових систем до мережевих файлових систем і сучасного об’єктного сховища. Кожен етап дав нам цінні (іноді болючі) уроки про масштабованість, надійність і межі звичних підходів.
Етап 1: традиційні файлові системи
Зрілі файлові системи на кшталт XFS та Ext4 швидкі й надійні для використання на одному сервері. Однак щойно ви починаєте додавати диски й нарощувати томи LVM, ризик простою різко зростає. Як ми зауважували у статті про масштабованість, принцип Діріхле нещадний: за достатньої кількості дисків імовірність відмови наближається до неминучості.
Етап 2: мережеві файлові системи (NFS та інші)
Щоб зменшити ризик, ми перейшли на мережеві файлові системи. Результати були в кращому разі неоднозначні. Масштабованість і відмовостійкість лишалися проблемними. В одній продакшн-конфігурації з 40 серверами застосунків на NFS періодичні втрати файлів ламали інтерфейс, бо посилання в базі даних вказували на відсутні ресурси. Не ідеально для продакшн-середовищ.
Етап 3: об’єктне сховище — логічний наступний крок
Об’єктне сховище розв’язує багато з цих проблем, забезпечуючи кращу відмовостійкість, горизонтальну масштабованість, багату підтримку метаданих і чистий HTTP-API, який застосунки можуть використовувати напряму. Жодних більше крихких файлосистемних посилань у базі даних — ключі й метадані живуть разом із самими об’єктами.
Зоопарк об’єктних сховищ
Ми оцінили багато варіантів:
- CouchDB: усе в JSON → роздуті бінарні об’єкти.
- Cassandra: непередбачувана продуктивність під навантаженням.
- OpenStack Swift: прийнятний, доки відмова одного вузла не могла зупинити віддачу об’єктів (сумнівна остаточна узгодженість).
- LeoFS, ZoDB, MongoDB, Redis: кожен мав суттєві недоліки в стабільності, передбачуваності чи обслуговуванні.
Чому MinIO вирізнився
Після ретельного тестування MinIO виявився найнадійнішим вибором. Написаний мовою Go й спеціально створений для високопродуктивного S3-сумісного об’єктного сховища, він давав передбачувану продуктивність, стабільну затримку й чистий дизайн розподілених систем. Використовуючи стирне кодування (erasure coding) між дисками для надлишковості, він елегантно масштабується й витримує реальні навантаження без єдиної точки відмови.
Уроки, застосовані в LightUp.Cloud
Цей досвід суттєво вплинув на нашу архітектуру. Ми віддаємо перевагу системам, які передбачувані, відмовостійкі й масштабовані за задумом, а не завдяки героїчним зусиллям. Для користувачів, яким потрібна швидка, надійна синхронізація великих файлів із сильними гарантіями узгодженості, цей фундамент вирішує все.
Еволюція сховищ нагадує нам, що «найновіше й найкраще» не завжди найстабільніше. Іноді найкращі рішення народжуються з розуміння всього шляху — і вибору інструментів, створених на довгу перспективу.