MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

MariaDB高可用架构设计与实践

2023-01-204.2k 阅读

MariaDB 高可用架构概述

在当今数据驱动的时代,数据库的高可用性对于企业的业务连续性至关重要。MariaDB 作为一款流行的开源关系型数据库,为构建高可用架构提供了多种方案。高可用架构旨在确保在硬件故障、软件错误、网络问题或其他意外情况下,数据库服务仍能持续可用,数据不丢失且业务不受影响。

MariaDB 的高可用架构通常围绕着数据冗余、故障检测与自动切换等核心机制构建。数据冗余通过复制(replication)技术实现,在多个节点上保存相同的数据副本。故障检测机制实时监控各个节点的健康状态,一旦发现某个节点出现故障,自动切换机制会迅速将服务转移到其他健康节点,从而保证业务的连续性。

主从复制(Master - Slave Replication)

主从复制是 MariaDB 实现高可用的基础技术之一。在这种架构中,有一个主节点(Master)负责处理写操作,并将数据更改记录到二进制日志(binary log)中。从节点(Slave)通过读取主节点的二进制日志,并在本地重放这些日志来保持与主节点的数据同步。

配置主节点

  1. 修改配置文件:打开 MariaDB 的配置文件(通常是 /etc/mysql/my.cnf/etc/my.cnf),在 [mysqld] 部分添加或修改以下配置:
server - id = 1
log - bin = /var/log/mysql/mysql - bin.log
binlog - do - db = your_database_name

server - id 是每个节点的唯一标识符,在整个复制集群中必须唯一。log - bin 指定二进制日志的路径和文件名。binlog - do - db 用于指定需要复制的数据库,如果要复制所有数据库,可以省略此配置。

  1. 重启 MariaDB 服务
sudo systemctl restart mariadb
  1. 创建用于复制的用户:登录到 MariaDB 控制台,执行以下 SQL 语句:
CREATE USER'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO'replication_user'@'%';
FLUSH PRIVILEGES;

此用户将被从节点用于连接主节点并获取二进制日志。'%' 表示允许任何 IP 地址的从节点连接。

  1. 获取主节点状态:执行以下 SQL 语句获取主节点的二进制日志文件名和位置:
SHOW MASTER STATUS;

记录下 FilePosition 的值,后续配置从节点时会用到。

配置从节点

  1. 修改配置文件:在从节点的 MariaDB 配置文件中,添加或修改以下配置:
server - id = 2

确保 server - id 与主节点不同且在整个集群中唯一。

  1. 重启 MariaDB 服务
sudo systemctl restart mariadb
  1. 配置从节点连接主节点:登录到从节点的 MariaDB 控制台,执行以下 SQL 语句:
CHANGE MASTER TO
    MASTER_HOST ='master_host_ip',
    MASTER_USER ='replication_user',
    MASTER_PASSWORD = 'password',
    MASTER_LOG_FILE ='master_binlog_file',
    MASTER_LOG_POS = master_binlog_position;

master_host_ip 替换为主节点的实际 IP 地址,master_binlog_filemaster_binlog_position 替换为之前在主节点获取的值。

  1. 启动从节点复制:执行以下 SQL 语句启动从节点的复制:
START SLAVE;
  1. 检查从节点状态:执行以下 SQL 语句检查从节点的复制状态:
SHOW SLAVE STATUS \G;

确保 Slave_IO_RunningSlave_SQL_Running 都为 Yes,并且 Seconds_Behind_Master 为 0 或接近 0,这表示从节点与主节点同步正常。

主从复制的优缺点

优点

  1. 数据冗余与读扩展性:从节点提供了数据的冗余副本,可用于分担读负载。通过在从节点上执行查询操作,可以减轻主节点的压力,提高系统的整体读性能。
  2. 简单易用:主从复制的配置相对简单,容易理解和部署。对于中小规模的应用场景,是一种快速实现高可用和读写分离的有效方式。

缺点

  1. 写性能瓶颈:所有写操作都集中在主节点上,当写负载较高时,主节点可能成为性能瓶颈。
  2. 故障切换手动操作:默认情况下,主节点故障时需要手动将某个从节点提升为主节点,这可能导致服务中断时间较长,影响业务连续性。

双活(Active - Active)架构

双活架构是在主从复制基础上的进一步扩展,旨在解决主从架构中写性能瓶颈的问题。在双活架构中,有两个或多个节点都可以同时处理写操作,每个节点既是主节点,也是其他节点的从节点,形成一种相互复制的关系。

配置双活架构

  1. 节点配置:每个节点都需要按照主从复制的方式进行基本配置,确保 server - id 唯一且正确配置二进制日志。例如,对于节点 A:
server - id = 1
log - bin = /var/log/mysql/mysql - bin.log

对于节点 B:

server - id = 2
log - bin = /var/log/mysql/mysql - bin.log
  1. 创建复制用户:在每个节点上创建用于复制的用户,并授予相应权限。例如,在节点 A 上:
CREATE USER'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO'replication_user'@'%';
FLUSH PRIVILEGES;

在节点 B 上执行相同操作。

  1. 配置相互复制:在节点 A 上,获取自身二进制日志状态:
SHOW MASTER STATUS;

记录下 FilePosition 的值。然后在节点 B 上配置连接节点 A:

CHANGE MASTER TO
    MASTER_HOST = 'node_a_ip',
    MASTER_USER ='replication_user',
    MASTER_PASSWORD = 'password',
    MASTER_LOG_FILE = 'node_a_binlog_file',
    MASTER_LOG_POS = node_a_binlog_position;
START SLAVE;

同样,在节点 B 上获取二进制日志状态,然后在节点 A 上配置连接节点 B:

CHANGE MASTER TO
    MASTER_HOST = 'node_b_ip',
    MASTER_USER ='replication_user',
    MASTER_PASSWORD = 'password',
    MASTER_LOG_FILE = 'node_b_binlog_file',
    MASTER_LOG_POS = node_b_binlog_position;
START SLAVE;
  1. 验证双活状态:在每个节点上执行 SHOW SLAVE STATUS \G 命令,确保 Slave_IO_RunningSlave_SQL_Running 都为 Yes,并且 Seconds_Behind_Master 为 0 或接近 0。

双活架构的优缺点

优点

  1. 写性能提升:多个节点可以同时处理写操作,有效提升了系统的写性能,适用于写负载较高的应用场景。
  2. 高可用性增强:由于多个节点都可以提供服务,当某个节点出现故障时,其他节点可以继续处理请求,减少了服务中断时间。

缺点

  1. 数据一致性挑战:由于多个节点同时进行写操作,可能会出现数据冲突。需要通过合适的冲突检测和解决机制来确保数据的一致性。
  2. 配置和管理复杂:双活架构的配置和管理相对复杂,需要对 MariaDB 的复制机制有深入理解,同时对运维人员的技术要求也较高。

Galera Cluster

Galera Cluster 是 MariaDB 实现高可用和数据一致性的另一种重要方案。它基于同步复制技术,确保所有节点的数据实时同步,实现了多主节点的高可用集群。

安装和配置 Galera Cluster

  1. 安装 Galera 相关软件包:在每个节点上安装 MariaDB Galera Cluster 软件包。例如,在基于 Debian 或 Ubuntu 的系统上:
sudo apt - get install mariadb - server - galera
  1. 配置 Galera Cluster:编辑 MariaDB 的配置文件(例如 /etc/mysql/mariadb.conf.d/50 - server.cnf),在 [mysqld] 部分添加或修改以下配置:
bind - address = 0.0.0.0
wsrep - provider = /usr/lib/galera/libgalera_smm.so
wsrep - cluster - name ='my_cluster_name'
wsrep - node - address = your_node_ip
wsrep - cluster - address = "gcomm://node1_ip,node2_ip,node3_ip"

bind - address 设置为 0.0.0.0 允许所有 IP 地址访问。wsrep - provider 指定 Galera 同步复制库的路径。wsrep - cluster - name 是集群的名称,所有节点必须相同。wsrep - node - address 是当前节点的 IP 地址,wsrep - cluster - address 列出了集群中所有节点的 IP 地址。

  1. 启动 MariaDB Galera Cluster:在第一个节点上启动 MariaDB 服务:
sudo systemctl start mariadb - bootstrap

在其他节点上直接启动 MariaDB 服务:

sudo systemctl start mariadb
  1. 验证集群状态:登录到任意节点的 MariaDB 控制台,执行以下 SQL 语句检查集群状态:
SHOW STATUS LIKE 'wsrep_cluster_size';
SHOW STATUS LIKE 'wsrep_cluster_status';

确保 wsrep_cluster_size 显示的节点数量与实际集群节点数一致,并且 wsrep_cluster_statusPrimary

Galera Cluster 的优缺点

优点

  1. 强数据一致性:Galera Cluster 通过同步复制确保所有节点的数据实时一致,不存在数据延迟问题,适合对数据一致性要求极高的应用场景。
  2. 自动故障检测与恢复:集群内置了自动故障检测和恢复机制,当某个节点出现故障时,集群能够自动将其剔除,并继续正常运行,保证服务的连续性。
  3. 多主节点写入:支持多个节点同时进行写操作,有效提升了写性能和系统的扩展性。

缺点

  1. 性能开销:由于同步复制的特性,每个写操作都需要在所有节点上同步,这可能带来一定的性能开销,特别是在节点数量较多或网络延迟较大的情况下。
  2. 资源要求较高:Galera Cluster 对节点的硬件资源要求相对较高,需要足够的内存和 CPU 来处理同步复制和集群管理的任务。

MHA(Master High Availability)

MHA 是一套用于 MariaDB 主从架构的高可用解决方案,主要解决主从架构中主节点故障时自动切换的问题,提高系统的可用性。

安装和配置 MHA

  1. 安装 MHA 软件包:在管理节点和所有数据库节点上安装 MHA 相关软件包。例如,在基于 CentOS 的系统上,可以通过以下步骤安装:
    • 在管理节点上:
yum install - y mha4mysql - manager
- 在数据库节点上:
yum install - y mha4mysql - node
  1. 配置 SSH 无密码登录:管理节点需要通过 SSH 无密码登录到所有数据库节点。在管理节点上生成 SSH 密钥对,并将公钥复制到每个数据库节点:
ssh - keygen - t rsa
for i in node1 node2 node3; do ssh - copy - id - i ~/.ssh/id_rsa.pub root@$i; done
  1. 配置 MHA 配置文件:在管理节点上创建 MHA 配置文件(例如 /etc/masterha/app1.cnf),内容如下:
[server default]
user = mha_user
password = password
ssh_user = root
repl_user = replication_user
repl_password = password
ping_interval = 1
master_binlog_dir = /var/log/mysql
remote_workdir = /var/tmp/masterha
secondary_check_script = masterha_secondary_check - s master_ip - 1 - c master_ip - 2
failover_script = /usr/local/bin/masterha_master_switch
master_ip_failover_script = /usr/local/bin/masterha_master_ip_failover
shutdown_script = /usr/local/bin/masterha_master_shutdown

[server1]
hostname = node1_ip
candidate_master = 1

[server2]
hostname = node2_ip
candidate_master = 1

[server3]
hostname = node3_ip

userpassword 是 MHA 管理用户的信息。ssh_user 是用于 SSH 登录的用户。repl_userrepl_password 是用于复制的用户信息。candidate_master 标记该节点可以作为候选主节点。

  1. 启动 MHA 管理进程:在管理节点上启动 MHA 管理进程:
masterha_manager --conf=/etc/masterha/app1.cnf
  1. 验证 MHA 功能:模拟主节点故障,观察 MHA 是否能自动将某个从节点提升为主节点,并确保业务能够继续正常运行。

MHA 的优缺点

优点

  1. 快速故障切换:MHA 能够在主节点出现故障时迅速检测到,并自动将某个从节点提升为主节点,大大缩短了服务中断时间,提高了系统的可用性。
  2. 基于主从架构:利用了 MariaDB 主从复制的成熟技术,对现有主从架构的改造较小,容易部署和集成到已有的系统中。

缺点

  1. 依赖主从复制:由于基于主从复制架构,仍然存在主从复制的一些局限性,如写性能瓶颈等问题。
  2. 管理节点单点故障:如果 MHA 的管理节点出现故障,可能会影响整个集群的高可用功能。需要通过额外的机制(如管理节点的冗余)来解决此问题。

选择合适的高可用架构

在选择 MariaDB 高可用架构时,需要综合考虑应用场景的需求、性能要求、数据一致性要求以及运维成本等因素。

  1. 读多写少场景:如果应用场景主要是读操作,写操作较少,主从复制架构是一个不错的选择。它可以通过从节点分担读负载,实现读写分离,并且配置相对简单,易于维护。
  2. 写多场景:对于写操作频繁的应用场景,双活架构或 Galera Cluster 更为合适。双活架构可以提升写性能,但需要处理数据一致性问题;Galera Cluster 则提供了强数据一致性和多主写入功能,但可能存在性能开销。
  3. 对数据一致性要求极高场景:如果应用对数据一致性要求极高,不允许有任何数据延迟或不一致,Galera Cluster 是首选方案,因为它通过同步复制确保所有节点数据实时一致。
  4. 对成本敏感场景:如果对成本较为敏感,且对故障切换时间要求不是特别严格,主从复制结合手动故障切换的方式可以满足基本的高可用需求,同时降低了运维和硬件成本。

在实际应用中,还可以根据业务的发展和变化,灵活调整高可用架构。例如,在业务初期可以采用简单的主从复制架构,随着业务量的增长和对可用性要求的提高,逐步升级到更复杂的双活或 Galera Cluster 架构。

高可用架构中的数据备份与恢复

在高可用架构中,数据备份与恢复仍然是至关重要的环节。即使有高可用机制,也不能完全排除数据丢失的风险,如误操作、数据损坏等情况。

备份策略

  1. 全量备份:定期进行全量备份,将整个数据库的数据复制到备份存储中。可以使用 MariaDB 的 mysqldump 工具进行全量备份,例如:
mysqldump - u root - p --all - databases > all_databases_backup.sql
  1. 增量备份:结合二进制日志进行增量备份,只备份自上次全量备份或增量备份以来的数据更改。可以通过记录二进制日志的位置来实现增量备份。例如,先进行全量备份,然后记录当前二进制日志的位置:
SHOW MASTER STATUS;

之后,定期根据二进制日志进行增量备份:

mysqlbinlog --start - position = start_position --stop - position = stop_position /var/log/mysql/mysql - bin.log > incremental_backup.sql

恢复策略

  1. 基于全量备份恢复:在需要恢复数据时,首先使用全量备份文件进行恢复。例如:
mysql - u root - p < all_databases_backup.sql
  1. 结合增量备份恢复:在全量备份恢复的基础上,应用增量备份文件来恢复到最新的数据状态。例如:
mysql - u root - p < incremental_backup.sql

在高可用架构中,备份和恢复操作应该考虑到集群的特点。例如,在 Galera Cluster 中,备份可以在任意节点上进行,但恢复时需要确保所有节点的数据一致性。同时,备份存储也应该具备高可用性,以防止备份数据丢失。

高可用架构的监控与调优

为了确保 MariaDB 高可用架构的稳定运行,监控和调优是必不可少的环节。

监控指标

  1. 节点状态:监控每个节点的运行状态,包括 CPU 使用率、内存使用率、磁盘 I/O 等。可以使用系统监控工具(如 topiostat 等)或数据库自带的监控视图(如 SHOW STATUS)。
  2. 复制状态:对于主从复制架构,监控从节点的复制状态,如 Slave_IO_RunningSlave_SQL_RunningSeconds_Behind_Master 等指标。在 Galera Cluster 中,监控集群的同步状态、节点数量等。
  3. 查询性能:监控数据库的查询性能,包括查询响应时间、慢查询数量等。可以通过 MariaDB 的慢查询日志和 SHOW PROCESSLIST 等命令来获取相关信息。

调优措施

  1. 参数调优:根据应用场景和监控数据,调整 MariaDB 的配置参数。例如,对于内存使用,可以调整 innodb_buffer_pool_size 参数来优化 InnoDB 存储引擎的性能。
  2. 索引优化:分析查询语句,创建合适的索引来提高查询性能。避免全表扫描,减少查询响应时间。
  3. 硬件优化:根据系统负载,合理调整硬件资源,如增加内存、更换更快的磁盘等,以提升数据库的整体性能。

通过持续的监控和调优,可以及时发现和解决高可用架构中潜在的问题,确保数据库服务的稳定和高效运行。在实际应用中,还可以结合自动化监控和调优工具,提高运维效率和系统的可靠性。例如,使用 Prometheus 和 Grafana 等工具搭建数据库监控平台,实时展示关键指标,并设置告警机制,以便在出现异常时及时通知运维人员。同时,利用自动化脚本或工具进行参数调整和索引优化,减少人工操作带来的风险。总之,构建一个稳定、高效的 MariaDB 高可用架构需要综合考虑架构设计、数据备份与恢复、监控与调优等多个方面,并根据实际业务需求不断进行优化和完善。

在高可用架构的实施过程中,还需要关注安全问题。对于数据库的访问权限要进行严格的控制,只授予必要的用户和应用程序适当的权限。使用加密技术对传输中的数据和存储的数据进行保护,防止数据泄露。定期进行安全漏洞扫描和修复,确保系统的安全性。另外,随着容器化和云计算技术的发展,将 MariaDB 高可用架构部署在容器环境或云平台上也是一种趋势。容器化部署可以提高资源利用率和部署的灵活性,云平台则提供了高可用的基础设施和便捷的管理工具。例如,可以使用 Kubernetes 来管理 MariaDB 容器集群,实现自动的故障检测和节点替换。在云平台上,可以利用云提供商的负载均衡、存储和网络服务来进一步优化高可用架构。但在采用这些新技术时,也需要注意相关的兼容性和配置问题,确保整个架构的稳定运行。综上所述,MariaDB 高可用架构的设计与实践是一个复杂而又关键的任务,需要综合考虑众多因素,不断探索和优化,以满足企业日益增长的数据处理和业务连续性需求。