本文以 Oracle MySQL 为例,介绍如何在KubeBlocks中配置参数模板。
前提条件
了解 K8s 基本概念,例如 Pod,ConfigMap 等。
完成 Tutorial 1。
了解 Go Template(非必须)。
背景知识
在创建 Cluster 时,我们通常会根据资源情况、性能需求、环境等信息调整参数。云数据库厂商,如 AWS、Aliyun 也提供了不同的参数模版(例如 RDS 有高性能模版,异步模版等)供用户选择,快速启动。
在本文中,我们会介绍 Kubeblocks 中参数配置的相关内容,包括如何添加参数模版、如何修改参数、如何配置参数校验。
在 K8s 中,用户可将参数文件以 ConfigMap 的形式挂载到 Pod 的卷上。
但是 K8s 只管理 ConfigMap 的更新,并将其同步到 Pod 卷上。如果数据库引擎不支持动态加载配置文件(例如 MySQL,Postgres),那我们只能登录数据库并执行更新操作。通过直接登录数据库的方式操作,就很容易导致配置漂移。
为了防止配置漂移,KubeBlocks 是通过 ConfigMap 来管理参数,且秉持理念是:
ConfigMap is the only source-of-truth,即所有配置的变更都是先应用到 ConfigMap 上,然后根据参数的不同生效方式,再应用到 Cluster 的每个 Pod 上。参数/配置更新的话题我们会在下一个教程中详细说明。
ConfigTemplate 配置模板/参数模板
KubeBlocks 通过
Go Template 来渲染参数模版,除了常见函数,还内置了一些数据库中常用到的计算函数(例如
callBufferSizeByResource,
getContainerCPU)
KubeBlocks 增强的渲染能力,能让你快速定制一个 自适应参数模板(Adaptive ConfigTemplate),可根据上下文(例如内存、CPU 大小)来渲染合适的配置文件。
添加参数模版
apiVersion: v1
kind: ConfigMap
metadata:
name: oracle-mysql-config-template
labels:
{{- include "oracle-mysql.labels" . | nindent 4 }}
data:
my.cnf: |-
{{`
[mysqld]
port=3306
{{- $phy_memory := getContainerMemory ( index $.podSpec.containers 0 ) }}
{{- $pool_buffer_size := ( callBufferSizeByResource ( index $.podSpec.containers 0 ) ) }}
{{- if $pool_buffer_size }}
innodb_buffer_pool_size={{ $pool_buffer_size }}
{{- end }}
# if memory less than 8Gi, disable performance_schema
{{- if lt $phy_memory 8589934592 }}
performance_schema=OFF
{{- end }}
[client]
port=3306
socket=/var/run/mysqld/mysqld.sock
`
}}
Figure 1. ConfigTemplate for Oracle MySQL
Figure 1. 展示了一个通过 ConfigMap 定义的 MySQL 的 自适应参数模板。
模板中配置了几个常见的 mysql 参数,包括 port,innodb_buffer_pool_size 等。
它根据容器启动时配置的 memory
计算得到
innodb_buffer_size 大小(line 11 ~ line 15)。
并且在 memory 小于 8Gi 时,关闭
performance_schema 来减少性能影响 (line 32 ~ line 34)。
callBufferSizeByResource 是 KubeBlocks 预定义的一个 bufferPool 计算规则,主要为 MySQL 服务。
此外,你也可以通过查询 memory 和 cpu 来定制你的计算公式:
getContainerMemory 获取 Pod 上某个 container 的 memory 大小。
getContainerCPU 获取 Pod 中某个 container 的 cpu 大小。
可以按照需求定制更多的参数计算方式,比如
根据 memory 大小,计算出一个合适的
max_connection 值。
根据 memory 总量,计算其他组件的合理配置。
使用参数模版
修改 ClusterDefinition
我们在
ClusterDefinition 可以通过
configSpecs 来指定参数模板,引用在 Figure 1. 中定义的 ConfigMap。
componentDefs:
- name: mysql-compdef
configSpecs:
- name: mysql-config
templateRef: oracle-mysql-config-template # 定义了参数模板的 ConfigMap 名
volumeName: configs # 挂载的卷名称
namespace: {{ .Release.Namespace }} # 该参数模板 ConfigMap 的 namespace
podSpec:
containers:
- name: mysql-container
volumeMounts:
- mountPath: /var/lib/mysql
name: data
- mountPath: /etc/mysql/conf.d # 挂载的配置文件路径,引擎相关
name: configs # 和 line 6 的 volumeName 对应
ports:
...
Figure 2. Specify ConfigTemplate in ClusterDefinition
如 Figure 2 所示,我们需要修改
ClusterDefinition.yaml 文件,添加了
configSpecs 字段(line 3 ~ 7)。
我们需要分别指定
templateRef:模板所在的 ConfigMap 对象名称。
volumeName:挂载到 Pod 的卷名。
namespace:模板文件的名空间(ConfigMap 是 namespace scope 的,一般为 KubeBlocks 安装的名空间)。
查看配置信息
当一个新的 Cluster 创建后,KubeBlocks 会根据配置模板渲染好对应的 configmap,并将该 configMap 挂载到
configs 卷中。1. 安装 Helm chart
helm install oracle-mysql path-to-your-helm-char/oracle-mysql
2. 创建集群
kbcli cluster create mycluster --cluster-definition oracle-mysql --cluster-version oracle-mysql-8.0.32
3. 查看配置
kbcli 提供了
describe-config 子命令来查看集群的配置信息。
kbcli cluster describe-config mycluster --component mysql-compdef
ConfigSpecs Meta:
CONFIG-SPEC-NAME FILE ENABLED TEMPLATE CONSTRAINT RENDERED COMPONENT CLUSTER
mysql-config my.cnf false oracle-mysql-config-template mycluster-mysql-compdef-mysql-config mysql-compdef mycluster
History modifications:
OPS-NAME CLUSTER COMPONENT CONFIG-SPEC-NAME FILE STATUS POLICY PROGRESS CREATED-TIME VALID-UPDATED
可以查看到:
配置模版名:oracle-mysql-config-template
渲染后的 ConfigMap:mycluster-mysql-compdef-mysql-config
加载的文件名:my.cnf
总结
本文介绍了通过参数模板来渲染“自适应”参数的能力。
K8s 会将 ConfigMap 的变更定时同步到 Pod 上,但是大部分引擎并不会主动加载新的配置(比如 MySQL,PostgreSQL,Redis)。因为,我们无法仅通过修改 ConfigMap 就实现到 Reconfig(参数变更)的能力。会在下一个 Tutorial 中介绍如何配置变更。
Appendix
A.1 如何配置多个参数模版
在生产环境中,我们通常需要多个参数模板,来满足不同需求。例如 Aliyun RDS 就提供了高性能参数模板、异步模板等。
在 KubeBlocks 中,我们可以通过配置多个
ClusterVerion 来实现这一需求。
还记得我们对 cluster 的定义吗,cluster 可以表示为:

其中 JoinKey 就是 Component Name。
多个 ClusterVersion 可以和同一个 ClusterDefinition 组合。
## 第一个 ClusterVersion,使用 ClusterDefinition 中的配置
apiVersion: apps.kubeblocks.io/v1alpha1
kind: ClusterVersion
metadata:
name: oracle-mysql
spec:
clusterDefinitionRef: oracle-mysql
componentVersions:
- componentDefRef: mysql-compdef
versionsContext:
containers:
- name: mysql-container
...
---
## 第二个 ClusterDefinition,定义了自己的 configSpecs,会覆盖 ClusterDefinition 的配置
apiVersion: apps.kubeblocks.io/v1alpha1
kind: ClusterVersion
metadata:
name: oracle-mysql-perf
spec:
clusterDefinitionRef: oracle-mysql
componentVersions:
- componentDefRef: mysql-compdef
versionsContext:
containers:
- name: mysql-container
...
# name needs to consistent with the name of the configmap defined in clusterDefinition
configSpecs:
- name: mysql-config
templateRef: oracle-mysql-perf-config-template
volumeName: configs
Figure 3. Specify ConfigTemplates in ClusterVersion
Figure 3. 创建了两个
ClusterVersion 对象。
第一个使用了默认的参数模版(没有配置任何信息)。第二个通过
configSpecs 指定了一个新的参数模版
oracle-mysql-perf-config-template。
在创建 Cluster 时,我们可以指定
ClusterVersion 参数来创建不同配置的Cluster,如:
kbcli cluster create mysqlcuster --cluster-definition oracle-mysql --cluster-version oracle-mysql-perf
注意:KubeBlocks 会通过
configSpecs.name 来合并 ClusterVersion 和 ClusterDefinition 中的配置。因此我们必须确保在 ClusterVersion 中定义的
configSpecs.name 和 ClusterDefinition 中定义的名称一致。
编辑推荐:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 轻松集成系列三:如何在 KubeBlocks 中配置参数模板|以 Oracle MySQL 为例
- 轻松集成系列四:如何在 KubeBlocks 中更新参数|以 Oracle MySQL 为例
- 明明只改了一行语句,为啥锁有这么多?
明明只改了一行语句,为啥锁有这么多?
26-03-01 - 2023 年中国金融级分布式数据库市场报告:TiDB 位列领导者梯队
2023 年中国金融级分布式数据库市场报告:TiDB 位列领导者梯队
26-03-01 - HTAP 还可以这么玩?丨TiDB 在 IoT 智慧园区的应用
HTAP 还可以这么玩?丨TiDB 在 IoT 智慧园区的应用
26-03-01 - 糟了,数据库崩了,又好像没蹦
糟了,数据库崩了,又好像没蹦
26-03-01 - MVCC多版本控制机制:mysql事务时光机!
MVCC多版本控制机制:mysql事务时光机!
26-03-01 - MVCC多版本控制机制:mysql事务时光机!
MVCC多版本控制机制:mysql事务时光机!
26-03-01 - MySQL隔离级别解析:数据一致性与高并发之间的平衡术!
MySQL隔离级别解析:数据一致性与高并发之间的平衡术!
26-03-01 - 数据库数据恢复—无备份,binlog未开启的Mysql数据库数据恢复案例
数据库数据恢复—无备份,binlog未开启的Mysql数据库数据恢复案例
26-03-01
