迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > MySQL >

如何使用 Oracle 的 Operator 在 Kubernetes 上运行 MySQL

作者:迹忆客 最近更新:2022/12/30 浏览次数:

Kubernetes 对有状态应用程序的支持在过去几年中已经相当成熟。 现在可以将你的数据库定位在你的集群中,使其受益于与你的其他工作负载相同的可扩展性。

MySQL 是最流行的关系数据库引擎之一,现在由官方 Kubernetes Operator 维护开发。 Oracle 主导的开源项目提供了一种在 Kubernetes 中创建托管 MySQL 集群的简单方法。

在本文中,你将学习如何安装 Operator 并开始配置数据库。 Operator 自动创建服务,以便你其他容器中的应用程序可以连接到 MySQL。


什么是 MySQL 运算符?

Oracle 的 MySQL 运算符是一个在集群内部运行的组件,用于自动执行数据库初始化。 你不需要运维人员在 Kubernetes 中使用 MySQL——你可以使用 StatefulSet 自行部署官方容器镜像。 但是这种方法很麻烦,需要你编写和维护长清单文件以创建可靠的环境。

Operator 提供一组可用于创建数据库的自定义资源。 将 InnoDBCluster 对象添加到你的 Kubernetes 集群会提示 Operator 为你设置 StatefulSets存储网络。 它还自动升级和备份,大大减轻了管理员的负担。

安装 MySQL Operator

包含的 Helm chart 是在集群中安装 Operator 的最简单方法。 如果你的环境中没有 Helm,可以使用清单文件作为替代。

首先将操作员添加到你的 Helm 存储库列表中:

$ helm repo add mysql-operator https://mysql.github.io/mysql-operator/

接下来更新 Helm 的存储库数据库,以便它发现可用的图表:

$ helm repo update

现在使用以下命令将 Operator 安装到名为 mysql-operator 的新命名空间中:

$ helm install mysql-operator mysql-operator/mysql-operator \
    --namespace mysql-operator \
    --create-namespace
NAME: mysql-operator
LAST DEPLOYED: Sat Oct 29 15:00:26 2022
NAMESPACE: mysql-operator
STATUS: deployed
REVISION: 1
TEST SUITE: None

该过程可能需要几秒钟才能完成。


创建 Root 用户凭据密钥

你创建的每个数据库集群都必须附带一个 Kubernetes 密钥,其中包含 MySQL root 用户的凭据。 Operator 将使用密钥中提供的用户名和密码创建 root 特权帐户。

复制以下 YAML 清单并将 rootPassword 字段的值更改为安全的值。 如果适用于你的情况,也可以更改用户名和用户主机设置。 请记住,此处命名的帐户将完全控制 MySQL; 稍后应该使用常规的 MySQL shell 为你的应用程序设置单独的用户。

apiVersion: v1
kind: Secret
metadata:
  name: mysql-root-user
stringData:
  rootHost: "%"
  rootUser: "root"
  rootPassword: "P@$$w0rd"

将文件另存为 secret.yaml。 现在使用 Kubectl 将密钥添加到集群:

$ kubectl apply -f secret.yaml
secret/mysql-root-user created

创建基本集群

接下来创建一个名为 mysql.yaml 的新 YAML 文件并复制以下内容:

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
  name: mysql-cluster
spec:
  secretName: mysql-root-user
  instances: 3
  tlsUseSelfSigned: true
  router:
    instances: 1

这使用 MySQL Operator 提供的 InnoDBCluster 自定义资源定义了一个对象。 将清单应用到您的集群将创建一个自动配置复制的新 MySQL 数据库。 在继续之前检查并更改清单中的以下属性:

  • spec.secretName – 这必须与你之前创建的密钥的 metadata.name 相匹配。 将读取引用的密钥以设置 MySQL root 用户帐户。
  • spec.instances – 这定义了要运行多少个 MySQL 副本 (Pod)。 目前最多支持 10 个副本。
  • spec.tlsUseSelfSigned – 该字段在此示例中设置为 true 以使用包含的自签名 TLS 证书。 你可以选择通过设置 spec.tlsSecretName/spec.tlsCASecretName 字段通过 Kubernetes 秘密提供你自己的证书。
  • spec.router.instances – MySQL Router 组件负责在可用的 MySQL 副本之间引导服务流量。 该字段定义要运行的路由器实例数。 多个实例将提高高流量情况下的性能和弹性。

使用 Kubectl 应用清单并创建数据库集群:

$ kubectl apply -f mysql.yaml
innodbcluster.mysql.oracle.com/mysql-cluster created

MySQL 初始化过程可能需要几分钟才能完成。 Operator 使用多个初始化容器来设置用户帐户和配置 MySQL 的数据目录。 稍等片刻,然后运行 kubectl get pods 检查正在运行的内容:

$ kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
mysql-cluster-0                         2/2     Running   0          2m
mysql-cluster-1                         2/2     Running   0          2m
mysql-cluster-2                         2/2     Running   0          2m
mysql-cluster-router-6b68f9b5cb-wbqm5   1/1     Running   0          2m

三个 MySQL 副本和单个路由器实例都处于 Running 状态。 数据库现在可以使用了。


连接到你的集群

MySQL Operator 创建一个 Kubernetes 服务,将流量从你的应用程序 Pod 路由到你的数据库。 该服务被分配了一个主机名,格式如下:

<cluster-name>.<namespace-name>.svc.cluster.local

上面显示的示例集群的正确主机名是 mysql-cluster.default.svc.cluster.local。 配置你的应用程序以使用端口 3306 和你在密钥中定义的用户凭证连接到此地址的 MySQL。

从外部访问你的数据库

你可以使用 Kubectl 的端口转发功能从集群外部访问 MySQL。 运行以下命令打开一个新的端口转发会话:

$ kubectl port-forward service/mysql-cluster 3306

mysql-cluster 替换为你要连接的 InnoDBCluster 的名称。 现在你可以使用本地工具与数据库交互:

$ mysql -h127.0.0.1 -u root -p

在运行 kubectl port-forward 命令的终端窗口中按 Ctrl+C 将关闭连接。


自定义 MySQL 服务器设置

你可以通过在 InnoDBCluster 对象的清单中设置 spec.mycnf 字段来提供应用程序所需的任何 MySQL 配置文件选项:

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
  # ...
  mycnf: |
    [mysqld]
    max_connections=500
    innodb_ft_min_token_size=5

Operator 将使用此字段的值将 my.cnf 文件写入数据库 Pod 的文件系统中。


设置存储容量

Operator 会自动创建持久卷 (PV) 和持久卷声明 (PVC) 来存储数据库的数据。 它默认提供 2Gi 的存储空间。

这可以使用 datadirVolumeClaimTemplate 清单字段进行更改,该字段允许你覆盖 Operator 生成的 PVC 资源的属性。 将 resources.requests.storage 属性设置为你需要的容量。

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
  # ...
  datadirVolumeClaimTemplate:
    resources:
      requests:
        storage: 10Gi

你应该将此值设置得足够高,以便你的数据在未来有足够的增长空间。 Operator 不支持就地调整卷大小,因此如果你将来尝试增加容量,会看到错误。 切换到更大的卷将需要手动迁移步骤。


固定 MySQL 版本

你可以使用 spec.versionspec.router.version 字段固定到特定的 MySQL 版本。 这将防止无意的自动升级。 为你的 MySQL Pod 和路由器实例选择相同的版本以保证兼容性。

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
  # ...
  version: 8.0.31
  router:
    instances: 1
    version: 8.0.31

总结

Oracle 的 MySQL Operator 提供了一种在 Kubernetes 集群中运行 MySQL 数据库的便捷机制。 你可以通过创建 InnoDBCluster 对象来提供新的复制数据库。 这比手动创建公开常规 MySQL 容器的 StatefulSet 和服务要简单得多。

使用 Operator 不会妨碍你控制 MySQL 或 Kubernetes 环境的能力。 你可以通过在 spec.podSpec 字段中提供你自己的清单属性来自定义 Pod,并按照上述步骤使用自己的 MySQL 配置文件。 该 Operator 还提供集成备份支持,让你可以定期将数据库复制到外部存储。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 Mysqldump 备份 MySQL 中的数据

发布时间:2023/05/09 浏览次数:192 分类:MySQL

本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。

更新 MySQL 表中的主键

发布时间:2023/05/09 浏览次数:61 分类:MySQL

本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。

在 MySQL 中获取命令历史记录

发布时间:2023/05/09 浏览次数:150 分类:MySQL

本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史

Oracle 的 decode 函数在 MySQL 中的等价物

发布时间:2023/05/09 浏览次数:115 分类:MySQL

本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。

在 Linux 中安装 MySQL 客户端

发布时间:2023/05/09 浏览次数:72 分类:MySQL

在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。

在 MySQL 中转换为十进制

发布时间:2023/05/09 浏览次数:150 分类:MySQL

有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。

在 MySQL 中获取当前日期和时间

发布时间:2023/05/09 浏览次数:145 分类:MySQL

本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间

更改 MySQL 服务器中的 max_allowed_packet Size

发布时间:2023/05/09 浏览次数:142 分类:MySQL

本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便