Сравнение реализаций 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!