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.cnf
或my.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复制环境,确保复制的可靠性和性能。根据实际情况选择FILE
或TABLE
存储方式,并密切关注复制状态,可以有效避免复制中断等问题。