Мы в TrackXy были мигрировать из микросервисов, управляемых каждую собственную команду для нашего Кубернаны Кластер, где у нас есть наши услуги.
- Во-первых, нам нужно знать, какую миграцию схемы является
Миграция схемы (также миграция базы данных, управление изменением базы данных) относится к управлению инкрементными, обратимыми изменениями и контролем версий к схемам реляционных баз данных. Миграция схемы выполняется в базе данных всякий раз, когда необходимо обновлять или вернуть схему этой базы данных для некоторой новой или старой версии. Миграция проводится программно, используя инструмент миграции схемы. При вызове с указанной желаемой версией схемы инструмент автоматизирует последовательное приложение или изменение соответствующей последовательности изменений схемы до тех пор, пока не приведет к желаемому состоянию. источник
- Итак, как упомянуто выше, миграция схемы хороша правда? Да, это когда у нас есть один экземпляр программы, которая управляет миграцией схемы, мы свободны мигрировать его в любое время, которые нам нужны, и мы не беспокоились о синхронизации, или какой экземпляр будет мигрировать первым, но когда экземпляры более 1 мы сталкиваемся с гонками и проблема с какой экземпляром должна выполняться миграция
В этом разделе мы постараемся привлечь вас в наш процесс мышления и плюсы и минусы каждого решения и почему мы выбрали решение, которое мы сделали.
Экаспецитальная миграция внутри изображения
Сначала мы думали о капсулировании Процесс миграции внутри
изображение
сам Но есть 3 причины, почему мы не пошли на этот вариант- SOC ( Разделение озабоченности ), потому что это не обязанность изображений для миграции базы данных
- Состояние расы, когда у нас есть несколько реплик изображений, нужно мигрировать одновременно и Кубернаны Время создания стручков не может контролироваться
- Неоднозначное поведение, несколько реплик, пытающихся мигрировать одновременно, приводит к неоднозначным поведению, которое мы не могли отслеживать, и мы решили не идти вперед с этим, потому что компонент развертывания в Kubernetes создает стручки в произвольном порядке, и все стручки могут начать процесс миграции и сделать несоответствие в базе данных
- Из-за причин, по которым мы упомянули выше, мы решили не идти вперед с этим решением Эта диаграмма показывает состояние гонки происходит, когда 3 реплики пытаются переносить схему одновременно
Initcontainers
- Это почти похоже на предыдущее решение и имеет одинаковые минусы
Работа Kubernetes
Работа создает один или несколько стручков и будет продолжать повторить выполнение стручков до тех пор, пока не завершилось определенное количество их успешно. Поскольку стручки успешно завершены, работа отслеживает успешные завершения. Когда достигнуто указанное количество успешных завершений, задача (т. Е. Работа) завершена. Удаление задания очистят его созданные стручки.
Поэтому, как упомянуто выше, функциональность задания Kubernetes — создать один POD, который выполняет определенную работу, затем умирает без перезапуска, и это именно то, что нам нужно, чтобы провести нашу миграцию один раз и в одном POD Только
Предварительные условия
- Это решение предполагает, что у вас хороший фон о Докер , Кубернаны и шлем
- Наличие
kubectl
На вашей локальной машине и настроен на ваш кластер - У вас есть кубернаны вверх и работает — мы не обсуждаем настройку кластера K8S здесь
- Если нет, вы можете использовать Minikube
- Мы будем использовать PHP/Laravel здесь, чтобы продемонстрировать наше решение
- У нас есть PHP/Laravel Pod
- Мы настроили нашу базу данных с PHP
- Наша база данных вверх и работает — ни в кластере или вне кластера
Использовать дело
- Нам нужно добавить новую таблицу в нашу базу данных
php artisan make:migration create_flights_table
- Миграция должна быть сделана, и изображение PHP/LARAVAVED переработано, это где наше решение приходит решить эту проблему
Конфигурация
- В конце концов мы пошли с решением работы Kubernetes
- Это пример того, что мы сделали, чтобы перенести базу данных
- Вы должны иметь
Значения.yaml
Файл, чтобы обратиться к значениям, которые мы упоминали здесь, используя ШЛЕМ
apiVersion: batch/v1 kind: Job metadata: name: {{ include "APPLICATION.fullname" . }}-database-migration-job spec: template: spec: containers: - name: {{ include "APPLICATION.fullname" . }}-database-migration-job image: "{{ .Values.databaseMigration.image }}:{{.Values.databaseMigration.imageTag}}" imagePullPolicy: {{ .Values.image.pullPolicy }} args: - php - artisan - migrate env: - name: ENV_VARIABLE value: "false" envFrom: - configMapRef: name: {{ include "APPLICATION.fullname" . }} - secretRef: name: {{ .Values.laravel.secrets_names.laravel_secrets}} restartPolicy: Never
Запустить
- Чтобы запустить работу и развернуть использование ШЛЕМ Мы работаем в корневом каталоге
helm upgrade --install -n [NAMESPACE] api .
- Чтобы запустить работу, используя
kubectl
, вы должны заполнить переменные вместо использованияValues.yaml.
kubectl apply -f job.yaml
Тестирование
- Вы можете увидеть работу и POD, как он выглядит так:
kubectl get jobs
kubectl get pods
Мы видим, что POD для работы создан, пробежал и остановился после завершения
Мы можем увидеть журналы POD, чтобы убедиться, что наша миграция выполняется хорошо
Призывая работа
Сначала нам нужно знать, что рабочие места Kubernetes не по умолчанию не повторяют, мы обнаружили, что мы должны развернуть работу каждый раз, когда вы развертываете Поэтому мы решили перераспределить каждый раз, используя наш CI/CD-трубопровод — снаружи этой статьи — вы можете связаться со мной, чтобы помочь вам настроить ваш трубопровод
автор
написано мной Ахмед Ханафи Не стесняйтесь связаться со мной, если у вас есть какие-либо вопросы
Оригинал: «https://dev.to/ahmeddrawy/database-schema-migration-to-kubernetes-initcontainers-vs-k8s-jobs-4a4f»