欢迎光临
我们一直在努力

MySQL MGR 集群 vs 主备集群对比分析报告

目录标题

  • MySQL MGR 集群 vs 主备集群对比分析报告
    • 一、集群基本信息对比
    • 二、event_scheduler 使用对比
      • 1. 配置值
      • 2. 配置文件位置
      • 3. 使用说明
    • 三、同步机制异同点
      • 3.1 相同点
      • 3.2 差异点
      • 3.3 MGR 专用配置文件
      • 3.4 主备集群半同步配置
    • 四、存储过程、触发器、定时器同步机制
      • 4.1 同步原理
      • 4.2 关键配置参数
      • 4.3 对象同步验证
      • 4.4 存储过程创建与验证
        • 4.4.1 创建存储过程示例
        • 4.4.2 验证同步到从节点
        • 4.4.3 完整验证检查清单
      • 4.5 触发器创建与验证
        • 4.5.1 创建触发器示例
        • 4.5.2 验证同步到从节点
        • 4.5.3 触发器验证检查清单
      • 4.6 定时器 (EVENT) 创建与验证
        • 4.6.1 创建定时器示例
        • 4.6.2 验证同步到从节点
        • 4.6.3 定时器验证检查清单
        • 4.6.4 定时器生产环境配置建议
      • 4.7 完整同步验证流程总结
    • 五、节点读写状态对比
      • 5.1 MGR 集群
      • 5.2 主备集群
    • 六、配置、检查方法总结
      • 6.1 检查 event_scheduler 状态
      • 6.2 检查节点角色
      • 6.3 检查复制状态
      • 6.4 检查对象同步
      • 6.5 启用 event_scheduler (仅主节点)
      • 6.6 永久配置修改
    • 七、建议与注意事项
      • 7.1 event_scheduler 使用建议
      • 7.2 存储过程/触发器/定时器开发建议
      • 7.3 监控建议
    • 八、配置文件路径汇总

MySQL MGR 集群 vs 主备集群对比分析报告

MySQL 版本: 8.0.26


一、集群基本信息对比

对比项MGR 集群 (mysql-65cbddad)主备集群 (mysql-a486e45d)
集群策略 MGRCluster MySQLRWCluster
数据库版本 mysql8.0.26-mgr mysql8.0.26
节点数量 3节点 (1主2备) 2节点 (1主1备)
部署模式 多主模式 (单主写入) 传统主从复制

二、event_scheduler 使用对比

1. 配置值

MGR 集群: event_scheduler = OFF
主备集群: event_scheduler = OFF

2. 配置文件位置

# /etc/mysql/my.cnf
[mysqld]
event_scheduler=0

3. 使用说明

event_scheduler 默认关闭原因:

  • 避免自动化任务在多个节点重复执行
  • 主备/MGR 集群中,事件调度器仅需在主节点/PRIMARY节点运行

启用方式:

— 方式1: 动态开启 (仅主节点)
SET GLOBAL event_scheduler = ON;

— 方式2: 在配置文件中开启 (需重启)
— 修改 /etc/mysql/my.cnf
event_scheduler=1

最佳实践:

  • MGR 集群: 仅在 PRIMARY 节点开启,SECONDARY 节点保持关闭
  • 主备集群: 仅在 Master 节点开启,Slave 节点保持关闭
  • 通过应用程序检测节点角色后再开启,或由运维手动管理

三、同步机制异同点

3.1 相同点

配置项MGR 集群主备集群说明
binlog_format ROW ROW 行级复制,MGR强制要求
gtid_mode ON ON 使用GTID全局事务ID
enforce_gtid_consistency ON ON 强制GTID一致性
log_slave_updates ON ON 从库记录中继日志到binlog
binlog_row_image FULL FULL 记录完整行镜像
slave_parallel_type LOGICAL_CLOCK LOGICAL_CLOCK 并行复制类型
slave_parallel_workers 16 16 并行复制线程数
slave_preserve_commit_order ON ON 保持事务提交顺序

3.2 差异点

配置���MGR 集群主备集群说明
复制机制 Group Replication Binlog半同步复制 核心差异
group_replication_group_seeds mysql-65cbddad00-headless:33061,… MGR组成员发现
transaction_write_set_extraction XXHASH64 XXHASH64 写集提取算法
半同步复制 不使用 使用 rpl_semi_sync_master 主备专用

3.3 MGR 专用配置文件

文件: /etc/mysql.cnf.d/mgr_group.cnf

[mysqld]
report_host='245.0.4.201'
loose-group_replication_local_address='245.0.4.201:33061'
loose-group_replication_group_seeds='mysql-65cbddad00-headless:33061,…'
loose-group_replication_gtid_assignment_block_size=1

3.4 主备集群半同步配置

文件: /etc/mysql/ext.semi.cnf

# 半同步复制插件
loose-rpl_semi_sync_master_enabled=1
loose-rpl_semi_sync_master_timeout=1000
loose-rpl_semi_sync_master_wait_no_slave=OFF
loose-rpl_semi_sync_master_wait_for_slave_count=1
loose-rpl_semi_sync_master_wait_point=AFTER_SYNC
loose-rpl_semi_sync_slave_enabled=1


四、存储过程、触发器、定时器同步机制

4.1 同步原理

对象类型同步机制说明
存储过程 通过 binlog DDL 语句同步 CREATE/ALTER PROCEDURE 记录在binlog
触发器 通过 binlog DDL 语句同步 CREATE TRIGGER 记录在binlog
定时器 通过 binlog DDL 语句同步 CREATE EVENT 记录在binlog
执行 event_scheduler 控制执行 语法自动同步,执行需调度器

4.2 关键配置参数

log_bin_trust_function_creators

MGR 集群: log_bin_trust_function_creators = OFF
主备集群: log_bin_trust_function_creators = OFF
配置文件中: log_bin_trust_function_creators=1 (实际已启用)

此参数控制是否信任存储函数创建者:

  • OFF: 创建存储函数/触发器需要 SUPER 权限或 DETERMINISTIC/NO SQL 声明
  • ON: 允许创建任意存储函数

4.3 对象同步验证

— 1. 查看存储过程
SELECT ROUTINE_NAME, ROUTINE_TYPE
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = 'your_db';

— 2. 查看触发器
SELECT TRIGGER_NAME, EVENT_MANIPULATION
FROM information_schema.TRIGGERS
WHERE TRIGGER_SCHEMA = 'your_db';

— 3. 查看事件/定时器
SELECT EVENT_NAME, STATUS, EXECUTE_AT
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'your_db';


4.4 存储过程创建与验证

4.4.1 创建存储过程示例

— 在主节点 (PRIMARY/Master) 执行
USE test_db;

— 删除已存在的存储过程(幂等性设计)
DROP PROCEDURE IF EXISTS sp_sample_process;

— 创建存储过程
DELIMITER //
CREATE PROCEDURE sp_sample_process()
DETERMINISTIC
READS SQL DATA
BEGIN
SELECT COUNT(*) AS table_count
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'test_db';
END //
DELIMITER ;

— 验证创建成功
SHOW PROCEDURE STATUS WHERE Db = 'test_db' AND Name = 'sp_sample_process';

4.4.2 验证同步到从节点

# 1. 获取 GTID 位置(主节点)
kubectl exec -it -n qfusion-admin <primary-pod> -c mysql — mysql -u root -p -e "
SELECT @@GLOBAL.GTID_EXECUTED;
"

# 2. 检查从节点 GTID 是否一致
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SELECT @@GLOBAL.GTID_EXECUTED;
SHOW SLAVE STATUS\\G
"

# 3. 在从节点验证存储过程已同步
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SELECT ROUTINE_NAME, ROUTINE_TYPE, CREATED
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = 'test_db' AND ROUTINE_NAME = 'sp_sample_process';
"

# 4. 查看存储过程定义(确认代码一致)
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SHOW CREATE PROCEDURE test_db.sp_sample_process\\G
"

4.4.3 完整验证检查清单
检查项命令预期结果
主节点 GTID SELECT @@GLOBAL.GTID_EXECUTED; 返回 GTID 集合
从节点同步状态 SHOW SLAVE STATUS\\G Seconds_Behind_Master: 0
从节点 GTID SELECT @@GLOBAL.GTID_EXECUTED; 与主节点一致
存储过程存在 SHOW PROCEDURE STATUS 能查到 sp_sample_process
存储过程代码 SHOW CREATE PROCEDURE 代码与主节点一致

4.5 触发器创建与验证

4.5.1 创建触发器示例

— 在主节点 (PRIMARY/Master) 执行
USE test_db;

— 创建测试表
DROP TABLE IF EXISTS t_audit_log;
CREATE TABLE t_audit_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(64),
action VARCHAR(16),
old_value JSON,
new_value JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

DROP TABLE IF EXISTS t_users;
CREATE TABLE t_users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

— 删除已存在的触发器
DROP TRIGGER IF EXISTS tr_users_after_update;

— 创建触发器(记录更新操作)
DELIMITER //
CREATE TRIGGER tr_users_after_update
AFTER UPDATE ON t_users
FOR EACH ROW
BEGIN
INSERT INTO t_audit_log (table_name, action, old_value, new_value)
VALUES ('t_users', 'UPDATE',
JSON_OBJECT('id', OLD.id, 'username', OLD.username, 'email', OLD.email),
JSON_OBJECT('id', NEW.id, 'username', NEW.username, 'email', NEW.email));
END //
DELIMITER ;

— 验证创建成功
SHOW TRIGGERS LIKE 't_users';

4.5.2 验证同步到从节点

# 1. 在主节点测试触发器
kubectl exec -it -n qfusion-admin <primary-pod> -c mysql — mysql -u root -p test_db -e "
INSERT INTO t_users (username, email) VALUES ('user1', 'user1@test.com');
UPDATE t_users SET email = 'newemail@test.com' WHERE username = 'user1';
SELECT * FROM t_audit_log ORDER BY id DESC LIMIT 1;
"

# 2. 检查从节点同步状态
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SHOW SLAVE STATUS\\G
"
| grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master"

# 3. 在从节点验证触发器定义已同步
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_TIMING
FROM information_schema.TRIGGERS
WHERE TRIGGER_SCHEMA = 'test_db' AND TRIGGER_NAME = 'tr_users_after_update';
"

# 4. 查看触发器详细定义
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SHOW CREATE TRIGGER test_db.tr_users_after_update\\G
"

# 5. 验证数据已同步(注意:从节点不会再次执行触发器)
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p test_db -e "
SELECT * FROM t_users;
SELECT * FROM t_audit_log;
"

4.5.3 触发器验证检查清单
检查项命令预期结果
触发器定义同步 SHOW TRIGGERS LIKE 't_users' 能查到 tr_users_after_update
触发器详情 SHOW CREATE TRIGGER 定义与主节点一致
数据表同步 SELECT * FROM t_users 数据一致
审计日志同步 SELECT * FROM t_audit_log 主节点执行结果已同步

4.6 定时器 (EVENT) 创建与验证

4.6.1 创建定时器示例

— 在主节点 (PRIMARY/Master) 执行
USE test_db;

— 先启用事件调度器(仅主节点)
SET GLOBAL event_scheduler = ON;

— 验证调度器已启动
SHOW VARIABLES LIKE 'event_scheduler';

— 删除已存在的事件
DROP EVENT IF EXISTS ev_cleanup_old_logs;

— 创建定时清理任务(每分钟执行一次)
DELIMITER //
CREATE EVENT ev_cleanup_old_logs
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
DO
BEGIN
DECLARE rows_deleted INT DEFAULT 0;

— 清理30天前的审计日志
DELETE FROM t_audit_log
WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)
LIMIT 1000;

SET rows_deleted = ROW_COUNT();

— 记录执行日志(可选)
INSERT INTO t_audit_log (table_name, action, new_value)
VALUES ('event_scheduler', 'cleanup', JSON_OBJECT('deleted_rows', rows_deleted));
END //
DELIMITER ;

— 验证事件创建并查看状态
SELECT EVENT_NAME, STATUS, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'test_db' AND EVENT_NAME = 'ev_cleanup_old_logs';

— 启用事件(默认创建后即启用)
ALTER EVENT ev_cleanup_old_logs ENABLE;

4.6.2 验证同步到从节点

# 1. 检查从节点事件定义是否同步
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SELECT EVENT_NAME, STATUS, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'test_db' AND EVENT_NAME = 'ev_cleanup_old_logs';
"

# 2. 验证从节点 event_scheduler 状态(应为 OFF)
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SELECT @@event_scheduler;
"

# 3. 查看从节点事件详情
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p -e "
SHOW CREATE EVENT test_db.ev_cleanup_old_logs\\G
"

# 4. 等待1分钟后检查主节点执行结果
kubectl exec -it -n qfusion-admin <primary-pod> -c mysql — mysql -u root -p test_db -e "
SELECT * FROM t_audit_log
WHERE table_name = 'event_scheduler'
ORDER BY created_at DESC
LIMIT 5;
"

# 5. 验证从节点数据已同步(但事件未在从节点执行)
kubectl exec -it -n qfusion-admin <secondary-pod> -c mysql — mysql -u root -p test_db -e "
SELECT * FROM t_audit_log
WHERE table_name = 'event_scheduler'
ORDER BY created_at DESC
LIMIT 5;
"

4.6.3 定时器验证检查清单
检查项命令预期结果
主节点调度器 SELECT @@event_scheduler ON
从节点调度器 SELECT @@event_scheduler OFF(重要!)
事件定义同步 SHOW EVENTS 能查到 ev_cleanup_old_logs
事件状态 SELECT * FROM information_schema.EVENTS STATUS=ENABLED
主节点执行 检查 t_audit_log 有执行记录
从节点数据 检查 t_audit_log 数据已同步,但非本地执行
4.6.4 定时器生产环境配置建议

— 生产环境建���:每天凌晨2点执行
DROP EVENT IF EXISTS ev_cleanup_old_logs;

DELIMITER //
CREATE EVENT ev_cleanup_old_logs
ON SCHEDULE EVERY 1 DAY
STARTS CONCAT(CURDATE() + INTERVAL 1 DAY, ' 02:00:00')
ON COMPLETION PRESERVE
DO
BEGIN
DELETE FROM t_audit_log
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY)
LIMIT 10000;
END //
DELIMITER ;

— 查看所有事件状态
SELECT
EVENT_NAME,
STATUS,
LAST_EXECUTED,
ON_COMPLETION,
INTERVAL_VALUE,
INTERVAL_FIELD
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'test_db';


4.7 完整同步验证流程总结

#!/bin/bash
# 完整的对象同步验证脚本

NAMESPACE="qfusion-admin"
PRIMARY_POD="<primary-pod-name>"
SECONDARY_POD="<secondary-pod-name>"
DB_USER="root"
DB_PASS="<password>"
DB_NAME="test_db"

echo "=== 1. 检查复制状态 ==="
kubectl exec -it -n $NAMESPACE $SECONDARY_POD -c mysql — mysql -u $DB_USER -p$DB_PASS -e "
SHOW SLAVE STATUS\\G
"
| grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Last_Error"

echo -e "\\n=== 2. 验证存储过程同步 ==="
kubectl exec -it -n $NAMESPACE $SECONDARY_POD -c mysql — mysql -u $DB_USER -p$DB_PASS -e "
SELECT ROUTINE_NAME, CREATED
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = '$DB_NAME';
"

echo -e "\\n=== 3. 验证触发器同步 ==="
kubectl exec -it -n $NAMESPACE $SECONDARY_POD -c mysql — mysql -u $DB_USER -p$DB_PASS -e "
SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE
FROM information_schema.TRIGGERS
WHERE TRIGGER_SCHEMA = '$DB_NAME';
"

echo -e "\\n=== 4. 验证定时器同步 ==="
kubectl exec -it -n $NAMESPACE $SECONDARY_POD -c mysql — mysql -u $DB_USER -p$DB_PASS -e "
SELECT EVENT_NAME, STATUS, LAST_EXECUTED
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = '$DB_NAME';
"

echo -e "\\n=== 5. 验证 GTID 一致性 ==="
echo "主节点 GTID:"
kubectl exec -it -n $NAMESPACE $PRIMARY_POD -c mysql — mysql -u $DB_USER -p$DB_PASS -e "
SELECT @@GLOBAL.GTID_EXECUTED;
"

echo "从节点 GTID:"
kubectl exec -it -n $NAMESPACE $SECONDARY_POD -c mysql — mysql -u $DB_USER -p$DB_PASS -e "
SELECT @@GLOBAL.GTID_EXECUTED;
"

echo -e "\\n=== 6. 检查 event_scheduler 状态 ==="
echo "主节点:"
kubectl exec -it -n $NAMESPACE $PRIMARY_POD -c mysql — mysql -u $DB_USER -p$DB_PASS -e "
SELECT @@event_scheduler;
"

echo "从节点:"
kubectl exec -it -n $NAMESPACE $SECONDARY_POD -c mysql — mysql -u $DB_USER -p$DB_PASS -e "
SELECT @@event_scheduler;
"


五、节点读写状态对比

5.1 MGR 集群

节点角色super_read_onlyread_only说明
mysql-65cbddad00-0 PRIMARY 0 0 可读写
mysql-65cbddad01-0 SECONDARY 1 1 只读
mysql-65cbddad02-0 SECONDARY 1 1 只读

5.2 主备集群

节点角色super_read_onlyread_only说明
mysql-a486e45d00-0 Master 0 0 可读写
mysql-a486e45d01-0 Slave 1 0 只读

注意: 主备集群的 Slave 节点 read_only=1 由配置文件 /etc/mysql/ext.semi.cnf 设置。


六、配置、检查方法总结

6.1 检查 event_scheduler 状态

SHOW VARIABLES LIKE 'event_scheduler';

— 或
SELECT @@event_scheduler;

6.2 检查节点角色

— MGR 集群
SELECT MEMBER_HOST, MEMBER_PORT, MEMBER_STATE, MEMBER_ROLE
FROM performance_schema.replication_group_members;

— 主备集群
SHOW SLAVE STATUS\\G

6.3 检查复制状态

— MGR 集群
SHOW VARIABLES LIKE 'group_replication%';

— 主备集群
SHOW SLAVE STATUS\\G
SHOW MASTER STATUS;

6.4 检查对象同步

— 检查 GTID 执行情况
SHOW VARIABLES LIKE 'gtid%';
SELECT @@GLOBAL.GTID_EXECUTED;

— 检查 binlog 位置
SHOW MASTER STATUS;

6.5 启用 event_scheduler (仅主节点)

— MGR 集群 – 在 PRIMARY 节点执行
SET GLOBAL event_scheduler = ON;

— 主备集群 – 在 Master 节点执行
SET GLOBAL event_scheduler = ON;

6.6 永久配置修改

# 编辑配置文件
kubectl exec -it -n qfusion-admin <pod-name> -c mysql — vi /etc/mysql/my.cnf

# 修改 event_scheduler=0 为 event_scheduler=1
# 然后重启 Pod
kubectl delete pod -n qfusion-admin <pod-name>


七、建议与注意事项

7.1 event_scheduler 使用建议

  • 默认保持关闭: 集群默认配置为关闭是合理的
  • 按需启用: 仅在需要执行定时任务的节点上手动启用
  • 单点执行: 避免多节点同时执行相同任务
  • 应用层控制: 建议在应用层检测节点角色后再启用
  • 7.2 存储过程/触发器/定时器开发建议

  • 幂等性设计: 确保对象可以被重复创建而不报错

    DROP PROCEDURE IF EXISTS proc_name;
    CREATE PROCEDURE proc_name() ...

  • 声明确定性: 函数应声明 DETERMINISTIC 或 NO SQL

    CREATE FUNCTION func_name() RETURNS INT
    DETERMINISTIC
    READS SQL DATA
    BEGIN ...

  • 避免不确定性操作: 不使用 RAND(), UUID(), NOW() 等不确定函数

  • 7.3 监控建议

    — 监控 MGR 状态
    SELECT * FROM performance_schema.replication_group_member_stats;

    — 监控主备延迟
    SHOW SLAVE STATUS\\G
    — 关注: Seconds_Behind_Master

    — 监控事件执行
    SELECT * FROM information_schema.EVENTS;


    八、配置文件路径汇总

    文件MGR 集群主备集群
    主配置 /etc/mysql/my.cnf /etc/mysql/my.cnf
    只读配置 /etc/mysql/my.ro.cnf /etc/mysql/my.ro.cnf
    MGR配置 /etc/mysql.cnf.d/mgr_group.cnf
    半同步配置 /etc/mysql/ext.semi.cnf
    动态配置 /etc/mysql.cnf.d/config_option.cnf 同左
    扩展配置 /etc/mysql.cnf.d/mysql-expand.conf 同左

    赞(0)
    未经允许不得转载:171主机测评 » MySQL MGR 集群 vs 主备集群对比分析报告
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址