1.8. 使用 Galera 复制 MariaDB


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

1.8.1. MariaDB Galera 集群介绍

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

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

MariaDB Galera 集群的主要特性是:

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

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

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

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

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

1.8.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 10 提供这些文件的上游版本,位于 /usr/lib/systemd/system/garbd.service/usr/sbin/garb-systemd

1.8.3. 部署 MariaDB Galera 集群

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

先决条件

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

    TLS Web Server Authentication, TLS Web Client Authentication
    Copy to Clipboard Toggle word wrap

流程

  1. 安装 MariaDB Galera 集群软件包:

    # dnf install mariadb-server-galera
    Copy to Clipboard Toggle word wrap

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

    • 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://
    Copy to Clipboard Toggle word wrap
    • 对于初始节点,可以将 wsrep_cluster_address 设置为空列表:

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

      wsrep_cluster_address="gcomm://10.0.0.10"
      Copy to Clipboard Toggle word wrap

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

  3. 通过在 /etc/my.cnf.d/galera.cnf 配置文件中设置 wsrep_on=1 选项来在每个节点上启用 wsrep API。
  4. wsrep_provider_options 变量添加到带有 TLS 密钥和证书 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”
    Copy to Clipboard Toggle word wrap
  5. 通过在该节点上运行以下 wrapper 来引导新集群的第一个节点:

    # galera_new_cluster
    Copy to Clipboard Toggle word wrap

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

    注意

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

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

    # systemctl start mariadb
    Copy to Clipboard Toggle word wrap

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

1.8.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     |
    +--------------------+-------+
    Copy to Clipboard Toggle word wrap
  • 显示节点的集群组件状态:

    # mysql -u root -p -e 'show status like "wsrep_cluster_status";'
    +----------------------+---------+
    | Variable_name        | Value   |
    +----------------------+---------+
    | wsrep_cluster_status | Primary |
    +----------------------+---------+
    Copy to Clipboard Toggle word wrap

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

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

    # mysql -u root -p -e 'show status like "wsrep_local_state_comment";'
    +---------------------------+--------+
    | Variable_name             | Value  |
    +---------------------------+--------+
    | wsrep_local_state_comment | Synced |
    +---------------------------+--------+
    Copy to Clipboard Toggle word wrap

    以下是 wsrep_local_state_comment 变量常用的值:

    • Synced :节点在集群内完全同步,并积极参与复制。
    • Desynced :节点仍然是集群的一部分,但主要忙于状态传输。
    • Joining :节点正在加入集群。
    • Joined :节点已成功加入集群。它可以从集群接收和应用写集合。
    • Donor: 节点当前向正在加入的节点提供状态快照传输(SST)。当新节点加入并需要全状态转移时,集群会选择一个现有节点来发送必要的数据。
  • 检查节点是否接受来自集群的写集合:

    # mysql -u root -p -e 'show status like "wsrep_ready";'
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | wsrep_ready   | ON    |
    +---------------+-------+
    Copy to Clipboard Toggle word wrap

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

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

    # mysql -u root -p -e 'show status like "wsrep_connected";'
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | wsrep_connected | ON    |
    +-----------------+-------+
    Copy to Clipboard Toggle word wrap

    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 |
    +----------------------------+-------+
    Copy to Clipboard Toggle word wrap

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

  • 显示流控制状态:

    # mysql -u root -p -e 'show status like "wsrep_flow_control_paused";'
    +---------------------------+-------+
    | Variable_name             | Value |
    +---------------------------+-------+
    | wsrep_flow_control_paused | 0     |
    +---------------------------+-------+
    Copy to Clipboard Toggle word wrap

    这个变量代表节点已暂停,且无法处理新传入的事务的时间分数,因为其本地接收队列太满、触发了流控制。接近 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     |
    +--------------------------+-------+
    Copy to Clipboard Toggle word wrap

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

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

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

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

流程

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

    [mariadb]
    wsrep_cluster_address="gcomm://192.168.0.1"
    Copy to Clipboard Toggle word wrap

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

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

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

1.8.6. 重启 MariaDB Galera 集群

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

要重启集群,请 bootstrap 第一个节点,如 部署 MariaDB Galera 集群 中所述

警告

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat