130 lines
4.6 KiB
Markdown
130 lines
4.6 KiB
Markdown
# Резервное копирование БД - EKS
|
||
|
||
## Описание
|
||
|
||
В этой конфигурации настроено автоматическое резервное копирование всех баз данных MariaDB каждые 12 часов с загрузкой в S3 хранилище Selectel.
|
||
|
||
## Как это работает
|
||
|
||
### Сервис backupdb
|
||
|
||
В `docker-compose.yml` добавлен сервис `backupdb`, который:
|
||
|
||
1. **Запускается автоматически** вместе с остальными сервисами
|
||
2. **Подключается к БД** через контейнер `db` в той же Docker сети
|
||
3. **Создает бэкапы** каждые 12 часов для всех баз (кроме системных)
|
||
4. **Сжимает данные** через gzip для экономии места
|
||
5. **Загружает в S3** по пути `selectel:backup_db/spottorg/eks/`
|
||
6. **Ротирует бэкапы** - хранит 7 последних копий локально
|
||
|
||
### Процесс создания бэкапа
|
||
|
||
```
|
||
1. Получение списка БД → 2. Создание дампа → 3. Сжатие → 4. Загрузка в S3 → 5. Очистка старых
|
||
```
|
||
|
||
Для каждой базы данных:
|
||
- Создается файл: `{database}.{День}.sql.gz` (например: `eks_db.Mon.sql.gz`)
|
||
- Используется `mysqldump` с параметрами для консистентности без блокировок
|
||
- Загружается в S3 с помощью rclone
|
||
|
||
## Конфигурация
|
||
|
||
### Переменные окружения
|
||
```yaml
|
||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # из .env файла
|
||
DB_HOST: db # контейнер с БД
|
||
S3_PATH: spottorg # путь в S3
|
||
ENVIRONMENT: eks # окружение
|
||
```
|
||
|
||
### Volumes
|
||
- `mysql_backup_volume:/backups` - локальное хранение бэкапов
|
||
- `/home/ddadmin/.config/rclone/rclone.conf` - конфиг для S3
|
||
|
||
## Мониторинг
|
||
|
||
### Просмотр логов
|
||
```bash
|
||
docker-compose logs -f backupdb
|
||
```
|
||
|
||
### Проверка статуса
|
||
```bash
|
||
docker-compose ps backupdb
|
||
```
|
||
|
||
### Просмотр бэкапов в S3
|
||
```bash
|
||
rclone ls selectel:backup_db/spottorg/eks/
|
||
```
|
||
|
||
## Восстановление
|
||
|
||
### Из S3
|
||
```bash
|
||
# 1. Скачать бэкап
|
||
rclone copy selectel:backup_db/spottorg/eks/eks_db.Mon.sql.gz ./
|
||
|
||
# 2. Распаковать
|
||
gunzip eks_db.Mon.sql.gz
|
||
|
||
# 3. Восстановить в БД
|
||
docker-compose exec db mysql -uroot -p${MYSQL_ROOT_PASSWORD} eks_db < eks_db.Mon.sql
|
||
```
|
||
|
||
### Из локального volume
|
||
```bash
|
||
# 1. Копировать из volume
|
||
docker run --rm -v eks_mysql_backup_volume:/backup -v $(pwd):/out alpine \
|
||
cp /backup/eks_db.Mon.sql.gz /out/
|
||
|
||
# 2. Распаковать и восстановить
|
||
gunzip eks_db.Mon.sql.gz
|
||
docker-compose exec db mysql -uroot -p${MYSQL_ROOT_PASSWORD} eks_db < eks_db.Mon.sql
|
||
```
|
||
|
||
## Ручное управление
|
||
|
||
### Немедленный запуск бэкапа
|
||
```bash
|
||
docker-compose restart backupdb
|
||
```
|
||
|
||
### Остановка бэкапов
|
||
```bash
|
||
docker-compose stop backupdb
|
||
```
|
||
|
||
### Запуск бэкапов
|
||
```bash
|
||
docker-compose start backupdb
|
||
```
|
||
|
||
## Расписание и ротация
|
||
|
||
- **Частота**: каждые 12 часов
|
||
- **Локальное хранение**: 7 последних копий
|
||
- **S3 хранение**: по дням недели (Mon-Sun), перезаписываются еженедельно
|
||
- **Максимальная история**: 7 дней для каждой БД
|
||
|
||
## Особенности EKS
|
||
|
||
- **S3 путь**: `spottorg/eks/` (отличается от production)
|
||
- **Окружение**: EKS (Elastic Kubernetes Service - тестовое окружение)
|
||
- **Сеть Docker**: `eks_dd`
|
||
|
||
## Troubleshooting
|
||
|
||
### Бэкап не создается
|
||
1. Проверьте логи: `docker-compose logs backupdb`
|
||
2. Проверьте пароль MySQL в .env
|
||
3. Проверьте доступность БД: `docker-compose exec backupdb mysql -h db -uroot -p`
|
||
|
||
### Не загружается в S3
|
||
1. Проверьте конфиг rclone: `ls -la /home/ddadmin/.config/rclone/rclone.conf`
|
||
2. Тестируйте подключение: `docker-compose exec backupdb rclone ls selectel:backup_db/`
|
||
|
||
### Нет места на диске
|
||
1. Проверьте volume: `docker volume ls | grep backup`
|
||
2. Очистите старые бэкапы: `docker-compose exec backupdb rm /backups/*.sql.gz` |