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/
|
||||
├── docker-compose.yml # Конфигурация Docker Compose
|
||||
├── Dockerfile.backup # Docker образ с rclone
|
||||
├── .env # Переменные окружения (создать из .env.example)
|
||||
backupdb/
|
||||
├── Dockerfile # Образ MariaDB + rclone
|
||||
├── docker-compose.yml # Конфигурация для разных окружений
|
||||
├── scripts/
|
||||
│ └── backup-db.sh # Скрипт резервного копирования
|
||||
└── configs/
|
||||
└── rclone.conf # Конфигурация rclone для S3
|
||||
│ └── backup.sh # Основной скрипт бэкапа (встроен в образ через COPY)
|
||||
├── configs/
|
||||
│ └── rclone.conf # Конфигурация S3 (пример)
|
||||
└── README.md # Эта документация
|
||||
```
|
||||
|
||||
## Установка и запуск
|
||||
## Использование в проектах
|
||||
|
||||
1. Скопируйте `.env.example` в `.env` и укажите пароли MySQL для каждого окружения:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Отредактируйте .env и укажите реальные пароли
|
||||
### Интеграция в 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
|
||||
```
|
||||
|
||||
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
|
||||
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
|
||||
docker-compose build
|
||||
docker-compose logs -f backupdb
|
||||
```
|
||||
|
||||
4. Запустите нужные сервисы:
|
||||
### Ручной запуск бэкапа
|
||||
```bash
|
||||
# Запуск всех бэкапов
|
||||
docker-compose up -d
|
||||
# Перезапустить контейнер (начнет бэкап сразу)
|
||||
docker-compose restart backupdb
|
||||
|
||||
# Или запуск только для конкретного окружения
|
||||
docker-compose up -d backup-prod
|
||||
docker-compose up -d backup-tqo
|
||||
docker-compose up -d backup-eks
|
||||
# Или выполнить команду внутри
|
||||
docker-compose exec backupdb bash
|
||||
mysql -h $DB_HOST -u$DB_USER -p$MYSQL_ROOT_PASSWORD -e "show databases;"
|
||||
```
|
||||
|
||||
## Мониторинг
|
||||
|
||||
Просмотр логов:
|
||||
### Проверка бэкапов в S3
|
||||
```bash
|
||||
# Все сервисы
|
||||
docker-compose logs -f
|
||||
|
||||
# Конкретное окружение
|
||||
docker-compose logs -f backup-prod
|
||||
# На сервере с rclone
|
||||
rclone ls selectel:backup_db/dot/prod/
|
||||
rclone ls selectel:backup_db/spottorg/tqo/
|
||||
```
|
||||
|
||||
## Расположение бэкапов
|
||||
|
||||
### Локальные бэкапы
|
||||
- Prod: `mysql_backup_volume_prod`
|
||||
- TQO: `mysql_backup_volume_tqo`
|
||||
- EKS: `mysql_backup_volume_eks`
|
||||
### Локальные
|
||||
- Volume: `mysql_backup_volume`
|
||||
- Путь в контейнере: `/backups/`
|
||||
- Формат: `{database}.{День}.sql.gz`
|
||||
|
||||
### S3 (Selectel)
|
||||
- Prod: `selectel:backup_db/dot/prod/`
|
||||
- TQO: `selectel:backup_db/dot/tqo/`
|
||||
- EKS: `selectel:backup_db/dot/eks/`
|
||||
|
||||
## Формат имен файлов
|
||||
|
||||
Бэкапы сохраняются в формате: `{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"
|
||||
# Контейнер перезапустится и сразу начнет бэкап
|
||||
```
|
||||
- Bucket: `backup_db`
|
||||
- Пути:
|
||||
- Production: `dot/prod/{database}.{День}.sql.gz`
|
||||
- TQO: `spottorg/tqo/{database}.{День}.sql.gz`
|
||||
- EKS: `spottorg/eks/{database}.{День}.sql.gz`
|
||||
|
||||
## Восстановление из бэкапа
|
||||
|
||||
1. Скачайте бэкап из S3 или найдите в локальном volume
|
||||
2. Распакуйте:
|
||||
### Из S3
|
||||
```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
|
||||
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