backupdb/README.md

185 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
├── scripts/
│ └── backup.sh # Основной скрипт бэкапа (встроен в образ через COPY)
├── configs/
│ └── rclone.conf # Конфигурация S3 (пример, не используется в production)
├── .env.example # Пример переменных окружения
└── README.md # Эта документация
```
**Важно**: Образ `registry.dot-dot.ru/backupdb:master` используется напрямую в docker-compose.yml каждого окружения (config_prod, config_tqo, config_eks).
## Использование в проектах
### Интеграция в 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 | DB Container | Network |
|-----------|-------------------|---------|--------------|---------|
| Production | `config_prod/docker-compose.yml` | `dot/prod/` | db | prod_dd |
| TQO | `config_tqo/docker-compose.yml` | `spottorg/tqo/` | db | tqo_dd |
| EKS | `config_eks/docker-compose.yml` | `spottorg/eks/` | db | eks_dd |
### Запуск в окружениях
```bash
# Production
cd config_prod
docker-compose up -d backupdb
# TQO
cd config_tqo
docker-compose up -d backupdb
# EKS
cd config_eks
docker-compose up -d backupdb
```