167 lines
6.2 KiB
Markdown
167 lines
6.2 KiB
Markdown
# Backup Service для баз данных
|
||
|
||
Централизованный Docker-образ для резервного копирования баз данных MariaDB с автоматической загрузкой в S3.
|
||
|
||
## Описание работы
|
||
|
||
### Алгоритм резервного копирования
|
||
|
||
1. **Запуск цикла**: Контейнер запускает бесконечный цикл в скрипте `/backup.sh`
|
||
2. **Получение списка БД**: Подключается к MariaDB и получает список всех баз данных (исключая системные)
|
||
3. **Создание бэкапов**: Для каждой БД:
|
||
- Создает дамп через `mysqldump` с параметрами:
|
||
- `--max-allowed-packet=1G` - для больших БД
|
||
- `--single-transaction` - консистентный бэкап без блокировок
|
||
- `--extended-insert` - оптимизация размера
|
||
- Сжимает через pipe в gzip
|
||
- Сохраняет как `{database}.{день_недели}.sql.gz`
|
||
4. **Загрузка в S3**: Через rclone копирует в `selectel:backup_db/{S3_PATH}/{environment}/`
|
||
5. **Ротация**: Удаляет старые локальные копии (хранит последние 7)
|
||
6. **Ожидание**: Спит 12 часов (43200 секунд) и повторяет цикл
|
||
|
||
### Структура проекта
|
||
|
||
```
|
||
backupdb/
|
||
├── Dockerfile # Образ MariaDB + rclone
|
||
├── docker-compose.yml # Конфигурация для разных окружений
|
||
├── scripts/
|
||
│ └── backup.sh # Основной скрипт бэкапа (встроен в образ через COPY)
|
||
├── configs/
|
||
│ └── rclone.conf # Конфигурация S3 (пример)
|
||
└── README.md # Эта документация
|
||
```
|
||
|
||
## Использование в проектах
|
||
|
||
### Интеграция в docker-compose.yml
|
||
|
||
Добавьте сервис в ваш `docker-compose.yml`:
|
||
|
||
```yaml
|
||
services:
|
||
backupdb:
|
||
image: registry.dot-dot.ru/backupdb:master
|
||
restart: unless-stopped
|
||
environment:
|
||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||
DB_HOST: db # имя контейнера с БД
|
||
DB_USER: root
|
||
KEEP_BACKUPS: 7 # количество локальных копий
|
||
S3_BUCKET: selectel:backup_db
|
||
S3_PATH: dot # или spottorg для tqo/eks
|
||
ENVIRONMENT: prod # prod/tqo/eks для разделения
|
||
volumes:
|
||
- mysql_backup_volume:/backups
|
||
- /home/ddadmin/.config/rclone/rclone.conf:/root/.config/rclone/rclone.conf:ro
|
||
depends_on:
|
||
- db
|
||
networks:
|
||
- dd
|
||
```
|
||
|
||
### Переменные окружения
|
||
|
||
| Переменная | Описание | По умолчанию |
|
||
|------------|----------|--------------|
|
||
| `MYSQL_ROOT_PASSWORD` | Пароль root для MySQL | обязательно |
|
||
| `DB_HOST` | Hostname/контейнер БД | `db` |
|
||
| `DB_USER` | Пользователь БД | `root` |
|
||
| `KEEP_BACKUPS` | Количество локальных копий | `7` |
|
||
| `S3_BUCKET` | Bucket в S3 | `selectel:backup_db` |
|
||
| `S3_PATH` | Путь в bucket | `dot` |
|
||
| `ENVIRONMENT` | Окружение (prod/tqo/eks) | `prod` |
|
||
|
||
### Требования
|
||
|
||
1. **Сеть Docker**: Контейнер должен быть в той же сети, что и БД
|
||
2. **Конфиг rclone**: Файл `/home/ddadmin/.config/rclone/rclone.conf` на хосте
|
||
3. **Volume для бэкапов**: Для хранения локальных копий
|
||
|
||
## Сборка образа
|
||
|
||
```bash
|
||
cd backupdb
|
||
docker build -t registry.dot-dot.ru/backupdb:master .
|
||
docker push registry.dot-dot.ru/backupdb:master
|
||
```
|
||
|
||
## Мониторинг и отладка
|
||
|
||
### Просмотр логов
|
||
```bash
|
||
docker-compose logs -f backupdb
|
||
```
|
||
|
||
### Ручной запуск бэкапа
|
||
```bash
|
||
# Перезапустить контейнер (начнет бэкап сразу)
|
||
docker-compose restart backupdb
|
||
|
||
# Или выполнить команду внутри
|
||
docker-compose exec backupdb bash
|
||
mysql -h $DB_HOST -u$DB_USER -p$MYSQL_ROOT_PASSWORD -e "show databases;"
|
||
```
|
||
|
||
### Проверка бэкапов в S3
|
||
```bash
|
||
# На сервере с rclone
|
||
rclone ls selectel:backup_db/dot/prod/
|
||
rclone ls selectel:backup_db/spottorg/tqo/
|
||
```
|
||
|
||
## Расположение бэкапов
|
||
|
||
### Локальные
|
||
- Volume: `mysql_backup_volume`
|
||
- Путь в контейнере: `/backups/`
|
||
- Формат: `{database}.{День}.sql.gz`
|
||
|
||
### S3 (Selectel)
|
||
- Bucket: `backup_db`
|
||
- Пути:
|
||
- Production: `dot/prod/{database}.{День}.sql.gz`
|
||
- TQO: `spottorg/tqo/{database}.{День}.sql.gz`
|
||
- EKS: `spottorg/eks/{database}.{День}.sql.gz`
|
||
|
||
## Восстановление из бэкапа
|
||
|
||
### Из S3
|
||
```bash
|
||
# Скачать бэкап
|
||
rclone copy selectel:backup_db/dot/prod/mydatabase.Mon.sql.gz ./
|
||
|
||
# Распаковать
|
||
gunzip mydatabase.Mon.sql.gz
|
||
|
||
# Восстановить
|
||
mysql -h localhost -u root -p mydatabase < mydatabase.Mon.sql
|
||
```
|
||
|
||
### Из локального volume
|
||
```bash
|
||
# Найти volume
|
||
docker volume ls | grep mysql_backup
|
||
|
||
# Скопировать из volume
|
||
docker run --rm -v mysql_backup_volume:/backup -v $(pwd):/out alpine \
|
||
cp /backup/mydatabase.Mon.sql.gz /out/
|
||
|
||
# Восстановить
|
||
gunzip mydatabase.Mon.sql.gz
|
||
mysql -h localhost -u root -p mydatabase < mydatabase.Mon.sql
|
||
```
|
||
|
||
## Особенности ротации
|
||
|
||
- **Локальные бэкапы**: Хранятся 7 последних копий каждой БД
|
||
- **S3 бэкапы**: По дням недели (Mon-Sun), перезаписываются еженедельно
|
||
- **Итого в S3**: Максимум 7 дней истории для каждой БД
|
||
|
||
## Текущие окружения
|
||
|
||
| Окружение | S3 Path | Container Name | Network |
|
||
|-----------|---------|----------------|---------|
|
||
| Production | `dot/prod/` | prod-db-1 | prod_dd |
|
||
| TQO | `spottorg/tqo/` | tqo-db-1 | tqo_dd |
|
||
| EKS | `spottorg/eks/` | eks-db-1 | eks_dd | |