Сравнение реализаций S3
09.05.2024
Вопрос: Где бы стырить чью бы переиспользовать реализацию S3?
Писать S3 с нуля желания нет, потому что протокол хоть и простой, но в нём есть куча мелких особенностей, требующих внимания и реализации, и на них нельзя забивать, ибо юзеры всегда хотят максимальную совместимость с Amazon S3.
На момент поста нашлись следующие варианты: Minio, SeaweedFS, Ceph (RadosGW), Zenko CloudServer, OpenStack Swift и Deuxfleurs Garage.
При сравнении нас интересует в первую очередь сравнение именно S3-фронтенда, внешней части, ибо слой хранения всё равно нужно подсовывать собственный.
При сравнении также запускались s3-тесты от Ceph, но в простейшей конфигурации, без настройки дополнительных интеграций, потенциально необходимых для части тестов.
Попробуем посмотреть, у кого что реализовано!
Minio
- Неплохая совместимость с S3.
- Цеф-тесты:
311 failed, 321 passed, 97 skipped, 80 deselected, 1 xfailed, 4 warnings, 52 errors in 1025.25s (0:17:05)
- Качественно: нет Bucket LoggingConfiguration, Website, UserPolicy, PostObject (HTML-формы), BucketACL, CORS, STS. Lifecycle вроде есть, но через некие собственные политики. Теоретически есть, но сходу не завелось: SSE-KMS — вроде как требует доп.софта, и S3Select — отключено по умолчанию. Плюс есть N-ное число попадавших тестов по мелочам.
- Слегка говнокод, 437 файлов на 242000 строк кода в одной директории без подкаталогов (!).
- Слой хранения как-то отделён (хотя и не идеально) — см. type ObjectLayer. Но бОльшая часть кода вроде всё-таки подразумевает, что работает с ФС. То есть, например, листинг обходит иерархию ФС…
- Go — это и минус, и плюс — с одной стороны, это требует реализации биндинга libvitastor-go, с другой — даёт многопоточность из коробки.
- Лицензия AGPL. Не очень большая помеха, но с моей VNPL не совместима.
SeaweedFS
- Совместимость с S3 точно хуже и Minio, и Ceph.
- Цеф-тесты:
176 failed, 56 passed, 37 skipped, 80 deselected, 1 xfailed, 4 warnings, 510 errors in 554.13s (0:09:14)
- Качественно: нет версионирования (из-за чего в основном и упали с ERROR те самые 510 тестов), Bucket LoggingConfiguration, Website, PostObject, BucketPolicy, BucketACL, CORS, STS, SSE-C, SSE-KMS, S3Select, Lifecycle. Теоретически есть, но сходу не завелось: UserPolicy — вроде бы запускается через --iam на отдельном порту.
- Как ни странно, тоже эмулирует S3 поверх ФС, разница только в том, что в случае SeaweedFS эта ФС внутренняя (Filer).
- Тоже написан на Go.
- Лицензия Apache.
Ceph (RadosGW)
- Наилучшая совместимость с S3.
- Цеф-тесты:
69 failed, 576 passed, 140 skipped, 40 deselected, 1 xfailed, 4 warnings, 34 errors in 879.16s (0:14:39)
- C++ — с одной стороны, не требует реализации биндинга, с другой, скорее всего влечёт за собой геморрой, так как идиоматичный C++ в цефе довольно тяжёлый.
- Слой хранения вполне себе отделён, но совсем не простой, стандартный RADOS-овый занимает аж 57000 строк.
- Лицензия LGPL-2.1 или LGPL-3.0.
Zenko CloudServer
Реально неожиданный вариант.
- Внезапно, очень хорошая совместимость с S3 — хуже Ceph, но лучше Minio.
- Цеф-тесты:
253 failed, 382 passed, 97 skipped, 80 deselected, 1 xfailed, 4 warnings, 47 errors in 220.78s (0:03:40)
- Качественно:
- Нет Bucket LoggingConfiguration, SSE-C, UserPolicy, PostObject, S3Select, STS.
- Теоретически есть, но сходу не завелось: Website, IAM (BucketACL, BucketPolicy), SSE-KMS (хотя часть тестов по нему прошла успешно).
- Lifecycle есть через отдельный компонент — Backbeat, но реализация как будто довольно странная — для запуска нужны Kafka и Zookeeper, сама реализация основана на чтении лога метаданных объектов из Kafka, а в Kafka оно должно попадать через Kafka Connect через чтение MongoDB OpLog — иными словами, реализация специфичная для бэкенда хранения метаданных. В файловом бэкенде, правда, тоже есть поддержка заливки лога в кафку, но это, видимо, используется чисто для тестирования в процессе разработки.
- Квоты: как бы есть, но работают через отдельный сервис «SCUBA» (АКВАЛАНГ, блин!) (Scality Consumption Utilization and Billing API), которого нет — он закрытый. Причём новые/изменённые объекты он, видимо, учитывает самостоятельно, так как явного кода их учёта в самом cloudserver нет.
- Нет поддержки Storage Class-ов — захардкожен единственный STANDARD, при этом несколько «расположений» хранения таки поддерживается — но только в виде Location Constraint-ов для бакетов. Правда, это легко патчится, буквально в пару строк.
- Для “свободного” использования без Vitastor не годится 😈, потому что нормальных реализации слоя хранения у Scality две и обе закрытые и не опубликованные
- Вторая реализация после Ceph, не завязанная на ФС-абстракцию, лишнюю для S3. Тестировалось Zenko, правда, всё-таки с ФС-бэкендом, из-за чего часть тестов листингов попадала.
- NodeJS — с одной стороны лёгкость разработки, с другой — нужно делать биндинг и «девки в озере купались, node_modules нашли» (на 700 мегабайт). Правда, вероятно, это можно полечить его сборкой webpack-ом в один большой JS-исходник (типично это даёт утоптать «бинарь» мегабайт в 5 от силы). Ну и код написан без async/await на костылях типа async.waterfall(), по-хорошему всё это следовало бы давно переписать.
- Лицензия Apache.
Openstack Swift
- Цеф-тесты не запускал, но совместимость с S3 плохая, вероятно, примерно на уровне SeaweedFS — нет версионирования, Lifecycle, Policy, Website. Зато есть ненужное собственное Swift API (не S3).
- Из интересного — ещё есть его форк от OpenIO, видимо, более совместимый — допилили как минимум версионирование и Lifecycle.
- Python (фууу). Наверняка 100500 миллионов строк кода — OpenStack всегда пишут “сильные программисты”. Тестировать даже не очень хочется, потому что всё равно потом пилить что-то на питоне никакого желания нет.
- Лицензия Apache.
Deuxfleurs Garage
Ещё одна тёмная лошадка, не вариант точно, привожу просто для полноты.
- Сама система - что-то вроде Elliptics на Rust от французов. Почему Elliptics - потому что с DHT…
- Совместимость с S3 слабая, хотя местами и чуть лучше Swift. Нет версионирования объектов и SSE-KMS (но есть SSE-C), нет Lifecycle, нет Object Lock, нет Tagging, нет BucketNotification, нет георепликации, нет BucketPolicy и BucketACL (заявлена собственная замена).
- Язык разработки — Rust. Слой хранения не отделён вообще. Жёстко прибит гвоздями к остальной части системы. :-)
Итог
Ceph > Zenko CloudServer > Minio > SeaweedFS.
По цеф-тестам: 576 > 382 > 321 > 56.
Мучаться с отпиливанием RADOS от цефа желания нет, так что волевым решением берём и тащим Zenko!