Развертывание MySQL-MGR без TopoLVM
В этом руководстве приведены инструкции по развертыванию экземпляров MySQL Group Replication (MGR) в кластерах, где TopoLVM недоступен, например в кластерах с MicroOS (SUSE Linux Enterprise Micro) или в других средах, использующих альтернативные provisioner’ы хранилища.
Содержание
Общая информацияПроблемаРешениеПредварительные требованияНеобходимые operator’ыТребования к кластеруШаг 1: Создайте локальный StorageClassШаг 2: Выделите локальные PersistentVolumeСоздайте каталоги на узлахСоздайте ресурсы PVШаг 3 (необязательно): Настройте путь хранения ClickHouse в файловых системах только для чтенияНастройте hostPath перед установкойquery-analytics-operatorИсправление существующего развертывания с неправильным hostPathШаг 4: Создайте экземпляр MySQL-MGRУстранение неполадокPVC застряли в состоянии PendingMySQL pod’ы застряли в CrashLoopBackOffMySQL pod’ы завершаются с ошибкой "data directory has files in it"PV застряли в состоянии ReleasedЭкземпляр застрял в состоянии ErrorReconcilePod’ы ClickHouse завершаются с ошибкой "read-only file system"Общая информация
Проблема
MySQL-MGR обычно полагается на TopoLVM для динамического выделения томов. Однако некоторые среды не поддерживают TopoLVM:
- Кластеры MicroOS: корневая файловая система доступна только для чтения, и TopoLVM может быть не установлен.
- Bare-metal-кластеры: некоторые кластеры используют локальное хранилище с ручным выделением PV.
- Тестовые/оценочные среды: облегченные развертывания без TopoLVM.
Без корректной настройки хранилища pod’ы MySQL не смогут запуститься из-за ошибок связывания PVC или проблем с правами доступа.
Решение
Используйте локальный StorageClass с вручную выделенными PersistentVolume (PV). В этом руководстве рассматриваются:
- Установка зависимостей: убедитесь, что все необходимые operator’ы установлены перед развертыванием MySQL-MGR.
- Создание StorageClass: настройте локальный StorageClass с привязкой
WaitForFirstConsumer. - Выделение PV: создайте локальные PV с корректными путями, правами доступа и политиками очистки.
- Исправление хранилища ClickHouse (необязательно): устраните ошибку
read-only file system, вызванную жестко заданным host path плагина query-analytics. - Создание экземпляра: разверните MySQL-MGR, используя локальный StorageClass.
Предварительные требования
Необходимые operator’ы
Перед развертыванием MySQL-MGR убедитесь, что в кластере установлены следующие основные operator’ы:
Если вам нужны функции query analytics (логирование медленных запросов, анализ запросов), также потребуются следующие operator’ы:
В файловых системах только для чтения (например, MicroOS) вы должны настроить путь хранения ClickHouse в RdsInstaller CR до установки query-analytics-operator. В противном случае operator немедленно создаст PV ClickHouse по пути по умолчанию /cpaas/ck, и это завершится ошибкой read-only file system. Подробности см. в Шаге 3.
Если ваш кластер использует TopoLVM, также потребуется topolvm-operator. Поскольку это руководство описывает развертывание без TopoLVM, он здесь не нужен.
Вы можете проверить, что operator’ы установлены, просмотрев их CSV:
Во всех operator’ах в столбце PHASE должно отображаться значение Succeeded.
Требования к кластеру
- Для production-развертываний рекомендуется как минимум 3 worker-узла (MySQL-MGR требует 3 участников для кворума group replication). Для тестирования возможны развертывания с одним участником.
- Достаточный объем CPU и памяти на каждом узле.
- Доступный для записи путь каталога на всех узлах (например,
/opt/local-pv/в MicroOS).
Шаг 1: Создайте локальный StorageClass
Если в вашем кластере еще нет подходящего StorageClass, создайте его:
volumeBindingMode: WaitForFirstConsumer требуется, чтобы PV связывались только после того, как pod будет запланирован на конкретный узел. Это обеспечивает локальность данных.
Имя StorageClass произвольное. В этом руководстве используется mgr-local-pv, чтобы отличать его от динамического provisioner’а Rancher local-path. Вы можете использовать любое имя, но в последующих шагах должны ссылаться на него последовательно.
Шаг 2: Выделите локальные PersistentVolume
Каждому участнику MySQL-MGR требуется один PV. Для кластера с 3 участниками создайте как минимум 3 PV, распределив их по разным узлам.
Создайте каталоги на узлах
В MicroOS корневая файловая система доступна только для чтения. Используйте /opt/local-pv/ в качестве базового пути:
- Путь: в MicroOS не используйте
/dataили другие пути на уровне корня — это завершится ошибкойread-only file system. Вместо этого используйте/opt/local-pv/. - Права доступа:
chmod 777— это удобный обходной вариант, потому что контейнеры MySQL запускаются от имени пользователя non-root с UID/GID, которые могут не совпадать с хостом. Без прав на записьmysqld --initializeзавершится ошибкойPermission denied. Для production-сред рекомендуется назначать владельцем конкретный UID, используемый контейнером MySQL (обычно999:999), вместо использования777. - Устаревшие данные: если вы повторно используете каталоги PV, сначала удалите все существующие файлы с помощью
rm -rf /opt/local-pv/pvN/*. Инициализация MySQL завершается с ошибкой, если каталог данных не пуст.
Создайте ресурсы PV
Сначала определите имена узлов:
Затем создайте PV, сопоставив каждый с конкретным узлом. Для кластера с 3 участниками на 3 узлах:
Проверьте, что все PV созданы и доступны:
Перед продолжением все PV должны иметь статус Available.
- Используйте
persistentVolumeReclaimPolicy: DeleteвместоRetain. ПриRetainPV после удаления PVC переходят в состояниеReleasedи не могут быть повторно использованы без ручной очистки. - Обратите внимание, что для вручную выделенных локальных PV удаление объекта PV не очищает данные на диске автоматически. Перед повторным использованием вам все равно может понадобиться вручную очистить каталоги.
- Создавайте больше PV, чем минимально требуется, чтобы обеспечить масштабирование и повторное выделение. Однако дополнительные PV не помогают при отказоустойчивости: если узел будет потерян, привязанные к нему PV не могут быть перенесены. Восстановление после потери узла требует ручного повторного выделения и повторной синхронизации данных.
Шаг 3 (необязательно): Настройте путь хранения ClickHouse в файловых системах только для чтения
Этот шаг нужен только если вы планируете использовать функции query analytics (логирование медленных запросов, анализ запросов). Если query analytics не используется, пропустите этот шаг — экземпляры MySQL-MGR будут работать нормально и без него.
Плагин query-analytics разворачивает ClickHouse с помощью PV на каталоге хоста. По умолчанию host path — /cpaas/ck. В MicroOS или других системах с корневой файловой системой только для чтения это приводит к тому, что pod’ы ClickHouse завершаются с ошибкой:
Вы должны настроить hostPath до установки query-analytics-operator. Слияние RdsInstaller → QueryAnalyticsInstaller выполняется только при первом создании CR QueryAnalyticsInstaller (qai). После установки operator’а CR qai уже существует, и последующие изменения в RdsInstaller не будут применены. Чтобы восстановить уже существующее развертывание, см. Исправление существующего развертывания.
Настройте hostPath перед установкой query-analytics-operator
-
Сначала установите rds-operator (если он еще не установлен). CR
RdsInstallerсоздается rds-operator во время инициализации. -
Найдите ресурс
RdsInstaller: -
Отредактируйте
RdsInstaller, чтобы переопределить host path ClickHouse:Установите
spec.slowSQLCK.hostPathв путь на узле, доступный для записи:INFOВ MicroOS используйте путь внутри
/opt/(например,/opt/local-pv/ck). Каталог будет создан автоматически с типомDirectoryOrCreate. -
Теперь установите clickhouse-operator и query-analytics-operator. PV ClickHouse будет создан с использованием настроенного пути вместо значения по умолчанию
/cpaas/ck.
Исправление существующего развертывания с неправильным hostPath
Если query-analytics-operator уже установлен с путем по умолчанию, а pod’ы ClickHouse не запускаются, одного изменения RdsInstaller.spec.slowSQLCK.hostPath недостаточно — слияние в QueryAnalyticsInstaller выполняется только при первом создании qai. Вам также нужно принудительно пересоздать qai (или отредактировать qai напрямую).
Вариант A — пересоздать qai, чтобы слияние выполнилось повторно:
-
Обновите
RdsInstaller, как описано в процедуре перед установкой выше: -
Удалите установку ClickHouse и старый PV:
-
Удалите CR
QueryAnalyticsInstaller.query-analytics-operatorпересоздаст его, объединив обновленные настройкиRdsInstaller: -
Проверьте новый
hostPath:В обоих случаях должен отображаться настроенный путь (например,
/opt/local-pv/ck).
Вариант B — отредактировать qai напрямую (быстрее, но RdsInstaller будет расходиться с qai до следующего пересоздания):
query-analytics-operator пересоздаст установку ClickHouse и PV, используя путь, заданный в qai.
Шаг 4: Создайте экземпляр MySQL-MGR
-
Создайте secret с паролем:
-
Создайте MySQL CR с локальным StorageClass:
INFO- Secret с паролем должен соответствовать соглашению об именовании
mgr-${instance_name}-password. Operator обнаруживает его автоматически по этому имени. - Укажите
storageClassName: mgr-local-pv(или имя вашего StorageClass) в секцииvolumeClaimTemplate. Это заменяет значение по умолчаниюsc-topolvm. - Поле
versionобязательно. Для MySQL 8.0 используйте"8.0".
- Secret с паролем должен соответствовать соглашению об именовании
-
Отслеживайте состояние экземпляра:
Дождитесь, пока поле
STATEстанетready. -
Проверьте привязку PVC и размещение pod’ов:
Убедитесь, что каждый PVC привязан к PV и что pod’ы распределены по разным узлам.
Устранение неполадок
PVC застряли в состоянии Pending
Симптом: PVC остаются в состоянии Pending, а pod’ы не планируются.
Причина: Нет доступных PV, соответствующих имени StorageClass или node affinity, либо PV находятся в состоянии Released.
Исправление:
MySQL pod’ы застряли в CrashLoopBackOff
Симптом: pod’ы MySQL аварийно завершаются с Permission denied во время инициализации.
Причина: У каталогов PV нет прав на запись для non-root пользователя MySQL.
Исправление:
MySQL pod’ы завершаются с ошибкой "data directory has files in it"
Симптом: mysqld --initialize завершается с ошибкой, потому что каталог данных не пуст.
Причина: Каталог PV содержит устаревшие данные от предыдущего развертывания.
Исправление:
PV застряли в состоянии Released
Симптом: PV имеют статус Released и не могут быть привязаны к новым PVC.
Причина: PV были созданы с persistentVolumeReclaimPolicy: Retain.
Исправление: Удалите PV в состоянии Released и создайте их заново с persistentVolumeReclaimPolicy: Delete:
Экземпляр застрял в состоянии ErrorReconcile
Симптом: У экземпляра MySQL отображается условие ErrorReconcile, а поле STATE имеет значение available вместо ready, хотя все pod’ы запущены.
Причина: Цикл reconcile operator’а столкнулся с ошибкой конфликта при обновлении статуса CR.
Исправление: Добавьте аннотацию в MySQL CR, чтобы инициировать повторную reconciliation:
Pod’ы ClickHouse завершаются с ошибкой "read-only file system"
Симптом: Pod’ы ClickHouse не запускаются и завершаются с ошибкой mkdir /cpaas: read-only file system.
Причина: Host path ClickHouse по умолчанию в плагине query-analytics (/cpaas/ck) не существует в файловых системах только для чтения.
Исправление: Следуйте Шагу 3, чтобы задать в CR RdsInstaller значение spec.slowSQLCK.hostPath на путь, доступный для записи.