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

MariaDB复制初始化过程深入解析

2021-01-104.8k 阅读

MariaDB 复制概述

在数据库管理中,复制是一项至关重要的技术,它允许将数据从一个 MariaDB 数据库服务器(主服务器)复制到一个或多个其他服务器(从服务器)。这种机制在提高数据可用性、负载均衡以及灾难恢复等方面发挥着关键作用。

MariaDB 的复制基于二进制日志(binary log)机制。主服务器将所有修改数据的语句记录到二进制日志中,从服务器通过读取主服务器的二进制日志,并在本地重放这些日志来保持与主服务器数据的一致性。

复制初始化前的准备工作

1. 环境配置

在开始 MariaDB 复制初始化之前,需要确保主从服务器的基本环境配置正确。这包括操作系统的设置、网络连接的畅通以及 MariaDB 软件的正确安装和版本兼容性。 例如,在 Linux 系统上安装 MariaDB,可以使用包管理器:

# 在 CentOS 上安装 MariaDB
yum install mariadb-server mariadb
# 启动 MariaDB 服务
systemctl start mariadb
# 设置开机自启
systemctl enable mariadb

2. 配置主服务器

在主服务器上,需要进行以下关键配置:

  • 启用二进制日志:编辑 MariaDB 的配置文件(通常是 /etc/my.cnf/etc/mysql/my.cnf),添加或修改以下参数:
[mysqld]
log-bin=mysql-bin
server-id=1

log-bin 参数启用二进制日志功能,并指定日志文件的前缀为 mysql-binserver-id 是服务器的唯一标识符,在复制环境中,每个服务器的 server-id 必须不同。修改配置文件后,重启 MariaDB 服务使配置生效。

  • 创建复制用户:登录到 MariaDB 数据库,创建一个专门用于复制的用户,并授予该用户必要的权限。
CREATE USER'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO'replication_user'@'%';
FLUSH PRIVILEGES;

上述 SQL 语句创建了一个名为 replication_user 的用户,允许该用户从任何主机连接,并授予其 REPLICATION SLAVE 权限,这是从服务器连接主服务器进行复制所需的权限。FLUSH PRIVILEGES 语句用于刷新权限表,使新的权限设置立即生效。

  • 获取主服务器状态:在主服务器上执行以下命令,获取二进制日志文件名和当前日志位置:
SHOW MASTER STATUS;

执行结果类似如下:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |    1200  |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

记录下 FilePosition 的值,在配置从服务器时会用到。

3. 配置从服务器

在从服务器上,同样需要进行一些关键配置:

  • 设置 server - id:编辑 MariaDB 配置文件,添加或修改 server-id 参数,确保其与主服务器及其他从服务器的 server-id 不同。
[mysqld]
server-id=2

修改后重启 MariaDB 服务。

  • 配置复制连接:登录到从服务器的 MariaDB 数据库,使用以下命令配置从服务器连接到主服务器:
CHANGE MASTER TO
    MASTER_HOST='master_host_ip',
    MASTER_USER='replication_user',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000003',
    MASTER_LOG_POS=1200;

这里的 MASTER_HOST 是主服务器的 IP 地址,MASTER_USERMASTER_PASSWORD 是在主服务器上创建的复制用户及其密码,MASTER_LOG_FILEMASTER_LOG_POS 是在主服务器上通过 SHOW MASTER STATUS 命令获取的值。

复制初始化过程详解

1. 建立连接

从服务器执行 CHANGE MASTER TO 命令后,会尝试与主服务器建立连接。从服务器使用配置的 MASTER_HOSTMASTER_USERMASTER_PASSWORD 进行身份验证。如果身份验证成功,主从服务器之间就建立了一个可靠的连接通道,用于后续的数据传输。

2. 同步数据

从服务器连接成功后,会向主服务器请求二进制日志的起始位置。主服务器根据从服务器提供的 MASTER_LOG_FILEMASTER_LOG_POS 值,从对应的二进制日志文件及位置开始发送日志内容给从服务器。

从服务器接收到二进制日志后,会将其存储在本地的中继日志(relay log)中。中继日志是从服务器特有的日志,用于临时存储从主服务器接收到的二进制日志内容。

3. 重放日志

从服务器在将接收到的二进制日志存储到中继日志后,会启动一个 SQL 线程,该线程负责从中继日志中读取日志记录,并在本地数据库中重放这些记录。重放过程就是按照日志记录的顺序,在从服务器上执行相应的 SQL 语句,从而使从服务器的数据与主服务器保持一致。

例如,如果主服务器上执行了一条插入语句:

INSERT INTO users (name, age) VALUES ('John', 30);

这条语句会被记录在二进制日志中,从服务器接收到后,SQL 线程会在本地数据库的 users 表中执行相同的插入操作,以确保数据的一致性。

4. 心跳机制与状态监控

在复制过程中,主从服务器之间还存在一种心跳机制。从服务器会定期向主服务器发送心跳消息,以确认连接是否仍然有效。同时,主服务器也会记录从服务器的状态信息。

可以通过在从服务器上执行以下命令来监控复制状态:

SHOW SLAVE STATUS \G;

执行结果会显示详细的复制状态信息,其中关键的几个字段如下:

  • Slave_IO_Running:表示从服务器的 I/O 线程是否正在运行。如果该值为 Yes,说明从服务器能够正常从主服务器接收二进制日志。
  • Slave_SQL_Running:表示从服务器的 SQL 线程是否正在运行。如果该值为 Yes,说明从服务器能够正常重放中继日志中的 SQL 语句。
  • Seconds_Behind_Master:表示从服务器落后主服务器的时间(以秒为单位)。理想情况下,该值应该接近于 0,如果该值较大,说明复制过程可能存在延迟问题。

常见问题及解决方法

1. 连接失败

如果从服务器无法连接到主服务器,可能有以下原因:

  • 网络问题:检查主从服务器之间的网络连接是否正常,可以使用 ping 命令测试网络连通性,以及使用 telnet 命令测试 MariaDB 服务端口(默认为 3306)是否开放。
  • 权限问题:确认在主服务器上创建的复制用户及其权限设置是否正确。可以在主服务器上重新执行授权语句,并在从服务器上再次尝试连接。
  • 配置错误:仔细检查主从服务器的配置文件,确保 server-id 配置正确,以及 CHANGE MASTER TO 命令中的参数设置无误。

2. 复制延迟

复制延迟是指从服务器的数据落后于主服务器的数据。可能的原因及解决方法如下:

  • 网络延迟:网络不稳定或带宽不足可能导致从服务器接收二进制日志的速度变慢。可以优化网络环境,确保主从服务器之间有足够的带宽和稳定的连接。
  • 主服务器负载过高:如果主服务器忙于处理大量的事务,生成二进制日志的速度过快,而从服务器重放日志的速度跟不上,就会导致复制延迟。可以优化主服务器的性能,例如调整数据库参数、优化查询语句等,以降低主服务器的负载。
  • 从服务器性能问题:从服务器自身的硬件性能不足或数据库参数配置不合理,可能导致重放日志的速度缓慢。可以升级从服务器的硬件配置,或者优化从服务器的数据库参数,如增加缓存大小、调整线程数量等。

3. 数据不一致

在复制过程中,如果出现数据不一致的情况,可能有以下原因及解决方法:

  • 数据修改不同步:在主从服务器配置完成后,不应在从服务器上直接进行数据修改操作,否则可能导致数据不一致。如果发现数据不一致,可以通过重新初始化复制过程来解决,即停止从服务器复制,重新配置 CHANGE MASTER TO 命令,并重新启动复制。
  • 复制中断:如果在复制过程中出现网络故障、服务器重启等情况,可能导致复制中断,从而引起数据不一致。可以通过检查复制状态,找到中断点,并根据情况进行修复。例如,如果从服务器的 I/O 线程停止,可以尝试重新启动从服务器的复制功能,让其重新连接主服务器并继续同步数据。

高级复制配置选项

1. 多线程复制

从 MariaDB 10.0 版本开始,支持多线程复制(Multi - Threaded Slave,MTS)功能。传统的从服务器只有一个 SQL 线程来重放中继日志,在高并发环境下可能成为性能瓶颈。MTS 允许从服务器使用多个线程来并行重放日志,从而提高复制性能。

要启用 MTS,在从服务器的配置文件中添加以下参数:

[mysqld]
slave_parallel_workers=4
slave_parallel_type=LOGICAL_CLOCK

slave_parallel_workers 参数指定用于重放日志的线程数量,slave_parallel_type 参数指定并行复制的类型。LOGICAL_CLOCK 类型是基于逻辑时钟的并行复制,它可以更好地处理事务之间的依赖关系。

2. GTID 复制

全局事务标识符(Global Transaction Identifier,GTID)是 MariaDB 10.0 引入的另一个重要特性。GTID 为每个在主服务器上执行的事务分配一个唯一的标识符,从服务器可以通过 GTID 更准确地跟踪和重放事务,简化了复制的管理和故障恢复过程。

要启用 GTID 复制,在主从服务器的配置文件中添加以下参数:

[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON

在主服务器上,还需要确保二进制日志格式为 ROW

[mysqld]
binlog_format=ROW

启用 GTID 后,在配置从服务器时,不再需要指定 MASTER_LOG_FILEMASTER_LOG_POS,而是使用 CHANGE MASTER TO 命令的 GTID 相关参数:

CHANGE MASTER TO
    MASTER_HOST='master_host_ip',
    MASTER_USER='replication_user',
    MASTER_PASSWORD='password',
    MASTER_AUTO_POSITION=1;

MASTER_AUTO_POSITION=1 表示使用 GTID 自动定位主服务器的二进制日志位置。

3. 半同步复制

半同步复制(Semi - Synchronous Replication)是一种提高数据安全性的复制方式。在传统的异步复制中,主服务器在提交事务后立即返回客户端,而不等待从服务器确认接收日志。半同步复制则要求主服务器在提交事务前,至少等待一个从服务器确认接收到二进制日志,从而确保在主服务器发生故障时,已经提交的事务不会丢失。

要启用半同步复制,首先需要在主从服务器上安装半同步复制插件:

INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';

然后在主从服务器的配置文件中添加相应参数:

[mysqld]
# 主服务器配置
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=10000
# 从服务器配置
rpl_semi_sync_slave_enabled=ON

rpl_semi_sync_master_enabledrpl_semi_sync_slave_enabled 分别用于启用主从服务器的半同步复制功能,rpl_semi_sync_master_timeout 参数指定主服务器等待从服务器确认的超时时间(以毫秒为单位)。

复制拓扑结构

1. 一主一从

这是最基本的复制拓扑结构,由一个主服务器和一个从服务器组成。主服务器负责处理所有的数据修改操作,并将二进制日志发送给从服务器。从服务器接收并重放这些日志,以保持与主服务器的数据一致性。这种结构适用于简单的备份和只读查询场景。

2. 一主多从

在一主多从的拓扑结构中,一个主服务器可以有多个从服务器。主服务器将二进制日志同时发送给所有从服务器,每个从服务器独立地接收和重放日志。这种结构常用于负载均衡,将只读查询分配到多个从服务器上,减轻主服务器的负担。

3. 主主复制

主主复制(Master - Master Replication)是一种特殊的复制拓扑,两个服务器都充当主服务器,同时也互为从服务器。每个服务器既可以处理数据修改操作,又可以接收并重放来自对方服务器的二进制日志。这种结构可以提高系统的可用性和写入性能,但需要注意避免数据冲突。

在配置主主复制时,每个服务器都需要按照主服务器和从服务器的配置方式进行设置。例如,服务器 A 配置为服务器 B 的主服务器,同时服务器 B 也配置为服务器 A 的主服务器。并且在两个服务器上都需要设置不同的 server-id,以及正确配置 CHANGE MASTER TO 命令。

4. 级联复制

级联复制(Cascading Replication)是指从服务器不仅从主服务器接收二进制日志,还可以作为其他从服务器的主服务器,将接收到的日志转发给下一级从服务器。这种结构可以减少主服务器的负载,特别是在有大量从服务器的情况下。

例如,主服务器将日志发送给第一级从服务器,第一级从服务器再将日志发送给第二级从服务器,依此类推。在配置级联复制时,除了主服务器的常规配置外,每一级从服务器都需要按照主从服务器的配置方法进行设置,并且需要注意各级之间的网络连接和权限设置。

复制初始化的最佳实践

1. 备份与恢复

在进行复制初始化之前,强烈建议对主服务器的数据进行备份。这样在复制过程中出现问题时,可以方便地恢复到初始状态。可以使用 MariaDB 自带的备份工具,如 mysqldumpmariabackup。 例如,使用 mysqldump 进行全量备份:

mysqldump -u root -p --all -databases > backup.sql

在从服务器初始化失败或数据出现不一致时,可以使用备份文件在从服务器上进行恢复,然后重新进行复制初始化。

2. 监控与预警

建立完善的监控机制,实时监测复制状态。可以使用 MariaDB 自带的命令,如 SHOW SLAVE STATUS,也可以结合第三方监控工具,如 Prometheus + Grafana,对复制延迟、连接状态等关键指标进行可视化监控。

同时,设置预警机制,当复制出现异常,如复制延迟超过一定阈值、连接中断等情况时,及时通知相关人员进行处理,以确保数据的一致性和可用性。

3. 测试环境验证

在将复制配置应用到生产环境之前,先在测试环境中进行充分的验证。模拟各种场景,如网络故障、服务器重启、高并发写入等,观察复制的稳定性和数据一致性。只有在测试环境中验证通过后,才能将配置推广到生产环境,以降低风险。

4. 定期维护

定期对主从服务器进行维护,包括数据库版本升级、参数优化、日志清理等操作。在进行版本升级时,要注意版本兼容性,特别是对于复制相关的功能。同时,定期清理二进制日志和中继日志,以避免占用过多的磁盘空间。

通过深入理解 MariaDB 复制初始化过程,并遵循最佳实践,能够构建一个稳定、高效且可靠的数据库复制环境,满足不同业务场景下的数据管理需求。无论是简单的备份需求,还是复杂的高可用和负载均衡架构,正确的复制配置都起着至关重要的作用。在实际应用中,需要根据具体的业务需求和系统架构,灵活选择合适的复制拓扑结构和配置选项,以实现最优的数据库性能和数据安全性。