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

MariaDB复制故障排查与恢复策略

2021-10-265.7k 阅读

MariaDB 复制原理概述

在深入探讨 MariaDB 复制故障排查与恢复策略之前,我们先来了解一下 MariaDB 复制的基本原理。MariaDB 采用主从复制模式,其中主服务器(Master)记录数据库的所有更改操作到二进制日志(Binary Log)中。从服务器(Slave)通过 I/O 线程连接到主服务器,将主服务器的二进制日志内容拷贝到自己的中继日志(Relay Log)中。随后,从服务器的 SQL 线程读取中继日志,并在从服务器上重放这些日志记录,从而实现与主服务器数据的同步。

这种复制机制使得在主服务器发生故障时,从服务器能够继续提供服务,保证系统的高可用性。同时,它也有助于分担读操作的负载,提升系统的整体性能。

主从复制的关键组件

  1. 主服务器的二进制日志:主服务器在执行数据修改操作(如 INSERT、UPDATE、DELETE 等)时,会将这些操作记录到二进制日志中。二进制日志包含了足够的信息,使得从服务器能够准确地重放这些操作,从而保持数据一致性。可以通过以下命令查看主服务器二进制日志相关信息:
SHOW BINARY LOGS;

此命令会列出主服务器上所有的二进制日志文件及其大小。

  1. 从服务器的 I/O 线程:从服务器的 I/O 线程负责与主服务器建立连接,并将主服务器二进制日志的内容拷贝到本地的中继日志中。可以通过以下命令查看从服务器 I/O 线程的状态:
SHOW SLAVE STATUS \G;

在输出结果中,Slave_IO_Running 字段表示 I/O 线程是否正在运行,Connect_Retry 字段表示连接重试的时间间隔。

  1. 从服务器的 SQL 线程:SQL 线程负责读取中继日志,并按照日志记录的顺序在从服务器上重放这些操作。同样通过 SHOW SLAVE STATUS \G 命令查看,Slave_SQL_Running 字段表示 SQL 线程是否正在运行。

常见复制故障类型

网络相关故障

  1. 主从服务器网络连接中断:这是较为常见的故障之一。网络不稳定、网络设备故障或者防火墙配置不当等都可能导致主从服务器之间的网络连接中断。当网络连接中断时,从服务器的 I/O 线程无法从主服务器获取二进制日志,从而导致复制停止。
  2. 延迟网络问题:即使网络连接没有完全中断,但如果网络延迟过高,也会影响复制的性能。从服务器的 I/O 线程可能会花费较长时间来获取主服务器的二进制日志,导致中继日志的更新不及时,进而使得从服务器的数据同步出现延迟。

主服务器故障

  1. 主服务器崩溃:主服务器可能由于硬件故障、软件错误、操作系统问题等原因突然崩溃。当主服务器崩溃时,从服务器将无法继续从主服务器获取二进制日志,复制会立即停止。在主服务器恢复后,需要重新配置从服务器与主服务器的连接,以恢复复制。
  2. 主服务器二进制日志损坏:二进制日志在记录过程中可能由于磁盘故障、文件系统错误等原因导致损坏。损坏的二进制日志可能包含错误的记录,使得从服务器在重放日志时出现错误,从而中断复制。

从服务器故障

  1. 从服务器崩溃:与主服务器类似,从服务器也可能因为各种原因崩溃。从服务器崩溃后,其中继日志可能尚未完全写入,或者 SQL 线程在重放日志过程中被中断。在从服务器恢复后,需要检查中继日志的完整性,并确保 SQL 线程能够正确地继续重放日志。
  2. 从服务器数据损坏:从服务器的数据文件可能由于磁盘故障、误操作等原因导致损坏。数据损坏可能使得 SQL 线程在重放日志时无法正确应用更改,从而导致复制失败。

配置相关故障

  1. 主从配置错误:在配置主从复制时,如果主从服务器的配置参数设置不正确,可能会导致复制无法正常启动。例如,主服务器的 log-bin 参数未正确配置,或者从服务器在使用 CHANGE MASTER TO 命令时,指定的主服务器连接信息(如主机地址、端口、用户名、密码等)有误。
  2. 版本兼容性问题:MariaDB 的不同版本之间在复制功能上可能存在一些差异。如果主从服务器的 MariaDB 版本不兼容,可能会出现复制故障。例如,某些新特性在低版本中不支持,或者高版本的二进制日志格式在低版本中无法正确解析。

故障排查步骤

网络故障排查

  1. 检查网络连接:首先,使用 ping 命令检查主从服务器之间的网络连通性。例如,在从服务器上执行 ping <主服务器 IP 地址>,如果 ping 不通,说明网络连接存在问题。需要检查网络设备(如路由器、交换机)的配置,确保没有阻止主从服务器之间的通信。
  2. 检查端口是否开放:MariaDB 默认使用 3306 端口进行通信。使用 telnet <主服务器 IP 地址> 3306 命令检查从服务器是否能够连接到主服务器的 3306 端口。如果连接失败,可能是防火墙阻止了该端口的访问。在 Linux 系统中,可以通过以下命令检查防火墙规则:
sudo iptables -L

如果发现 3306 端口被阻止,可以通过以下命令开放端口:

sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
  1. 检查网络延迟:使用 traceroute 命令可以查看数据包从从服务器到主服务器所经过的路由,并分析网络延迟情况。例如,执行 traceroute <主服务器 IP 地址>,观察每个路由节点的延迟时间。如果发现某个节点延迟过高,可能需要联系网络管理员进一步排查该节点的网络问题。

主服务器故障排查

  1. 检查主服务器状态:在主服务器上,使用 systemctl status mariadb 命令检查 MariaDB 服务是否正在运行。如果服务未运行,可以通过 systemctl start mariadb 命令启动服务。同时,查看 MariaDB 的日志文件(通常位于 /var/log/mariadb/mariadb.log),查找是否有错误信息。例如,如果日志中出现 InnoDB: Error: log file... is of different size 等类似信息,可能表示数据库文件存在损坏。
  2. 检查二进制日志:使用 SHOW BINARY LOGS 命令查看主服务器的二进制日志是否正常。如果发现某个二进制日志文件大小异常(如为 0 字节),可能表示该日志文件损坏。可以尝试通过 PURGE BINARY LOGS 命令删除损坏的日志文件(但要谨慎操作,确保不会删除有用的日志)。例如,假设要删除名为 mysql-bin.000001 及之前的所有日志文件,可以执行以下命令:
PURGE BINARY LOGS TO'mysql-bin.000001';
  1. 检查主服务器配置:查看主服务器的配置文件(通常为 /etc/my.cnf/etc/mysql/my.cnf),确保 log-bin 参数正确配置。例如,配置应该如下:
[mysqld]
log-bin=/var/lib/mysql/mysql-bin
server-id=1

其中,log-bin 指定了二进制日志的存储路径,server-id 是主服务器的唯一标识。

从服务器故障排查

  1. 检查从服务器状态:在从服务器上,同样使用 systemctl status mariadb 命令检查 MariaDB 服务状态,并查看日志文件(路径与主服务器类似)。通过 SHOW SLAVE STATUS \G 命令获取从服务器的详细状态信息。重点关注 Slave_IO_RunningSlave_SQL_Running 字段,如果这两个字段的值为 No,说明 I/O 线程或 SQL 线程出现问题。
  2. 检查中继日志:中继日志位于从服务器的 relay-log 参数指定的目录中(默认与数据目录相同)。使用 SHOW RELAYLOG EVENTS 命令查看中继日志的内容。如果发现中继日志损坏,可以尝试删除中继日志并重新配置从服务器与主服务器的连接。首先停止从服务器复制:
STOP SLAVE;

然后删除中继日志:

RESET SLAVE;

最后重新配置主服务器连接信息:

CHANGE MASTER TO
    MASTER_HOST='<主服务器 IP 地址>',
    MASTER_USER='<主服务器复制用户>',
    MASTER_PASSWORD='<主服务器复制用户密码>',
    MASTER_LOG_FILE='<主服务器二进制日志文件名>',
    MASTER_LOG_POS=<主服务器二进制日志位置>;
  1. 检查从服务器数据完整性:可以使用 CHECK TABLE 命令检查从服务器上的表是否存在损坏。例如,要检查名为 test_table 的表:
CHECK TABLE test_table;

如果表存在损坏,可以使用 REPAIR TABLE 命令进行修复:

REPAIR TABLE test_table;

配置故障排查

  1. 检查主从配置参数:仔细检查主从服务器的配置文件,确保 server-id 在主从服务器上是唯一的。主服务器的 log-bin 参数配置正确,并且从服务器在使用 CHANGE MASTER TO 命令时,指定的主服务器连接信息准确无误。例如,再次确认从服务器的 CHANGE MASTER TO 命令如下:
CHANGE MASTER TO
    MASTER_HOST='192.168.1.100',
    MASTER_USER='repl_user',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=154;
  1. 检查版本兼容性:查看主从服务器的 MariaDB 版本信息。在 MariaDB 客户端中执行 SELECT VERSION(); 命令获取版本号。如果版本差异较大,查阅 MariaDB 的官方文档,了解不同版本之间在复制功能上的兼容性问题。例如,如果主服务器是 MariaDB 10.5 版本,而从服务器是 MariaDB 10.2 版本,某些 10.5 版本引入的复制特性可能在 10.2 版本中不支持,需要进行相应的调整。

恢复策略

网络故障恢复

  1. 恢复网络连接:如果是网络连接中断导致的复制故障,在解决网络问题(如修复网络设备故障、调整防火墙规则等)后,需要在从服务器上重新启动复制。首先,检查从服务器的 I/O 线程和 SQL 线程是否停止,如果停止,可以通过以下命令启动:
START SLAVE;

然后再次使用 SHOW SLAVE STATUS \G 命令检查复制状态,确保 Slave_IO_RunningSlave_SQL_Running 字段的值为 Yes,并且 Seconds_Behind_Master 字段的值为 0 或接近 0(表示从服务器与主服务器数据同步正常)。 2. 处理网络延迟:对于网络延迟过高的问题,可以尝试优化网络配置,如增加网络带宽、调整网络拓扑结构等。同时,可以适当调整从服务器的 net_read_timeoutnet_write_timeout 参数,以适应较长的网络延迟。在从服务器的配置文件中添加或修改以下参数:

[mysqld]
net_read_timeout=60
net_write_timeout=60

修改完成后,重启 MariaDB 服务使配置生效:

sudo systemctl restart mariadb

主服务器故障恢复

  1. 主服务器崩溃恢复:当主服务器崩溃后恢复,首先需要确认主服务器的二进制日志是否完整。如果二进制日志损坏,按照前面提到的方法进行修复或删除损坏的日志文件。然后,在从服务器上使用 CHANGE MASTER TO 命令重新配置主服务器连接信息,指定正确的二进制日志文件名和位置。假设主服务器重启后,最新的二进制日志文件为 mysql-bin.000002,位置为 200,可以执行以下命令:
STOP SLAVE;
CHANGE MASTER TO
    MASTER_HOST='<主服务器 IP 地址>',
    MASTER_USER='<主服务器复制用户>',
    MASTER_PASSWORD='<主服务器复制用户密码>',
    MASTER_LOG_FILE='mysql-bin.000002',
    MASTER_LOG_POS=200;
START SLAVE;
  1. 二进制日志损坏恢复:如果主服务器二进制日志损坏,并且无法修复,可以考虑从备份中恢复主服务器的数据,并重新配置主从复制。首先,从备份中还原主服务器的数据到某个时间点。然后,重新启动主服务器,并生成新的二进制日志。在从服务器上,停止复制,删除中继日志,重新配置主服务器连接信息并启动复制。具体步骤如下:
  • 在主服务器上,从备份还原数据。假设使用 xtrabackup 工具进行备份恢复:
xtrabackup --prepare --target-dir=/var/lib/mysql/backup
xtrabackup --copy-back --target-dir=/var/lib/mysql/backup
chown -R mysql:mysql /var/lib/mysql
systemctl start mariadb
  • 在从服务器上:
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO
    MASTER_HOST='<主服务器 IP 地址>',
    MASTER_USER='<主服务器复制用户>',
    MASTER_PASSWORD='<主服务器复制用户密码>',
    MASTER_LOG_FILE='<新的主服务器二进制日志文件名>',
    MASTER_LOG_POS=<新的主服务器二进制日志位置>;
START SLAVE;

从服务器故障恢复

  1. 从服务器崩溃恢复:从服务器崩溃恢复后,首先检查中继日志是否完整。如果中继日志损坏,按照前面提到的方法删除中继日志并重新配置主服务器连接信息。如果中继日志完整,可以直接启动从服务器的复制:
START SLAVE;

然后使用 SHOW SLAVE STATUS \G 命令检查复制状态,确保 SQL 线程能够正确重放中继日志。如果发现 SQL 线程在重放日志时出现错误,查看错误信息并进行相应处理。例如,如果错误信息提示某个表不存在,可能需要在从服务器上重新创建该表,并使用 INSERT INTO... SELECT 语句从主服务器同步数据。 2. 从服务器数据损坏恢复:如果从服务器数据损坏,可以通过以下方法恢复。首先,停止从服务器的复制:

STOP SLAVE;

然后,使用 REPAIR TABLE 命令尝试修复损坏的表。如果修复失败,可以考虑从主服务器重新同步数据。一种方法是在主服务器上对损坏的表进行锁定,并导出数据:

LOCK TABLES <损坏的表名> READ;
SELECT * INTO OUTFILE '/tmp/<表名>.sql' FROM <损坏的表名>;
UNLOCK TABLES;

将导出的文件传输到从服务器,并在从服务器上导入数据:

LOAD DATA INFILE '/tmp/<表名>.sql' INTO TABLE <损坏的表名>;

最后,启动从服务器的复制:

START SLAVE;

配置故障恢复

  1. 修正配置错误:如果是主从配置参数错误导致的故障,在发现并修正错误后,需要重新启动 MariaDB 服务使配置生效。例如,如果修改了主服务器的 log-bin 参数,在 /etc/my.cnf 文件中修改后,执行以下命令重启服务:
sudo systemctl restart mariadb

在从服务器上,如果修改了 CHANGE MASTER TO 命令中的配置信息,同样需要先停止复制,重新配置后启动复制:

STOP SLAVE;
CHANGE MASTER TO
    MASTER_HOST='<正确的主服务器 IP 地址>',
    MASTER_USER='<正确的主服务器复制用户>',
    MASTER_PASSWORD='<正确的主服务器复制用户密码>',
    MASTER_LOG_FILE='<正确的主服务器二进制日志文件名>',
    MASTER_LOG_POS=<正确的主服务器二进制日志位置>;
START SLAVE;
  1. 解决版本兼容性问题:如果是由于主从服务器版本不兼容导致的复制故障,可以考虑升级或降级其中一方的 MariaDB 版本,使其达到兼容状态。在升级或降级之前,务必备份好数据。以升级从服务器版本为例,假设从服务器当前版本为 MariaDB 10.2,要升级到 10.5。首先,下载 MariaDB 10.5 的安装包,然后按照官方文档的步骤进行升级。升级完成后,重新配置主从复制:
  • 停止从服务器复制:
STOP SLAVE;
  • 删除中继日志:
RESET SLAVE;
  • 重新配置主服务器连接信息:
CHANGE MASTER TO
    MASTER_HOST='<主服务器 IP 地址>',
    MASTER_USER='<主服务器复制用户>',
    MASTER_PASSWORD='<主服务器复制用户密码>',
    MASTER_LOG_FILE='<主服务器二进制日志文件名>',
    MASTER_LOG_POS=<主服务器二进制日志位置>;
  • 启动从服务器复制:
START SLAVE;

预防措施

定期备份

  1. 全量备份:定期对主从服务器进行全量备份是非常重要的。可以使用 xtrabackup 等工具进行全量备份。例如,在主服务器上执行以下命令进行全量备份:
xtrabackup --backup --target-dir=/var/lib/mysql/backup

备份完成后,可以将备份文件传输到其他存储设备进行长期保存。全量备份可以在服务器出现严重故障(如数据损坏、服务器崩溃无法恢复等)时,快速恢复数据到某个时间点。 2. 增量备份:除了全量备份,还可以结合增量备份来减少备份时间和存储空间。增量备份只备份自上次全量备份或增量备份以来发生变化的数据。使用 xtrabackup 进行增量备份的命令如下:

xtrabackup --backup --target-dir=/var/lib/mysql/inc_backup --incremental-basedir=/var/lib/mysql/backup

在恢复时,需要先恢复全量备份,然后依次应用增量备份。

监控与预警

  1. 使用监控工具:可以使用 mariadb_exporter 等监控工具结合 PrometheusGrafana 搭建监控系统,实时监控主从服务器的状态。例如,监控主从服务器的复制延迟、二进制日志大小、中继日志状态等关键指标。在 mariadb_exporter 的配置文件中,可以定义需要监控的指标:
collectors:
  - status
  - replication
  1. 设置预警机制:基于监控系统,设置合理的预警机制。例如,当从服务器的复制延迟超过一定时间(如 60 秒),或者主服务器的二进制日志增长速度过快时,通过邮件、短信等方式及时通知管理员。在 Prometheus 中可以使用 Alertmanager 来配置预警规则。例如,以下是一个简单的预警规则示例:
groups:
- name: mariadb_replication
  rules:
  - alert: ReplicationLagTooHigh
    expr: mariadb_slave_seconds_behind_master > 60
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "从服务器复制延迟过高"
      description: "从服务器 {{ $labels.slave }} 的复制延迟超过 60 秒"

配置验证与版本管理

  1. 配置验证:在配置主从复制之前,仔细检查配置参数的正确性。可以使用一些工具或脚本来验证配置。例如,可以编写一个简单的 Python 脚本,根据配置文件内容检查 server-id 的唯一性、log-bin 参数的正确性等。在配置完成后,再次进行检查,确保配置无误后再启动复制。
  2. 版本管理:在部署主从服务器时,尽量使用相同版本的 MariaDB。如果无法避免版本差异,提前查阅官方文档,了解不同版本之间的兼容性问题,并进行相应的测试。定期关注 MariaDB 的版本更新,及时升级到稳定版本,以获取更好的性能和稳定性,但在升级之前一定要进行充分的测试。

通过以上对 MariaDB 复制故障的排查、恢复策略以及预防措施的详细介绍,希望能帮助数据库管理员更好地管理和维护 MariaDB 主从复制环境,确保系统的高可用性和数据一致性。在实际应用中,还需要根据具体的业务需求和系统架构,灵活运用这些方法和技巧。