fix update
build (backupdb) TeamCity build finished
Details
build (backupdb) TeamCity build finished
Details
This commit is contained in:
parent
30d940e3a0
commit
ee48909f91
199
README.md
199
README.md
|
|
@ -1,104 +1,167 @@
|
||||||
# Backup Service
|
# Backup Service для баз данных
|
||||||
|
|
||||||
Централизованный сервис для резервного копирования баз данных всех окружений (prod, tqo, eks).
|
Централизованный Docker-образ для резервного копирования баз данных MariaDB с автоматической загрузкой в S3.
|
||||||
|
|
||||||
## Возможности
|
## Описание работы
|
||||||
|
|
||||||
- Автоматическое резервное копирование каждые 12 часов
|
### Алгоритм резервного копирования
|
||||||
- Сжатие бэкапов с помощью gzip
|
|
||||||
- Загрузка в S3 (Selectel) через rclone
|
|
||||||
- Раздельное хранение бэкапов по окружениям
|
|
||||||
- Автоматическая ротация (хранение последних 7 бэкапов)
|
|
||||||
|
|
||||||
## Структура каталогов
|
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 секунд) и повторяет цикл
|
||||||
|
|
||||||
|
### Структура проекта
|
||||||
|
|
||||||
```
|
```
|
||||||
backup_service/
|
backupdb/
|
||||||
├── docker-compose.yml # Конфигурация Docker Compose
|
├── Dockerfile # Образ MariaDB + rclone
|
||||||
├── Dockerfile.backup # Docker образ с rclone
|
├── docker-compose.yml # Конфигурация для разных окружений
|
||||||
├── .env # Переменные окружения (создать из .env.example)
|
|
||||||
├── scripts/
|
├── scripts/
|
||||||
│ └── backup-db.sh # Скрипт резервного копирования
|
│ └── backup.sh # Основной скрипт бэкапа (встроен в образ через COPY)
|
||||||
└── configs/
|
├── configs/
|
||||||
└── rclone.conf # Конфигурация rclone для S3
|
│ └── rclone.conf # Конфигурация S3 (пример)
|
||||||
|
└── README.md # Эта документация
|
||||||
```
|
```
|
||||||
|
|
||||||
## Установка и запуск
|
## Использование в проектах
|
||||||
|
|
||||||
1. Скопируйте `.env.example` в `.env` и укажите пароли MySQL для каждого окружения:
|
### Интеграция в docker-compose.yml
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
Добавьте сервис в ваш `docker-compose.yml`:
|
||||||
# Отредактируйте .env и укажите реальные пароли
|
|
||||||
|
```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
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Убедитесь, что сети Docker существуют:
|
### Переменные окружения
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `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
|
```bash
|
||||||
docker network ls | grep -E "prod_dd|tqo_dd|eks_dd"
|
cd backupdb
|
||||||
|
docker build -t registry.dot-dot.ru/backupdb:master .
|
||||||
|
docker push registry.dot-dot.ru/backupdb:master
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Соберите Docker образ:
|
## Мониторинг и отладка
|
||||||
|
|
||||||
|
### Просмотр логов
|
||||||
```bash
|
```bash
|
||||||
docker-compose build
|
docker-compose logs -f backupdb
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Запустите нужные сервисы:
|
### Ручной запуск бэкапа
|
||||||
```bash
|
```bash
|
||||||
# Запуск всех бэкапов
|
# Перезапустить контейнер (начнет бэкап сразу)
|
||||||
docker-compose up -d
|
docker-compose restart backupdb
|
||||||
|
|
||||||
# Или запуск только для конкретного окружения
|
# Или выполнить команду внутри
|
||||||
docker-compose up -d backup-prod
|
docker-compose exec backupdb bash
|
||||||
docker-compose up -d backup-tqo
|
mysql -h $DB_HOST -u$DB_USER -p$MYSQL_ROOT_PASSWORD -e "show databases;"
|
||||||
docker-compose up -d backup-eks
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Мониторинг
|
### Проверка бэкапов в S3
|
||||||
|
|
||||||
Просмотр логов:
|
|
||||||
```bash
|
```bash
|
||||||
# Все сервисы
|
# На сервере с rclone
|
||||||
docker-compose logs -f
|
rclone ls selectel:backup_db/dot/prod/
|
||||||
|
rclone ls selectel:backup_db/spottorg/tqo/
|
||||||
# Конкретное окружение
|
|
||||||
docker-compose logs -f backup-prod
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Расположение бэкапов
|
## Расположение бэкапов
|
||||||
|
|
||||||
### Локальные бэкапы
|
### Локальные
|
||||||
- Prod: `mysql_backup_volume_prod`
|
- Volume: `mysql_backup_volume`
|
||||||
- TQO: `mysql_backup_volume_tqo`
|
- Путь в контейнере: `/backups/`
|
||||||
- EKS: `mysql_backup_volume_eks`
|
- Формат: `{database}.{День}.sql.gz`
|
||||||
|
|
||||||
### S3 (Selectel)
|
### S3 (Selectel)
|
||||||
- Prod: `selectel:backup_db/dot/prod/`
|
- Bucket: `backup_db`
|
||||||
- TQO: `selectel:backup_db/dot/tqo/`
|
- Пути:
|
||||||
- EKS: `selectel:backup_db/dot/eks/`
|
- Production: `dot/prod/{database}.{День}.sql.gz`
|
||||||
|
- TQO: `spottorg/tqo/{database}.{День}.sql.gz`
|
||||||
## Формат имен файлов
|
- EKS: `spottorg/eks/{database}.{День}.sql.gz`
|
||||||
|
|
||||||
Бэкапы сохраняются в формате: `{database_name}.{day_of_week}.sql.gz`
|
|
||||||
|
|
||||||
Например:
|
|
||||||
- `mydatabase.Mon.sql.gz`
|
|
||||||
- `mydatabase.Tue.sql.gz`
|
|
||||||
|
|
||||||
## Ручной запуск бэкапа
|
|
||||||
|
|
||||||
Для немедленного создания бэкапа:
|
|
||||||
```bash
|
|
||||||
docker-compose exec backup-prod sh -c "kill 1"
|
|
||||||
# Контейнер перезапустится и сразу начнет бэкап
|
|
||||||
```
|
|
||||||
|
|
||||||
## Восстановление из бэкапа
|
## Восстановление из бэкапа
|
||||||
|
|
||||||
1. Скачайте бэкап из S3 или найдите в локальном volume
|
### Из S3
|
||||||
2. Распакуйте:
|
|
||||||
```bash
|
```bash
|
||||||
gunzip database.Mon.sql.gz
|
# Скачать бэкап
|
||||||
|
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
|
||||||
```
|
```
|
||||||
3. Восстановите:
|
|
||||||
|
### Из локального volume
|
||||||
```bash
|
```bash
|
||||||
mysql -h hostname -u root -p database_name < database.Mon.sql
|
# Найти 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 |
|
||||||
Loading…
Reference in New Issue