MySQL运维与监控之:`MySQL`的`master_info_repository`:其在主从复制中的元数据存储。

MySQL运维与监控之:master_info_repository:主从复制元数据存储详解

大家好,今天我们来深入探讨MySQL主从复制中一个至关重要的概念:master_info_repository。它控制着主服务器信息的存储方式,直接影响到复制的可靠性和性能。我们将从概念、配置、使用、监控以及潜在问题等方面进行详细剖析,并结合实际示例,帮助大家更好地理解和应用这一特性。

1. master_info_repository:概念与作用

master_info_repository是一个MySQL服务器变量,用于指定主服务器信息的存储位置。这些信息包括连接到哪个主服务器、当前读取的主服务器二进制日志文件名和位置,以及连接主服务器所用的用户凭证等等。

简单来说,master_info_repository决定了从服务器如何记住它与主服务器的同步进度。如果从服务器重启,它需要这些信息才能从上次中断的地方继续复制。

该变量有两个可选值:

  • FILE: 主服务器信息存储在文件中,默认的文件名是master.info,位于数据目录下。
  • TABLE: 主服务器信息存储在mysql.slave_master_info表中。

选择哪种存储方式取决于具体的需求和场景。

2. master_info_repository:配置与修改

master_info_repository可以在MySQL配置文件(如my.cnfmy.ini)中设置,也可以通过动态SQL语句进行修改。

  • 配置文件修改:

    在配置文件中添加或修改以下行:

    [mysqld]
    master_info_repository=TABLE
    # 或者
    master_info_repository=FILE

    修改配置文件后,需要重启MySQL服务器才能生效。

  • 动态SQL修改:

    可以使用SET GLOBAL语句动态修改master_info_repository变量。

    SET GLOBAL master_info_repository = 'TABLE';
    -- 或者
    SET GLOBAL master_info_repository = 'FILE';

    使用SET GLOBAL修改后,新的设置对后续连接有效。对于当前连接,可以使用SET PERSIST使其在重启后仍然有效:

    SET PERSIST master_info_repository = 'TABLE';

    注意:修改master_info_repository后,还需要重启复制线程才能使新的设置生效。可以使用STOP SLAVE; START SLAVE;命令来重启复制线程。

3. master_info_repository=FILE:基于文件的存储

这是默认的存储方式。主服务器信息保存在数据目录下的master.info文件中。该文件包含以下信息:

字段 描述
Master_Host 主服务器的主机名或IP地址
Master_User 用于连接主服务器的用户名
Master_Port 主服务器的端口号
Connect_Retry 连接失败后的重试间隔,单位为秒
Master_Log_File 从服务器当前正在读取的主服务器二进制日志文件名
Read_Master_Log_Pos 从服务器当前正在读取的主服务器二进制日志文件中的位置
Master_Server_Id 主服务器的服务器ID
Master_SSL_Allowed 是否允许SSL连接
Master_SSL_CA_File SSL CA证书文件路径
Master_SSL_CA_Path SSL CA证书目录
Master_SSL_Cert SSL 客户端证书文件
Master_SSL_Cipher SSL加密算法
Master_SSL_Key SSL 客户端密钥文件
Seconds_Behind_Master 从服务器落后于主服务器的秒数 (并非总是准确)
Master_SSL_Verify_Server_Cert 是否验证主服务器的SSL证书
Master_TLS_VERSION 允许的TLS协议版本,例如:’TLSv1,TLSv1.1,TLSv1.2′
Master_PUBLIC_KEY_PATH 用于基于RSA密钥对的主服务器公共密钥的路径
Get_master_public_key 是否从主服务器请求公共密钥,仅当Master_PUBLIC_KEY_PATH为空时生效
Master_Bind 用于连接主服务器的从服务器的IP地址或主机名

可以使用文本编辑器直接查看master.info文件的内容。例如:

# cat master.info
# Generated by MySQL 8.0.30, this is an automatically created file.
# Edit at your own risk
# Slave SQL thread connecting to the master
# Reconnect to master if the connection is lost
# Master_Host master_User master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Master_Server_Id Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Master_TLS_VERSION Master_PUBLIC_KEY_PATH Get_master_public_key Master_Bind
master 127.0.0.1 root 3306 60 mysql-bin.000001 4 1 0  0            0                    0            0                  0                0               NULL                0                             0                  0                        0                      0

优点:

  • 简单易懂,方便查看和修改。

缺点:

  • 文件IO操作可能影响性能,尤其是在高并发写入时。
  • 文件可能损坏,导致复制中断。
  • 缺乏事务性,可能出现数据不一致。

4. master_info_repository=TABLE:基于表的存储

master_info_repository设置为TABLE时,主服务器信息存储在mysql.slave_master_info表中。

该表的结构如下:

CREATE TABLE `slave_master_info` (
  `Number_of_lines` int unsigned NOT NULL COMMENT 'Number of lines in the file.',
  `Master_log_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'The name of the master binary log file that the slave is currently reading from.',
  `Master_log_pos` bigint unsigned NOT NULL COMMENT 'The master log position that the slave is currently reading from.',
  `Host` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'The host name of the master.',
  `User_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'The user name used to connect to the master.',
  `User_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'The password used to connect to the master.',
  `Port` int unsigned DEFAULT NULL COMMENT 'The port number used to connect to the master.',
  `Connect_retry` int unsigned DEFAULT NULL COMMENT 'The period in seconds that the slave will wait before attempting to reconnect to the master.',
  `Enabled_ssl` tinyint unsigned DEFAULT NULL COMMENT 'Whether or not the slave is using SSL to connect to the master.',
  `Ssl_ca` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'The file name of the SSL certificate authority.',
  `Ssl_capath` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'The path name of the SSL certificate authority.',
  `Ssl_cert` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'The file name of the SSL certificate.',
  `Ssl_cipher` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'The name of the SSL cipher to use for encryption.',
  `Ssl_key` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'The file name of the SSL key.',
  `Ssl_verify_server_cert` tinyint DEFAULT NULL COMMENT 'Whether or not to verify the server certificate.',
  `Heartbeat` float unsigned NOT NULL COMMENT 'Interval in seconds between heartbeats.',
  `Bind_to_interface` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Interface to bind to when connecting to the master.',
  `Preferred_compression_algorithm` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Preferred compression algorithm for the connection.',
  `Master_server_id` int unsigned DEFAULT NULL COMMENT 'The master server id of the replication.',
  `Master_uuid` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'The master uuid of the replication.',
  `Master_info_repository` enum('FILE','TABLE') CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'The repository type for master info.',
  `Relay_log_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'The name of the relay log file that the slave is currently reading from.',
  `Relay_log_pos` bigint unsigned NOT NULL COMMENT 'The relay log position that the slave is currently reading from.',
  `Master_ssl_verify_server_cert` tinyint DEFAULT NULL COMMENT 'Whether or not to verify the server certificate.',
  `Master_tls_version` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'TLS version for the master connection.',
  `Master_public_key_path` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'The path to the master public key.',
  `Get_master_public_key` tinyint DEFAULT NULL COMMENT 'Whether or not to get the master public key.',
  `Network_namespace` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'The network namespace used for master connection.',
  PRIMARY KEY (`Number_of_lines`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Master Information';

可以使用SQL语句查询mysql.slave_master_info表来获取主服务器信息。例如:

SELECT * FROM mysql.slave_master_info;

优点:

  • 事务性,保证数据一致性。
  • 避免文件IO操作,提高性能。
  • 方便管理和备份。

缺点:

  • 需要额外的存储空间。
  • 查询需要执行SQL语句,相比文件读取略慢。

5. relay_log_info_repository:相关变量

master_info_repository类似,relay_log_info_repository变量用于指定中继日志信息的存储位置。该变量也有两个可选值:

  • FILE: 中继日志信息存储在文件中,默认的文件名是relay-log.info,位于数据目录下。
  • TABLE: 中继日志信息存储在mysql.slave_relay_log_info表中。

relay_log_info_repository的配置和使用方式与master_info_repository类似,这里不再赘述。

6. 性能考量与选择建议

在选择master_info_repository的存储方式时,需要综合考虑以下因素:

  • 性能: 对于写入频繁的复制环境,TABLE方式通常优于FILE方式,因为它避免了文件IO操作。
  • 可靠性: TABLE方式具有事务性,可以更好地保证数据一致性,避免因文件损坏导致复制中断。
  • 易用性: FILE方式简单易懂,方便查看和修改,但缺乏灵活性。
  • 空间: TABLE方式需要额外的存储空间。

一般来说,对于生产环境,建议使用TABLE方式,因为它具有更高的可靠性和性能。对于测试环境或对性能要求不高的环境,可以使用FILE方式。

7. 监控与问题排查

  • 监控master.info文件或mysql.slave_master_info表的内容: 定期检查主服务器信息是否正确,以及是否与主服务器的实际情况一致。可以使用脚本或监控工具自动完成此操作。
  • 监控复制延迟: 使用SHOW SLAVE STATUS命令查看Seconds_Behind_Master指标,了解从服务器的复制延迟情况。
  • 查看错误日志: 如果复制出现问题,可以查看MySQL错误日志,查找相关的错误信息。

8. 常见问题及解决方法

  • master.info文件损坏: 如果master.info文件损坏,可以尝试从备份中恢复。如果无法恢复,可以手动创建该文件,并填写正确的主服务器信息。
  • mysql.slave_master_info表数据错误: 如果mysql.slave_master_info表数据错误,可以使用RESET SLAVE命令重置从服务器,然后重新配置复制。
  • 复制中断: 如果复制中断,可以检查主服务器和从服务器的网络连接是否正常,以及主服务器的二进制日志是否可用。

9. 代码示例

下面是一些常用的SQL语句示例:

  • 查看master_info_repository变量的值:

    SHOW GLOBAL VARIABLES LIKE 'master_info_repository';
  • 修改master_info_repository变量的值:

    SET GLOBAL master_info_repository = 'TABLE';
  • 查询mysql.slave_master_info表:

    SELECT * FROM mysql.slave_master_info;
  • 查看从服务器状态:

    SHOW SLAVE STATUSG
  • 重启复制线程:

    STOP SLAVE;
    START SLAVE;

10. 总结:选择合适的存储方式,保障复制的稳定运行

master_info_repository是MySQL主从复制中的一个关键参数,它决定了主服务器信息的存储方式。理解其作用、配置和使用方法,可以帮助我们更好地管理和监控MySQL复制环境,确保复制的可靠性和性能。根据实际情况选择FILETABLE存储方式,并密切关注复制状态,可以有效避免复制中断等问题。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注