Итак, свершилось - реализация Vitastor S3 на базе Zenko CloudServer достигла состояния готовности к публикации и использованию.
Ключевые особенности
- Zenko CloudServer реализован на node.js.
- Метаданные объектов хранятся в MongoDB.
- Поставляется модифицированная версия Zenko CloudServer, отвязанная от лишних зависимостей, с оптимизированной сборкой и немного отличающаяся от оригинала.
- Данные объектов хранятся в блочных томах Vitastor, однако информация о самих томах сохраняется не в etcd Vitastor, а тоже в БД на основе MongoDB.
- Объекты записываются в тома последовательно друг за другом. Место выделяется с округлением до размера сектора (до 4 килобайт), поэтому каждый объект занимает как минимум 4 КБ.
- Благодаря такой схеме записи объектов мелкие объекты не нарезаются на части и поэтому не требуют чтения с N дисков данных в EC N+K пулах Vitastor.
- При удалении объекты помечаются удалёнными, но место освобождается не сразу, а при запускаемой асинхронно “дефрагментации”. Дефрагментация запускается автоматически в фоне при достижении заданного объёма “мусора” в томе (по умолчанию 20%), копирует актуальные объекты в новые тома, после чего очищает старый том полностью. Дефрагментацию можно настраивать в locationConfig.json.
Планы развития
- Хранение учётных записей в БД, а не в статическом файле (в оригинальном Zenko для этого используется отдельный закрытый сервис “Scality Vault”).
- Более подробная документация.
- Поддержка других (и более производительных) key-value СУБД для хранения метаданных.
- Другие оптимизации производительности, например, в области используемой хеш-функции (хеш MD5, используемый в целях совместимости, относительно медленный).
- Поддержка Object Lifecycle. Реализация Lifecycle для Zenko существует и называется Backbeat, но она ещё не адаптирована для Vitastor.
- Квоты. В оригинальном Zenko для этого используется отдельный сервис “SCUBA”, однако он тоже является закрытым и недоступен для публичного использования.
Установка
Кратко:
- Установите MongoDB, создайте пользователя для БД метаданных S3.
- Создайте в Vitastor пул для хранения данных объектов.
- Скачайте и настройте Docker-контейнер
vitalif/vitastor-zenko
.
Установка MongoDB
Вы можете установить MongoDB сами, следуя официальному руководству MongoDB.
Либо вы можете последовать инструкции, приведённой ниже - здесь описан простейший пример установки MongoDB в Docker (docker-compose) в конфигурации с 3 репликами.
- На всех 3 серверах создайте файл
docker-compose.yml
, заменив<ВАШ_ПАРОЛЬ>
на собственный будущий пароль администратора mongodb, а0.0.0.0
по желанию заменив на наlocalhost,<IP_сервера>
- желательно либо использовать публично не доступный IP, либо потом настроить TLS.
version: '3.1'
services:
mongo:
container_name: mongo
image: mongo:7-jammy
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: <ВАШ_ПАРОЛЬ>
network_mode: host
volumes:
- ./keyfile:/opt/keyfile
- ./mongo-data/db:/data/db
- ./mongo-data/configdb:/data/configdb
entrypoint: /bin/bash -c
command: [ "chown mongodb /opt/keyfile && chmod 600 /opt/keyfile && . /usr/local/bin/docker-entrypoint.sh mongod --replSet rs0 --keyFile /opt/keyfile --bind_ip 0.0.0.0" ]
-
В той же директории сгенерируйте общий ключ кластера командой
openssl rand -base64 756 > ./keyfile
и скопируйте этот файл на все 3 сервера. -
На всех 3 серверах запустите MongoDB командой
docker compose up -d mongo
. -
Зайдите в Mongo Shell с помощью команды
docker exec -it mongo mongosh -u root -p <ВАШ_ПАРОЛЬ> localhost/admin
и там выполните команду (заменив IP-адреса10.10.10.{1,2,3}
на адреса своих серверов):
rs.initiate({ _id: 'rs0', members: [ { _id: 1, host: '10.10.10.1:27017' }, { _id: 2, host: '10.10.10.2:27017' }, { _id: 3, host: '10.10.10.3:27017' } ] })
- Находясь там же, в Mongo Shell, создайте пользователя с доступом к будущей базе данных S3:
db.createUser({ user: 's3', pwd: '<ВАШ_ПАРОЛЬ_S3>', roles: [ { role: 'readWrite', db: 's3' }, { role: 'dbAdmin', db: 's3' }, { role: 'readWrite', db: 'vitastor' }, { role: 'dbAdmin', db: 'vitastor' } ] })
Настройка Vitastor
Создайте в Vitastor отдельный пул для данных объектов S3, например:
vitastor-cli create-pool --ec 2+1 -n 512 s3-data --used_for_app s3:standard
Опция --used_for_app
работает как “защита от дурака” и не даёт вам случайно создать
в этом пуле обычный блочный том и перезаписать им какие-то данные S3, а также скрывает
статистику занятого места по томам S3 из etcd.
Получите ID своего пула с помощью команды vitastor-cli ls-pools --detail
.
Установка Vitastor S3
- Добавьте в
docker-compose.yml
строки (альтернативно вместоnetwork_mode: host
можно использоватьports: [ "8000:8000", "8002:8002" ]
):
zenko:
container_name: zenko
image: vitalif/vitastor-zenko
restart: always
security_opt:
- seccomp:unconfined
ulimits:
memlock: -1
network_mode: host
volumes:
- /etc/vitastor:/etc/vitastor
- /etc/vitastor/s3:/conf
-
Извлеките из Docker-образа Vitastor примеры файлов конфигурации:
docker run --rm -it -v /etc/vitastor:/etc/vitastor -v /etc/vitastor/s3:/conf vitalif/vitastor-zenko configure.sh
-
Отредактируйте файлы конфигурации в
/etc/vitastor/s3/
:config.json
- общие настройки.authdata.json
- учётные записи и ключи доступа.locationConfig.json
- список классов хранения S3 с настройками расположения. Внимание: в данной версии это именно список S3 storage class-ов (STANDARD, COLD и т.п.), а не зон (подобных us-east-1), как в оригинальном Zenko CloudServer.- В
config.json
и вlocationConfig.json
пропишите свои данные подключения к MongoDB. - В
locationConfig.json
укажите ID пула Vitastor для хранения данных. - Полный перечень настроек Vitastor-бэкенда пока можно посмотреть в коде.
Запуск
Запустите S3-сервер: docker-compose up -d zenko
Готово! Вы получили S3-сервер, работающий на порту 8000.
Можете попробовать обратиться к нему с помощью, например, s3cmd:
s3cmd --host-bucket= --no-ssl --access_key=accessKey1 --secret_key=verySecretKey1 --host=http://localhost:8000 mb s3://testbucket
Или смонтировать его с помощью GeeseFS:
AWS_ACCESS_KEY_ID=accessKey1 AWS_SECRET_ACCESS_KEY=verySecretKey1 geesefs --endpoint http://localhost:8000 testbucket /mnt/geesefs
Лицензия
- Автор Zenko CloudServer - Scality, лицензия Apache 2.0
- Vitastor-бэкенд для S3, как и сам Vitastor, лицензируется на условиях VNPL 1.1
- Репозиторий сборки: https://git.yourcmc.ru/vitalif/zenko-cloudserver-vitastor
- Бэкенд хранения данных: https://git.yourcmc.ru/vitalif/zenko-arsenal/src/branch/master/lib/storage/data/vitastor/VitastorBackend.ts