11 KiB
Руководство по миграции на асинхронную архитектуру с Redis
Это руководство поможет вам безопасно обновить существующую систему My Uploader Bot до новой асинхронной архитектуры с поддержкой Redis кэширования, сохранив полную совместимость с текущими данными и настройками.
⚠️ ВАЖНО: Резервное копирование
Перед началом миграции обязательно создайте резервные копии:
# Остановите существующие контейнеры
docker-compose down
# Создайте резервную копию базы данных
docker run --rm \
-v my-uploader-bot_sqlStorage:/var/lib/mysql \
-v $(pwd)/backup:/backup \
mariadb:11.2 \
mysqldump -h maria_db -u myuploader -p myuploader > /backup/database_backup_$(date +%Y%m%d_%H%M%S).sql
# Создайте резервную копию файлов
cp -r /Storage /Storage_backup_$(date +%Y%m%d_%H%M%S)
# Создайте резервную копию конфигурации
cp docker-compose.yml docker-compose.yml.backup
cp .env .env.backup
Шаг 1: Обновление конфигурационных файлов
1.1 Обновите docker-compose.yml
Замените ваш текущий docker-compose.yml на совместимую версию:
# Переименуйте существующий файл
mv docker-compose.yml docker-compose.yml.old
# Скопируйте новую совместимую версию
cp docker-compose.compatible.yml docker-compose.yml
1.2 Обновите .env файл
# Переименуйте существующий .env
mv .env .env.old
# Скопируйте новую совместимую версию
cp .env.compatible .env
# Перенесите ваши существующие настройки
# Отредактируйте .env и добавьте ваши текущие значения:
# - MYSQL_PASSWORD (ваш текущий пароль)
# - SECRET_KEY (ваш текущий ключ)
# - JWT_SECRET_KEY (ваш текущий JWT ключ)
# - Другие специфичные настройки
1.3 Обновите requirements.txt
# Переименуйте существующий файл
mv requirements.txt requirements.txt.old
# Скопируйте новую совместимую версию
cp requirements.compatible.txt requirements.txt
Шаг 2: Добавление новых модулей
2.1 Обновите core модули
Замените существующие модули на совместимые версии:
# Создайте резервные копии существующих модулей
mkdir -p app/core/backup
cp app/core/database.py app/core/backup/database.py.old
cp app/core/config.py app/core/backup/config.py.old
# Используйте новые совместимые модули
cp app/core/database_compatible.py app/core/database.py
cp app/core/config_compatible.py app/core/config.py
2.2 Добавьте систему кэширования
# Добавьте новый модуль кэширования
# Файл app/core/cache.py уже создан
# Добавьте совместимые модели
cp app/core/models/base_compatible.py app/core/models/base.py
cp app/core/models/user_compatible.py app/core/models/user.py
cp app/core/models/content_compatible.py app/core/models/content.py
Шаг 3: Постепенное обновление
3.1 Запуск с Redis (рекомендуется)
# Запустите только Redis для тестирования
docker-compose up -d redis
# Проверьте, что Redis работает
docker-compose exec redis redis-cli ping
# Должно вернуть: PONG
3.2 Запуск основных сервисов
# Запустите MariaDB
docker-compose up -d maria_db
# Дождитесь готовности базы данных
docker-compose logs -f maria_db
# Ждите сообщения: "mysqld: ready for connections"
# Запустите основное приложение
docker-compose up -d app
# Проверьте логи
docker-compose logs -f app
3.3 Запуск дополнительных сервисов
# Запустите остальные сервисы поочередно
docker-compose up -d indexer
docker-compose up -d ton_daemon
docker-compose up -d license_index
docker-compose up -d convert_process
# Проверьте статус всех сервисов
docker-compose ps
Шаг 4: Проверка работоспособности
4.1 Проверка API
# Проверьте основной API
curl http://localhost:15100/health
# Проверьте подключение к базе данных
curl http://localhost:15100/api/v1/health/database
# Проверьте Redis подключение
curl http://localhost:15100/api/v1/health/cache
4.2 Проверка существующих данных
# Войдите в контейнер приложения
docker-compose exec app python3 -c "
from app.core.database_compatible import init_database, get_async_session
from app.core.models.user_compatible import User
import asyncio
async def check_data():
await init_database()
async with get_async_session() as session:
from sqlalchemy import select
result = await session.execute(select(User))
users = result.scalars().all()
print(f'Found {len(users)} users in database')
asyncio.run(check_data())
"
4.3 Проверка кэширования
# Проверьте работу Redis кэша
docker-compose exec app python3 -c "
from app.core.cache import init_cache, cache
import asyncio
async def test_cache():
await init_cache()
await cache.set('test_key', 'test_value', 60)
value = await cache.get('test_key')
print(f'Cache test: {value}')
asyncio.run(test_cache())
"
Шаг 5: Настройка для продакшена
5.1 Обновите переменные окружения
В файле .env убедитесь, что настроены:
# Безопасность
SECRET_KEY=your-production-secret-key
JWT_SECRET_KEY=your-production-jwt-key
# База данных
MYSQL_PASSWORD=your-secure-database-password
# Redis (если используете внешний Redis)
REDIS_HOST=redis
REDIS_PASSWORD=your-redis-password # Если нужен
# Кэширование
CACHE_ENABLED=true
REDIS_ENABLED=true
# Производительность
DATABASE_POOL_SIZE=20
DATABASE_MAX_OVERFLOW=30
REDIS_MAX_CONNECTIONS=50
# Логирование
LOG_LEVEL=INFO
LOG_FORMAT=json
5.2 Настройте мониторинг
# Добавьте мониторинг Redis
docker-compose exec redis redis-cli info memory
# Добавьте мониторинг MariaDB
docker-compose exec maria_db mysql -u root -p -e "SHOW PROCESSLIST;"
# Проверьте использование ресурсов
docker stats
Откат изменений
Если что-то пошло не так, вы можете быстро откатиться:
# Остановите новые контейнеры
docker-compose down
# Восстановите старые конфигурации
mv docker-compose.yml.old docker-compose.yml
mv .env.old .env
mv requirements.txt.old requirements.txt
# Восстановите старые модули
cp app/core/backup/database.py.old app/core/database.py
cp app/core/backup/config.py.old app/core/config.py
# Запустите старую версию
docker-compose up -d
Производительность и мониторинг
Мониторинг Redis
# Мониторинг использования памяти Redis
docker-compose exec redis redis-cli info memory
# Мониторинг команд Redis
docker-compose exec redis redis-cli monitor
# Статистика кэша
docker-compose exec redis redis-cli info stats
Мониторинг MariaDB
# Проверка подключений
docker-compose exec maria_db mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
# Проверка производительности
docker-compose exec maria_db mysql -u root -p -e "SHOW STATUS LIKE 'Queries';"
# Размер базы данных
docker-compose exec maria_db mysql -u root -p -e "
SELECT
table_schema as 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) as 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'myuploader'
GROUP BY table_schema;
"
Возможные проблемы и решения
Проблема: Redis не запускается
# Проверьте порты
netstat -tulpn | grep 6379
# Проверьте логи Redis
docker-compose logs redis
# Очистите данные Redis если нужно
docker volume rm my-uploader-bot_redis_data
Проблема: Ошибки подключения к базе данных
# Проверьте статус MariaDB
docker-compose exec maria_db mysqladmin -u root -p status
# Проверьте переменные окружения
docker-compose exec app env | grep MYSQL
# Пересоздайте подключение
docker-compose restart app
Проблема: Высокое использование памяти
# Настройте лимиты Redis в .env
REDIS_MAX_CONNECTIONS=30
DATABASE_POOL_SIZE=10
# Перезапустите сервисы
docker-compose restart
Заключение
После успешной миграции ваша система получит:
- ✅ Асинхронную архитектуру - лучшая производительность
- ✅ Redis кэширование - быстрый доступ к данным
- ✅ Обратная совместимость - все данные сохранены
- ✅ Улучшенный мониторинг - больше метрик
- ✅ Масштабируемость - готовность к росту нагрузки
Система остается полностью совместимой с существующими данными и конфигурациями, но получает современную асинхронную архитектуру и кэширование для лучшей производительности.
Рекомендация: Проводите миграцию в нерабочее время и тщательно тестируйте каждый шаг.