2.9. 使用 Galera 复制 MariaDB


您可以通过在 Red Hat Enterprise Linux 9 上使用 Galera 解决方案来复制 MariaDB 数据库。

2.9.1. MariaDB Galera 集群介绍

Galera 复制是基于同步多源 MariaDB Galera集群 的创建,该群集由多个 MariaDB 服务器组成。与传统的主/副本设置(副本通常是只读的)不同,MariaDB Galera 群集中的节点都是可写的。

Galera 复制和 MariaDB 数据库之间的接口由写集复制 API(wsrep API) 定义的。

MariaDB Galera 集群 的主要特性是 :

  • 同步复制
  • 主动-主动多源拓扑
  • 对任何集群节点的读和写
  • 自动成员资格控制,故障节点从集群中删除
  • 自动节点加入
  • 行一级的并行复制
  • 直接客户端连接:用户可以登录到集群节点,并在复制运行时直接使用这些节点

同步复制意味着服务器在提交时复制事务,方法是将与事务关联的写入集合广播到集群中的每个节点。客户端(用户应用程序)直接连接到数据库管理系统(DBMS),可以体验类似于原生 MariaDB 的行为。

同步复制保证集群中一个节点上的更改会同时在集群中的其他节点上发生。

因此,与异步复制相比,同步复制具有以下优势:

  • 在特定集群节点间传播更改没有延迟
  • 所有集群节点始终一致
  • 如果其中一个集群节点崩溃,则不会丢失最新的更改
  • 所有集群节点上的事务都会并行执行
  • 整个集群的因果关系

2.9.2. 构建 MariaDB Galera 集群的组件

要构建 MariaDB Galera 集群,您必须在您的系统上安装以下软件包:

  • mariadb-server-galera - 包含 MariaDB Galera 集群 的支持文件和脚本。
  • MariaDB-server - 由 MariaDB 上游打补丁,以包含写入集复制 API(wsrep API)。此 API 提供 Galera 复制和 MariaDB 之间的接口。
  • Galera - 由 MariaDB 上游打补丁,以添加对 MariaDB 的完全支持。galera 软件包包含以下内容:

    • Galera Replication 程序库 提供整个复制功能。
    • Galera Arbitrator 工具可用作参与脑裂场景的集群成员。但是,Galera Arbitrator 无法参与实际的复制。
    • Galera Systemd 服务Galera 打包程序脚本,它们用于部署 Galera Arbitrator 工具。RHEL 9 提供这些文件的上游版本,位于 /usr/lib/systemd/system/garbd.service/usr/sbin/garb-systemd

2.9.3. 部署 MariaDB Galera 集群

您可以部署 MariaDB Galera Cluster 软件包,并更新配置。要组成一个新集群,您必须引导集群的第一个节点。

先决条件

  • 集群中的所有节点都有 TLS 设置
  • 所有节点上的所有证书都必须将 Extended Key Usage 字段设置为:

    TLS Web Server Authentication, TLS Web Client Authentication

流程

  1. 安装 MariaDB Galera Cluster 软件包:

    dnf install mariadb-server-galera

    因此,以下软件包会与依赖项一起安装:

    • mariadb-server-galera
    • mariadb-server
    • galera

      有关需要安装哪些软件包来构建 MariaDB Galera 集群 的更多信息,请参阅 构建 MariaDB 集群的组件

  2. 在系统第一次添加到集群之前,更新 MariaDB 服务器复制配置。默认配置在 /etc/my.cnf.d/galera.cnf 文件中。在部署 MariaDB Galera 集群 之前,请将所有节点上的 /etc/my.cnf.d/galera.cnf 文件中的 wsrep_cluster_address 选项设置为以以下字符串开头:

    gcomm://
    • 对于初始节点,可以将 wsrep_cluster_address 设置为空列表:

      wsrep_cluster_address="gcomm://"
    • 对于所有其他节点,将 wsrep_cluster_address 设置为包含已属于正在运行的集群的一部分的任何节点的地址。例如:

      wsrep_cluster_address="gcomm://10.0.0.10"

      有关如何设置 Galera 集群地址的更多信息,请参阅 Galera 集群地址

  3. 通过在 /etc/my.cnf.d/galera.cnf 配置文件中设置 wsrep_on=1 选项来在每个节点上启用 wsrep API。
  4. 使用 TLS 密钥和证书将 wsrep_provider_options 变量添加到 Galera 配置文件中。例如:

    wsrep_provider_options="socket.ssl_cert=/etc/pki/tls/certs/source.crt;socket.ssl_key=/etc/pki/tls/private/source.key;socket.ssl_ca=/etc/pki/tls/certs/ca.crt”
  5. 通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:

    # galera_new_cluster

    这个打包程序确保 MariaDB 服务器守护进程(mysqld)使用 --wsrep-new-cluster 选项运行。此选项提供了没有要连接的现有群集的信息。因此,节点会创建一个新的 UUID 来识别新集群。

    注意

    mariadb 服务支持 systemd 方法来与多个 MariaDB 服务器进程进行交互。因此,在有多个 MariaDB 服务器运行的情况下,您可以通过将实例名称指定为后缀来引导特定的实例:

    # galera_new_cluster mariadb@node1
  6. 在每个节点上运行以下命令将其他节点连接到集群:

    # systemctl start mariadb.service

    因此,节点连接到集群,并将自己与集群的状态同步。

2.9.4. 检查 MariaDB Galera 集群的状态

监控和确保 MariaDB Galera 集群的健康状态、性能和同步非常重要。为此,您可以查询每个节点上的状态变量来监控节点和集群。

要检查 MariaDB Galera 集群的状态,您可以使用以下查询:

  • 显示集群中的节点数量:

    # mysql -u root -p -e 'show status like "wsrep_cluster_size";'
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 4     |
    +--------------------+-------+
  • 显示节点的集群组件状态:

    # mysql -u root -p -e 'show status like "wsrep_cluster_status";'
    +----------------------+---------+
    | Variable_name        | Value   |
    +----------------------+---------+
    | wsrep_cluster_status | Primary |
    +----------------------+---------+

    wsrep_cluster_status 变量的值表示当前节点所属集群组件的状态。可能的值有:

    • :集群正常运行。存在仲裁数。在健康的集群中,所有节点都会报告 Primary
    • 非主要 :该节点丢失了与集群的主组件的连接,不再是活跃集群的一部分。但是,节点仍然可以提供读取查询,但不能处理写入操作。
    • 断开连接 :节点没有连接到任何集群组件。因此,它无法接受查询,也不会复制任何数据。
  • 显示节点的状态:

    # mysql -u root -p -e 'show status like "wsrep_local_state_comment";'
    +---------------------------+--------+
    | Variable_name             | Value  |
    +---------------------------+--------+
    | wsrep_local_state_comment | Synced |
    +---------------------------+--------+

    以下是 wsrep_local_state_comment 变量的频繁值:

    • Synced:该节点在集群中完全同步,并主动参与复制。
    • Desynced:该节点仍是集群的一部分,但主要是在状态传输中忙碌。
    • 加入 :节点正在加入集群。
    • 加入 :节点已成功加入集群。它可以从集群接收和应用写入集合。
    • donor:节点目前为加入节点提供 State Snapshot Transfer (SST)。当新节点加入并需要完全状态转移时,集群会选择一个现有节点来发送必要的数据。
  • 检查节点是否接受集群的写入集合:

    # mysql -u root -p -e 'show status like "wsrep_ready";'
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | wsrep_ready   | ON    |
    +---------------+-------+

    wsrep_ready 变量为 ON 时,节点已成功初始化其组件并连接到集群。另外,节点也会同步,或达到一个可以服务查询的状态。

  • 检查节点是否与其他主机有网络连接:

    # mysql -u root -p -e 'show status like "wsrep_connected";'
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | wsrep_connected | ON    |
    +-----------------+-------+

    ON 值表示节点已连接到集群中的至少一个成员。

  • 显示自上次 FLUSH STATUS 命令或自服务器启动以来写入集合的本地接收队列的平均大小:

    # mysql -u root -p -e 'show status like "wsrep_local_recv_queue_avg";'
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | wsrep_local_recv_queue_avg | 0.012 |
    +----------------------------+-------+

    值接近 0 是理想的状态,表示节点在收到写入集时继续应用它们。永久高或增长的值可能是性能瓶颈的指示,如磁盘 I/O 慢。

  • 显示流控制状态:

    # mysql -u root -p -e 'show status like "wsrep_flow_control_paused";'
    +---------------------------+-------+
    | Variable_name             | Value |
    +---------------------------+-------+
    | wsrep_flow_control_paused | 0     |
    +---------------------------+-------+

    这个变量代表节点已暂停的分数,且无法处理新的传入的事务,因为其本地接收队列太满、触发流控制。接近 0 的值表示节点高效地继续复制工作负载。采用 1.0 值意味着节点会频繁或持续遇到应用写入集合的难度,并可能成为集群的瓶颈。

    如果节点经常暂停,您可以调整 /etc/my.cnf.d/galera.cnf 文件中的 wsrep_slave_threads 参数。

  • 显示节点可并行应用最低和最高序列号之间的平均距离:

    # mysql -u root -p -e 'show status like "wsrep_cert_deps_distance";'
    +--------------------------+-------+
    | Variable_name            | Value |
    +--------------------------+-------+
    | wsrep_cert_deps_distance | 1     |
    +--------------------------+-------+

    数值越高,表示更容易的并行性。它是您可以在 /etc/my.cnf.d/galera.cnf 文件中的 wsrep_slave_threads 参数中使用的最佳值。

2.9.5. 在 MariaDB Galera 集群中添加新节点

要在 MariaDB Galera 集群 中添加新节点,请使用以下步骤。

请注意,您也可以使用此流程重新连接已存在的节点。

流程

  • 在特定节点上,在 /etc/my.cnf.d/galera.cnf 配置文件的 [mariadb] 部分的 wsrep_cluster_address 选项中为一个或多个现有群集成员提供一个地址:

    [mariadb]
    wsrep_cluster_address="gcomm://192.168.0.1"

    当新节点连接到现有群集节点中的一个时,就可以看到集群中的所有节点。

    但是,最好在 wsrep_cluster_address 中列出集群的所有节点。

    因此,任何节点都可以通过连接到任何其他群集节点来加入群集,即使一个或多个群集节点停机了也没关系。当所有成员就成员资格达成一致时,集群的状态将会改变。如果新节点的状态与集群状态不同,新节点需要请求增加状态转移(IST)或状态快照传输(SST),来确保与其他节点保持一致。

2.9.6. 重启 MariaDB Galera 集群

如果您同时关闭所有节点,您将停止集群,正在运行的集群不再存在。但是,集群的数据仍然存在。

要重启集群,请引导第一个节点,如 配置 MariaDB Galera 集群 中所述。

警告

如果集群没有 bootstrap ,并且 mariadb 在第一个节点上仅通过 systemctl start mariadb.service 命令启动,则节点会尝试连接到 /etc/my.cnf.d/galera.cnf 文件中 wsrep_cluster_address 选项中列出的至少一个节点。如果当前没有节点运行,那么重启失败。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部