172 lines
10 KiB
Markdown
172 lines
10 KiB
Markdown
[Документация](../../README-ru.md#документация) → Установка → S3 на базе Vitastor
|
||
|
||
-----
|
||
|
||
[Read in English](s3.en.md)
|
||
|
||
# S3 на базе Vitastor
|
||
|
||
Итак, свершилось - реализация 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](https://github.com/scality/backbeat), но она ещё не адаптирована для Vitastor.
|
||
- Квоты. В оригинальном Zenko для этого используется отдельный сервис "SCUBA", однако
|
||
он тоже является закрытым и недоступен для публичного использования.
|
||
|
||
## Установка
|
||
|
||
Кратко:
|
||
|
||
- Установите MongoDB, создайте пользователя для БД метаданных S3.
|
||
- Создайте в Vitastor пул для хранения данных объектов.
|
||
- Скачайте и настройте Docker-контейнер `vitalif/vitastor-zenko`.
|
||
|
||
### Установка MongoDB
|
||
|
||
Вы можете установить MongoDB сами, следуя [официальному руководству MongoDB](https://www.mongodb.com/docs/manual/installation/).
|
||
|
||
Либо вы можете последовать инструкции, приведённой ниже - здесь описан простейший пример
|
||
установки MongoDB в Docker (docker-compose) в конфигурации с 3 репликами.
|
||
|
||
1. На всех 3 серверах создайте файл `docker-compose.yml`, заменив `<ВАШ_ПАРОЛЬ>`
|
||
на собственный будущий пароль администратора mongodb, а `0.0.0.0` по желанию
|
||
заменив на на `localhost,<IP_сервера>` - желательно либо использовать публично не доступный IP,
|
||
либо потом [настроить TLS](https://www.mongodb.com/docs/manual/tutorial/configure-ssl/).
|
||
|
||
```
|
||
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" ]
|
||
```
|
||
|
||
2. В той же директории сгенерируйте общий ключ кластера командой `openssl rand -base64 756 > ./keyfile`
|
||
и скопируйте этот файл на все 3 сервера.
|
||
|
||
3. На всех 3 серверах запустите MongoDB командой `docker compose up -d mongo`.
|
||
|
||
4. Зайдите в 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' }
|
||
] })`
|
||
|
||
5. Находясь там же, в 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
|
||
|
||
1. Добавьте в `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
|
||
```
|
||
|
||
2. Извлеките из Docker-образа Vitastor примеры файлов конфигурации:
|
||
`docker run --rm -it -v /etc/vitastor:/etc/vitastor -v /etc/vitastor/s3:/conf vitalif/vitastor-zenko configure.sh`
|
||
|
||
3. Отредактируйте файлы конфигурации в `/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-бэкенда пока можно посмотреть [в коде](https://git.yourcmc.ru/vitalif/zenko-arsenal/src/branch/master/lib/storage/data/vitastor/VitastorBackend.ts#L94).
|
||
|
||
### Запуск
|
||
|
||
Запустите S3-сервер: `docker-compose up -d zenko`
|
||
|
||
Готово! Вы получили S3-сервер, работающий на порту 8000.
|
||
|
||
Можете попробовать обратиться к нему с помощью, например, [s3cmd](https://s3tools.org/s3cmd):
|
||
|
||
`s3cmd --host-bucket= --no-ssl --access_key=accessKey1 --secret_key=verySecretKey1 --host=http://localhost:8000 mb s3://testbucket`
|
||
|
||
Или смонтировать его с помощью [GeeseFS](https://github.com/yandex-cloud/geesefs):
|
||
|
||
`AWS_ACCESS_KEY_ID=accessKey1 AWS_SECRET_ACCESS_KEY=verySecretKey1 geesefs --endpoint http://localhost:8000 testbucket /mnt/geesefs`
|
||
|
||
## Лицензия
|
||
|
||
- Автор [Zenko CloudServer](https://s3-server.readthedocs.io/en/latest/) - Scality, лицензия [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0)
|
||
- Vitastor-бэкенд для S3, как и сам Vitastor, лицензируется на условиях [VNPL 1.1](https://git.yourcmc.ru/vitalif/vitastor/src/branch/master/VNPL-1.1.txt)
|
||
- Репозиторий сборки: https://git.yourcmc.ru/vitalif/zenko-cloudserver-vitastor
|
||
- Бэкенд хранения данных: https://git.yourcmc.ru/vitalif/zenko-arsenal/src/branch/master/lib/storage/data/vitastor/VitastorBackend.ts
|