Эта система решает проблему резервного копирования более чем 20 000 баз данных (включая MySQL, Redis, SSDB) в удаленном месте.
Каждый день создается около 400 000 резервных копий (99% баз данных имеют стратегию ежечасной резервной копии).
Каждый день осуществляется передача более 40 ТБ данных в удаленное место.
Нормы для скриптов резервного копирования:
1. Каждое резервное копирование должно быть полным (например, Redis использует RDB для полного резервного копирования).
2. Полное резервное копирование с последующими дифференциальными резервными копиями (например, MySQL использует Xtrabackup).
Лог-файлы генерируются следующим образом:
Успешное резервное копирование: back_log первая строка — ok, вторая строка — имя файла.
Неудачное резервное копирование: back_log первая строка — wrong, вторая строка — сообщение об ошибке.
```Если используется второй метод, то при создании `back_log` также должна быть создана одна и та же информация в `last_all_log`.
```markdown
- Управление приоритетами очередей резервного копирования, важные резервные копии имеют высший приоритет для отправки в удаленное место.
### Поддержка различных типов оповещений
- Неправильное выполнение скрипта резервного копирования (код выхода отличен от нуля).
- Отсутствие резервного копирования в течение установленного времени.
- Недействительное резервное копирование.
Для оповещений был создан плагин Chrome для напоминаний.
### Поддержка линейного масштабирования кластера
- Кластер поддерживает получение данных, регулирование веса, увеличение вместимости путем простого добавления узлов.
- Узлы конфигурируются таким образом, чтобы зарезервировать определенное пространство; если это пространство превышено, работа автоматически приостанавливается. После этого, если остальные узлы продолжают работать нормально, весь кластер может продолжить работу.
### Поддержка многомерного анализа данных
- Метаданные хранятся в ES, анализ данных выполняется по мере необходимости.
### Однокнопочный восстановление
- В сочетании со скриптами восстановления можно быстро найти местоположение резервной копии, скачать её и восстановить данные.
```## Архитектурное описание
### Схема архитектуры

### Страница статистики


### Страница оповещений

### Страница управления кластером

## Способы развертывания
### Установка базового окружения
Установите Elasticsearch и Redis, затем скачайте исходный код
git clone git@github.com:lustlost/ubackup.git
Инициализируйте ES Mapper
python ubackup/server/create_es_mapper.py
### Клиентская часть
yum install python-redis -y yum install rsync xinetd -y sed -i '/disable/ s#yes#no#g' /etc/xinetd.d/rsync cd ubackup/client cp uuzuback.conf /etc/
Убедитесь, что конфигурационный файл `/etc/rsyncd.conf` включает следующие модули (конкретные значения можно адаптировать под вашу ситуацию):
[backup] path = /data/backup/ hosts allow = 0.0.0.0/0 read only = yes
Перезапустите службу `xinetd`
/etc/init.d/xinetd restart
[global] server_id = 111111 # ID сервера, уникальный идентификатор, который может быть номером активного имущества game_id = 31 # ID игры, полученное из управления играми в Dashboard op_id = 1 # зарезервированное поле, заполните любыми данными interval = 3600 # время интервала для выполнения резервного копирования redis_host = 0.0.0.0 # адрес Redis на стороне сервера redis_port = 6379 # порт Redis на стороне сервера redis_queue = uuzuback # имя очереди Redis на стороне сервера my_ip = 127.0.0.1 # IP текущего компьютера log = /var/log/uuzu_back.log # путь к логам error_log = /var/log/uuzu_back.error # путь к ошибочным логам
[mysql3306] # один раздел для одного экземпляра резервного копирования
back_type = mysql # тип резервного копирования
instance = 3306 # номер экземпляра, для резервного копирования баз данных используется номер порта
rsync_model = backup/database_3306 # имя модуля rsync
back_dir = /data/backup/database_3306/ # путь к файлам резервного копирования
back_log = /var/log/mysql_3306.log # путь к журналам резервного копирования
last_all_log = /var/log/last_3306.log # путь к последнему полному резервному копированию, если нет необходимости различать полные и частичные резервные копии, этот параметр можно пропустить
script = sh /usr/local/uuzuback/mysql_backup.sh /etc/my.cnf # скрипт резервного копирования
[redis6379]
back_type = redis
instance = 6379
rsync_model = backup/redisbase_6379
back_dir = /data/backup/redisbase_6379/
back_log = /var/log/redis_6379.log
script = sh /usr/local/uuzuback/redis_backup.sh /data/conf/redis_conf
Добавьте `python uuzuback_client.py` в crontab, интервал времени cron должен совпадать с значением interval в конфигурационном файле.
```
### Серверная часть:
Установите зависимости
```
yum install supervisor MySQL-python -y
pip install redis
cd ubackup/server/
cp uuzuback.conf /etc/
```
Конфигурационный файл
```
[global]
work_thread = 4 # количество потоков для выполнения rsync
rsync_bwlimit = 62000 # ограничение пропускной способности для rsync
server_root_path = /backup/uuzubackup/ # корневой каталог локального резервного копирования
reserve = 1000 # размер, который следует оставить свободным на локальном устройстве
interval = 0 # интервал в секундах между попытками получения резервной копии каждым потоком
redis_host = 127.0.0.1 # адрес redis
redis_port = 6379 # порт redis
redis_queue = level1 uuzuback_f # название очереди, чем ближе к началу списка, тем выше приоритет
log = /var/log/uuzuback.log
error_log = /var/log/uuzuback.error
myip = 127.0.0.1 # локальный IP адрес
retry = 3 # количество попыток повторного выполнения
message_redis_host = 127.0.0.1 # адрес глобальной очереди
message_redis_port = 6379 # порт глобальной очереди
message_queue = message # название глобальной очереди
mysqlkeeptime = 15 # время хранения данных
rediskeeptime = 15 # время хранения данных
node_id = 5 # идентификатор узла, полученный с Dashboard для отчета о состоянии узла
```
Запуск сервиса
Добавьте конфигурационный сегмент в `/etc/supervisord.conf`, путь к исполняемому файлу серверной части следует указывать в соответствии с реальными условиями
Откройте `to_es.py`
Измените информацию о соединении с Redis, ES и dashboard в строках 5-9```markdown
[program:uuzu_backup_server]
command=/usr/bin/python /usr/local/uuzuback/uuzuback_server.py
autorestart=true
autostart=true
stdout_logfile=/var/log/uuzu_backup_server.log
[program:to_es]
command=/usr/bin/python /usr/local/uuzuback/to_es.py
autorestart=true
autostart=true
stdout_logfile=/var/log/uuzu_backup_to_es.log
```
### Дашборд:
```
cd ubackup/dashboard
pip install -r requirements.txt
```
Измените `config.py` и настройте строки подключения к базе данных, затем выполните
```
python -c 'from myapp import db;db.create_all()'
```
Запустите сервис
```
python runserver.py
```
Доступен через порт Yöntem 5000
### Отправка информации о ноде:
Отправка информации о очередях
```
На сервере Redis
Измените dashboard_url в server/update_queue.py
Добавьте cronjob
python update_queue.py {{ID}} добавьте в cronjob, ID
Используйте конфигурацию любого узла
```
Отправка информации о дисках
```
На сервере ноды
Измените dashboard_url в server/update_disk.py
Добавьте cronjob
python update_disk.py добавьте в cronjob
Установите node_id в конфигурационном файле как ID на дашборде
```
### Корректировка:
```markdown
[program:uuzu_backup_server]
command=/usr/bin/python /usr/local/uuzuback/uuzuback_server.py
autorestart=true
autostart=true
stdout_logfile=/var/log/uuzu_backup_server.log
[program:to_es]
command=/usr/bin/python /usr/local/uuzuback/to_es.py
autorestart=true
autostart=true
stdout_logfile=/var/log/uuzu_backup_to_es.log
```
### Дашборд:
```
cd ubackup/dashboard
pip install -r requirements.txt
```
Измените `config.py` и настройте строки подключения к базе данных, затем выполните
```
python -c 'from myapp import db;db.create_all()'
```
Запустите сервис
```
python runserver.py
```
Доступен через порт 5000
### Отправка информации о ноде:
Отправка информации о очередях
```
На сервере Redis
Измените dashboard_url в server/update_queue.py
Добавьте cronjob
python update_queue.py {{ID}} добавьте в cronjob, ID
Используйте конфигурацию любого узла
```
Отправка информации о дисках
```
На сервере ноды
Измените dashboard_url в server/update_disk.py
Добавьте cronjob
python update_disk.py добавьте в cronjob
Установите node_id в конфигурационном файле как ID на дашборде
```
Корректный перевод:
```markdown
[program:uuzu_backup_server]
command=/usr/bin/python /usr/local/uuzuback/uuzuback_server.py
autorestart=true
autostart=true
stdout_logfile=/var/log/uuzu_backup_server.log
[program:to_es]
command=/usr/bin/python /usr/local/uuzuback/to_es.py
autorestart=true
autostart=true
stdout_logfile=/var/log/uuzu_backup_to_es.log
```
### Дашборд:
```
cd ubackup/dashboard
pip install -r requirements.txt
```
Измените `config.py` и настройте строки подключения к базе данных, затем выполните
```
python -c 'from myapp import db;db.create_all()'
```
Запустите сервис
```
python runserver.py
```
Доступен через порт 5000
### Отправка информации о ноде:
Отправка информации о очередях
```
На сервере Redis
Измените dashboard_url в server/update_queue.py
Добавьте cronjob
python update_queue.py {{ID}} добавьте в cronjob, ID
Используйте конфигурацию любого узла
```
Отправка информации о дисках
```
На сервере ноды
Измените dashboard_url в server/update_disk.py
Добавьте cronjob
python update_disk.py добавьте в cronjob
Установите node_id в конфигурационном файле как ID на дашборде
```
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )