跳到主要内容

参数更新

本文档继续以 Oracle MySQL 为例,介绍如何在 KubeBlocks 中配置参数模板并更新参数(点击参考完整 PR)。

开始之前

  1. 了解 K8s 基本概念,例如 Pod、ConfigMap 等。
  2. 阅读参数模板文档。
  3. 了解 Go Template (非必须)。
  4. 了解 CUE Lang (非必须)。

背景知识

KubeBlocks 通过将 ConfgMap 挂载到卷的方式来添加配置,并秉持 Kubernetes-Native 的理念,即:ConfigMap is the only source-of-truth,将参数变更的入口收敛到 ConfigMap,防止出现配置漂移(drifting)。所以 KubeBlocks 的参数变更遵从以下顺序:

  1. 先修改 ConfigMap 中的参数值;
  2. 根据 ConfigMap 的变更推导出参数变化(add/delete/update);
  3. 将变更应用到引擎。

不同参数的更新方式不同,主要有以下两类:

  • 静态参数,通过重启集群生效(冷更新);
  • 动态参数,通过动态刷参生效(热更新)。

Table 1. 枚举了 4 种常见的动态刷参方式,包括 UNIX Signal、SQL、Auto 等。目前 KubeBlocks 对接的引擎都可以通过其中一种或者多种方式来实现。例如,在 PostgreSQL 中,要实现动态刷参,可以:

  • UNIX Signal:下发 SIGHUP 信号;
  • Tools:调用 pg_ctl 命令;
  • SQL:执行 SQL 语句,直接更新内存参数。

📎 Table 1. 参数热更新方式总结

变更方式说明适用范围
Unix Signal例如 PostgreSQL。
参数变更后,如果需要重新加载配置文件,可以给 PG 发送 SIGHUP 信号。
适用于支持 UNIX Signal 变更的引擎。
SQL例如 MySQL。
需要通过 SQL 语句发下变更内容 SET GLOBAL <var> =<value>
适用于大部分 RDBMS 引擎。
: 需要适配 execSQL 接口。目前 KubeBlocks 只支持 MySQL 和 PostgreSQL。
Tools例如 Redis or MongoDB。
提供了相关的 tools 工具来更新参数。
通过自定义脚本或者本地工具实现,通用性高。
Auto引擎本身会 watch 配置文件的变化,检查到配置文件变更后,会主动更新。依赖引擎是否支持自动加载。

参数模板一文中提到,K8s 通过卷挂载方式使用 ConfigMap 时,该 ConfigMap 的变更会被更新到 Pod。但这个变更不是实时的。因此,KuBeBlocks 不仅需要区分参数的更新方式,还要 watch 对应的变更是否已经同步到 Pod 上。 了解这些背景之后,来看看 KubeBlocks 是怎么通过 ConfigConstraint API 管理参数变更的。

ConfigConstraint

作为一个支持多引擎的平台,KubeBlocks 需要了解如下信息,更好地支持配置变更:

  1. 配置文件的格式。

    不同格式的配置文件的结构不同。KubeBlocks 会根据结构解析配置文件,推导出每次变更的信息(增加/删除/更新的参数)。

  2. 参数的作用方式。

    指定参数的作用方式(effect scope),知道哪些是动态参数,哪些是静态参数,哪些是不可变参数,帮助决策,使参数快速生效。

  3. 参数动态变更的方式。

    如 Table 1. 所示,参数动态变更的方式很多。需要根据引擎指定其适用的动态变更方式。

  4. 定义参数校验规则。

    用于校验参数的有效值,防止误操作。在生产环境中,经常会有“手误”写错了参数值,导致数据库无法启动的情况。参数校验增加了一层保护,提前做校验,防止此类误操作。

备注

KubeBlocks 会为配置了 ConfigConstraint 的 Component 创建一个 config-manager sidecar,用于感知配置文件的更新、下发 Signal、执行参数更新脚本等。

这些信息被抽象到 KubeBlocks 的 ConfigConstraint(参数约束)中,如下所示。其中一共有 4 个部分,对应前文提到的 4 个关键配置信息。

apiVersion: apps.kubeblocks.io/v1alpha1
kind: ConfigConstraint
metadata:
name: oracle-mysql-config-constraints
spec:
# 1. 指定配置文件格式为 INI,且只关注其中 mysqld 小节的内容
formatterConfig:
format: ini
iniConfig:
sectionName: mysqld

# 2. MySQL 的动态刷参方式,通过 reload-script 执行 SQL 语句
reloadOptions:
tplScriptTrigger:
sync: true
# 指定用哪个脚本文件更新
scriptConfigMapRef: oracle-mysql-reload-script
namespace: {{ .Release.Namespace }}

## 3.1 配置静态参数列表
staticParameters:
- open_files_limit
- performance_schema
- enforce_gtid_consistency

## 3.2 配置动态参数列表
dynamicParameters:
- innodb_buffer_pool_size
- max_connections
- gtid_mode

## 4. 通过 CUE 模板,定义参数校验规则
cfgSchemaTopLevelName: MysqlParameter
configurationSchema:
cue: |-
{{- .Files.Get "config/oracle-mysql-config-constraint.cue" | nindent 6 }}

下面逐个解释每个 API 的使用方法。

FormatterConfig

FormatterConfig 描述了配置文件的格式。常见的格式有 iniyamljsonxmlproperties 等。配置文件本身只是一个文本信息,不同格式的文件都需要不同的解析器。

当 KubeBlocks 感知到配置文件变更时,会根据已知的格式推导出参数的变更(增/删/改),并通知 Pod 去更新。

例如,MySQL 的可调整的参数来自 ini 格式,且只解析其中的 mysqld 字段信息。

  formatterConfig:
format: ini # 配置文件格式,目前支持 ini、xml、yaml、json、hcl 等格式
iniConfig:
sectionName: mysqld # 如果是 ini 格式,可能包含多个 section,需要指定 section 名称

ReloadOptions

ReloadOptions 描述了动态刷参的方式。

Table 1. 总结了 4 种常见的动态刷参方式。相应的,KubeBlocks 也支持配置多种刷参方式:

  • tplScriptTrigger:通过模板文件刷参数;
  • shellTrigger:通过执行脚本刷参;
  • unixSignalTrigger:通过 UNIX Signal 刷参;
  • 不配置:即 AutoLoad 模式,交由数据库引擎自动更新。

示例

  • tplScriptTrigger

    本例选择 tplScriptTrigger,通过定义模板文件中的内容来配置参数。

      reloadOptions:
    tplScriptTrigger: # 通过模板文件刷参
    sync: true # 同步更新
    scriptConfigMapRef: oracle-mysql-reload-script # 引用的模板文件
    namespace: {{ .Release.Namespace }}
  • shellTrigger

    shellTrigger 通过 Shell 脚本动态刷参。这是一种更通用的方案,因为大部分数据库都支持通过客户端更新参数。

      reloadOptions:
    shellTrigger:
    sync: true
    command:
    - "update-dynamic-config.sh"
备注

这些 ReloadOptions 中的脚本会被加载到 Pod 上,通过前文提到的 config-manager sidecar 执行。

Static/Dynamic Parameters

KubeBlocks 支持配置动态参数(dynamic)、静态参数(static)和不可变参数(immutable)。这样区分是为了识别变更的参数类型,来决策参数的生效方式。

KubeBlocks 内置了多种刷参策略,根据变更内容,智能选择最合适的变更策略。

下面枚举了几个常见的 MySQL 参数,比如静态参数 performance_schema,动态参数 max_connection。如果参数列表过长,推荐使用 .Files.Get 函数处理。

  ## 3.1 配置静态参数列表
staticParameters:
- open_files_limit
- performance_schema
- enforce_gtid_consistency

## 3.2 配置动态参数列表
dynamicParameters:
- innodb_buffer_pool_size
- max_connections
- gtid_mode

ConfigurationSchema

在变更时,有时会因为写入了无效参数值,导致集群启动失败。

KubeBlocks 提供了 ConfigurationSchema 用于参数值有效性校验,主要使用 CUE 语言来做校验。通过描述每个参数的类型、默认值、取值范围等,防止因为参数值错误而导致问题。

下面提供了一个 MySQL 参数值校验配置。

#MysqlParameter: {

// Sets the autocommit mode
autocommit?: string & "0" | "1" | "OFF" | "ON"

open_files_limit: int | *5000

// Enables or disables the Performance Schema
performance_schema: string & "0" | "1" | "OFF" | "ON" | *"0"

// The number of simultaneous client connections allowed.
max_connections?: int & >=1 & <=100000
...
}

这里为 MySQL 中的参数 performance_schema 定义了一些约束。

  • 参数值类型为 string;
  • 参数取值可以为 ON,OFF 或者 0,1;
  • 参数默认值为 0。
    // Enables or disables the Performance Schema
performance_schema: string & "0" | "1" | "OFF" | "ON" | *"0"

如何更新参数

KubeBlocks 通过命令行 kbcli 提供了更便捷的参数管理方式。

创建集群

KubeBlocks 支持用 kbcli 和 Helm 进行创建。

kbcli cluster create mycluster --cluster-definition='oracle-mysql' --cluster-version oracle-mysql-8.0.32

查看参数配置

可以看到详细的配置信息,包括配置模板名和配置约束名等。

kbcli cluster describe-config mycluster
>
ConfigSpecs Meta:
CONFIG-SPEC-NAME FILE ENABLED TEMPLATE CONSTRAINT RENDERED COMPONENT CLUSTER
mysql-config my.cnf true oracle-mysql-config-template oracle-mysql-config-constraints mycluster-mysql-comp-mysql-config mysql-comp mycluster

History modifications:
OPS-NAME CLUSTER COMPONENT CONFIG-SPEC-NAME FILE STATUS POLICY PROGRESS CREATED-TIME VALID-UPDATED

更新参数

例如,如果要修改 MySQL 的 max_connection 参数,根据前文配置可以知道:

  • 它是动态参数;
  • 它的取值范围是 [1, 10000]
备注

对于 KubeBlocks v0.6.0 及更高版本,请运行 kbcli cluster edit-config 来配置参数。

kbcli cluster edit-config mycluster

然后会看到一个交互的编辑界面。我们直接将 max_connection 修改为 1000。

Interactive Config Editor

保存变更后再次确认变更信息, 即可实现参数的更新。

Confirm Config Changes

查看变更历史

再次查看参数配置。可以看到,除了参数模板之外,还记录了参数的历史修改信息和变更的具体内容。

kbcli cluster describe-config mycluster
>
ConfigSpecs Meta:
CONFIG-SPEC-NAME FILE ENABLED TEMPLATE CONSTRAINT RENDERED COMPONENT CLUSTER
mysql-config my.cnf true oracle-mysql-config-template oracle-mysql-config-constraints mycluster-mysql-comp-mysql-config mysql-comp mycluster

History modifications:
OPS-NAME CLUSTER COMPONENT CONFIG-SPEC-NAME FILE STATUS POLICY PROGRESS CREATED-TIME VALID-UPDATED
mycluster-reconfiguring-7p442 mycluster mysql-comp mysql-config my.cnf Succeed 1/1 Aug 25,2023 18:27 UTC+0800 {"my.cnf":"{\"mysqld\":{\"max_connections\":\"1000\"}}"}

参考资料

附录

A.1 如何查看变更流程?

参数变更是一种 KubeBlocks 的 operations,简称 ops

用户通过 kbcli 下发变更后,可以看到 KubeBlocks 中产生了一个 Reconfigration 类型的 ops。如查看变更历史一节所示,用户可以看到有一个名为 mycluster-reconfiguring-7p442ops。还可以通过下面的命令查看参数变更的详细信息,包括变更内容、变更策略、变更时间等。

kbcli cluster describe-op <your-reconfig-ops-name>

A.2 如何两次配置之间的差异?

执行 diff-config 命令,比较两次配置的差异。

kbcli cluster diff-config <your-reconfig-ops1> <your-reconfig-ops2>