不依赖 TopoLVM 部署 MySQL-MGR
本指南介绍如何在未安装 TopoLVM 的集群上部署 MySQL Group Replication(MGR)实例,例如运行 MicroOS(SUSE Linux Enterprise Micro)或使用其他存储 provisioner 的环境。
目录
背景挑战解决方案前提条件必需的 Operator集群要求步骤 1:创建本地 StorageClass步骤 2:provision 本地 PersistentVolumes在节点上创建目录创建 PV 资源步骤 3(可选):在只读文件系统上配置 ClickHouse 存储路径在安装 query-analytics-operator 之前配置 hostPath修复使用错误 hostPath 的现有部署步骤 4:创建 MySQL-MGR 实例故障排查PVC 一直处于 PendingMySQL Pod 一直处于 CrashLoopBackOffMySQL Pod 因 “data directory has files in it” 失败PV 一直处于 Released 状态实例一直处于 ErrorReconcileClickHouse Pod 因 “read-only file system” 失败背景
挑战
MySQL-MGR 通常依赖 TopoLVM 进行动态卷分配。但是,某些环境不支持 TopoLVM:
- MicroOS 集群:根文件系统为只读,且可能未安装 TopoLVM。
- 裸金属集群:某些集群使用本地存储并通过手动方式 provision PV。
- 测试/评估环境:不包含 TopoLVM 的轻量级部署。
如果没有正确配置存储,MySQL Pod 将因 PVC 绑定失败或权限问题而无法启动。
解决方案
使用通过手动 provision 的 PersistentVolumes(PV)构建本地 StorageClass。本指南涵盖以下内容:
- 依赖安装:在部署 MySQL-MGR 之前,确保已安装所有必需的 operator。
- StorageClass 创建:配置带有
WaitForFirstConsumer绑定模式的本地 StorageClass。 - PV provision:创建具有正确路径、权限和回收策略的本地 PV。
- ClickHouse 存储修复(可选):避免由 query-analytics plugin 的硬编码主机路径导致的
read-only file system错误。 - 实例创建:使用本地 StorageClass 部署 MySQL-MGR。
前提条件
必需的 Operator
在部署 MySQL-MGR 之前,请确保集群上已安装以下核心 operator:
如果你需要查询分析功能(慢查询日志、查询分析),还需要以下 operator:
在只读文件系统上(例如 MicroOS),你必须在安装 query-analytics-operator 之前,在 RdsInstaller CR 中配置 ClickHouse 存储路径。否则,该 operator 会立即在默认的 /cpaas/ck 主机路径下创建 ClickHouse PV,随后会因 read-only file system 而失败。详情请参见 步骤 3。
如果你的集群使用 TopoLVM,还需要 topolvm-operator。由于本指南介绍的是非 TopoLVM 部署,因此此处不需要它。
你可以通过检查 CSV 来验证这些 operator 是否已安装:
所有 operator 在 PHASE 列中都应显示 Succeeded。
集群要求
- 生产部署建议至少有 3 个 worker 节点(MySQL-MGR 需要 3 个成员才能满足 group replication quorum)。测试环境可以使用单成员部署。
- 每个节点都应具备足够的 CPU 和内存资源。
- 所有节点上都应有一个可写目录路径可用(例如 MicroOS 上的
/opt/local-pv/)。
步骤 1:创建本地 StorageClass
如果你的集群尚未拥有合适的 StorageClass,请创建一个:
必须使用 volumeBindingMode: WaitForFirstConsumer,这样 PV 只会在 Pod 调度到某个特定节点之后再进行绑定。这可确保数据本地性。
StorageClass 名称可以自定义。本指南使用 mgr-local-pv,以将其与 Rancher 的 local-path 动态 provisioner 区分开。你可以使用任意名称,但在后续步骤中必须始终一致地引用它。
步骤 2:provision 本地 PersistentVolumes
每个 MySQL-MGR 成员都需要一个 PV。对于 3 成员集群,至少创建 3 个 PV,并分布在不同节点上。
在节点上创建目录
在 MicroOS 上,根文件系统是只读的。请使用 /opt/local-pv/ 作为基础路径:
- 路径:在 MicroOS 上,不要使用
/data或其他根级路径——它们会因read-only file system而失败。请改用/opt/local-pv/。 - 权限:
chmod 777是一种临时便利方案,因为 MySQL 容器以非 root 用户运行,其 UID/GID 可能与宿主机不匹配。如果没有写权限,mysqld --initialize将因Permission denied而失败。对于生产环境,建议将所有权设置为 MySQL 容器使用的特定 UID(通常为999:999),而不是使用777。 - 旧数据:如果重复使用 PV 目录,请先使用
rm -rf /opt/local-pv/pvN/*删除所有现有文件。如果数据目录不为空,MySQL 初始化会失败。
创建 PV 资源
首先,获取节点名称:
然后创建 PV,并将每个 PV 映射到特定节点。对于跨 3 个节点的 3 成员集群:
验证所有 PV 都已创建且可用:
在继续之前,所有 PV 的状态都应显示为 Available。
- 使用
persistentVolumeReclaimPolicy: Delete,而不是Retain。使用Retain时,PV 在 PVC 删除后会进入Released状态,并且如果不手动清理将无法重新使用。 - 请注意,对于手动 provision 的本地 PV,删除 PV 对象不会自动清理磁盘上的数据。你在复用之前仍可能需要手动清空目录。
- 创建比最小需求更多的 PV,以便支持扩容和重新 provision。不过,额外的 PV 并不能帮助故障转移:如果某个节点丢失,绑定到该节点的 PV 无法迁移。节点故障后的恢复需要手动重新 provision 和数据重新同步。
步骤 3(可选):在只读文件系统上配置 ClickHouse 存储路径
只有在你计划使用查询分析功能(慢查询日志、查询分析)时才需要执行此步骤。如果你不使用查询分析,可以跳过此步骤——MySQL-MGR 实例仍可正常运行。
query-analytics plugin 会使用主机目录 PV 来部署 ClickHouse。默认情况下,主机路径是 /cpaas/ck。在 MicroOS 或其他根文件系统只读的系统上,这会导致 ClickHouse Pod 启动失败,并出现如下错误:
你必须在安装 query-analytics-operator 之前 配置 hostPath。RdsInstaller → QueryAnalyticsInstaller 的合并只会在 QueryAnalyticsInstaller(qai)CR 首次创建时执行。一旦 operator 安装完成,qai CR 已经存在,之后对 RdsInstaller 的修改将不会传播。若要恢复已有部署,请参见修复使用错误 hostPath 的现有部署。
在安装 query-analytics-operator 之前配置 hostPath
-
先安装 rds-operator(如果尚未安装)。
RdsInstallerCR 会在 rds-operator 初始化期间创建。 -
查找
RdsInstaller资源: -
编辑
RdsInstaller,覆盖 ClickHouse 的主机路径:将
spec.slowSQLCK.hostPath设置为节点上的可写路径:INFO在 MicroOS 上,请使用
/opt/下的路径(例如/opt/local-pv/ck)。该目录将通过DirectoryOrCreate类型自动创建。 -
现在安装 clickhouse-operator 和 query-analytics-operator。ClickHouse PV 将使用已配置的路径创建,而不是默认的
/cpaas/ck。
修复使用错误 hostPath 的现有部署
如果 query-analytics-operator 已使用默认路径安装且 ClickHouse Pod 已经失败,仅编辑 RdsInstaller.spec.slowSQLCK.hostPath 还不够——因为合并到 QueryAnalyticsInstaller 的逻辑只会在 qai 首次创建时运行。你还必须强制重新创建 qai(或直接编辑 qai)。
方案 A — 重新创建 qai 以重新执行合并:
-
按照上面的预安装步骤更新
RdsInstaller: -
删除 ClickHouse 安装和旧 PV:
-
删除
QueryAnalyticsInstallerCR。query-analytics-operator 将重新创建它,并合并更新后的RdsInstaller设置: -
验证新的
hostPath:两者都应显示已配置的路径(例如
/opt/local-pv/ck)。
方案 B — 直接编辑 qai(更快,但在下次重新创建之前,RdsInstaller 将与 qai 不一致):
query-analytics-operator 将使用 qai 上设置的路径重新创建 ClickHouse 安装和 PV。
步骤 4:创建 MySQL-MGR 实例
-
创建密码 secret:
-
使用本地 StorageClass 创建 MySQL CR:
INFO- 密码 secret 必须遵循命名约定
mgr-${instance_name}-password。operator 会自动按该名称发现它。 - 在
volumeClaimTemplate部分将storageClassName设置为mgr-local-pv(或你的 StorageClass 名称)。这将替换默认的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
现象:MySQL Pod 在初始化期间因 Permission denied 崩溃。
原因:PV 目录没有为非 root 的 MySQL 用户提供写权限。
修复:
MySQL Pod 因 “data directory has files in it” 失败
现象:mysqld --initialize 因数据目录不为空而失败。
原因:PV 目录中包含上一次部署遗留的数据。
修复:
PV 一直处于 Released 状态
现象:PV 显示为 Released,无法绑定到新的 PVC。
原因:PV 创建时使用了 persistentVolumeReclaimPolicy: Retain。
修复:删除这些处于 Released 状态的 PV,并使用 persistentVolumeReclaimPolicy: Delete 重新创建:
实例一直处于 ErrorReconcile
现象:MySQL 实例显示 ErrorReconcile 条件,且即使所有 Pod 都在运行,STATE 字段仍显示为 available 而不是 ready。
原因:operator 的 reconcile 循环在更新 CR 状态时遇到冲突错误。
修复:为 MySQL CR 添加注解,触发一次新的协调:
ClickHouse Pod 因 “read-only file system” 失败
现象:ClickHouse Pod 启动失败,并出现 mkdir /cpaas: read-only file system。
原因:query-analytics plugin 默认的 ClickHouse 主机路径(/cpaas/ck)在只读文件系统上不存在。
修复:按照步骤 3 的说明,在 RdsInstaller CR 中将 spec.slowSQLCK.hostPath 设置为一个可写路径。