全能场馆预订系统源码 多场馆分时段收费,开启场馆智慧运营新模式

核心内容摘要

python之函数
AI Agent根因分析:手把手教你用Dify搭建智能分析系统

PvZ Toolkit 技术指南:从基础到高级的游戏修改实践

目录标题MySQL MGR 集群 vs 主备集群对比分析报告

集群基本信息对比

event_scheduler 使用对比

配置值

配置文件位置

使用说明

同步机制异同点

1 相同点

2 差异点

3 MGR 专用配置文件

4 主备集群半同步配置

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

1 同步原理

2 关键配置参数

3 对象同步验证

4 存储过程创建与验证

4.

1 创建存储过程示例

4.

2 验证同步到从节点

4.

3 完整验证检查清单

5 触发器创建与验证

4.

1 创建触发器示例

4.

2 验证同步到从节点

4.

3 触发器验证检查清单

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

4.

1 创建定时器示例

4.

2 验证同步到从节点

4.

3 定时器验证检查清单

4.

4 定时器生产环境配置建议

7 完整同步验证流程

总结

节点读写状态对比

1 MGR 集群

2 主备集群

配置、检查方法

总结

1 检查 event_scheduler 状态

2 检查节点角色

3 检查复制状态

4 检查对象同步

5 启用 event_scheduler (仅主节点)

6 永久配置修改

建议与

注意事项

1 event_scheduler 使用建议

2 存储过程/触发器/定时器开发建议

3 监控建议

配置文件路径汇总MySQL MGR 集群 vs 主备集群对比分析报告MySQL 版本:

8.

26

集群基本信息对比对比项MGR 集群 (mysql-65cbddad)主备集群 (mysql-a486e45d)集群策略MGRClusterMySQLRWCluster数据库版本mysql

8.

26-mgrmysql

8.

26节点数量3节点 (1主2备)2节点 (1主1备)部署模式多主模式 (单主写入)传统主从复制

event_scheduler 使用对比

配置值MGR 集群: event_scheduler OFF 主备集群: event_scheduler OFF

配置文件位置# /etc/mysql/my.cnf [mysqld] event_scheduler

使用说明event_scheduler 默认关闭原因:避免自动化任务在多个节点重复执行主备/MGR 集群中事件调度器仅需在主节点/PRIMARY节点运行启用方式:-- 方式1: 动态开启 (仅主节点)SETGLOBALevent_schedulerON;-- 方式2: 在配置文件中开启 (需重启)-- 修改 /etc/mysql/my.cnfevent_scheduler1最佳实践:MGR 集群: 仅在 PRIMARY 节点开启SECONDARY 节点保持关闭主备集群: 仅在 Master 节点开启Slave 节点保持关闭通过应用程序检测节点角色后再开启或由运维手动管理

同步机制异同点

1 相同点配置项MGR 集群主备集群说明binlog_formatROWROW行级复制MGR强制要求gtid_modeONON使用GTID全局事务IDenforce_gtid_consistencyONON强制GTID一致性log_slave_updatesONON从库记录中继日志到binlogbinlog_row_imageFULLFULL记录完整行镜像slave_parallel_typeLOGICAL_CLOCKLOGICAL_CLOCK并行复制类型slave_parallel_workers1616并行复制线程数slave_preserve_commit_orderONON保持事务提交顺序

2 差异点配置MGR 集群主备集群说明复制机制Group ReplicationBinlog半同步复制核心差异group_replication_group_seedsmysql-65cbddad00-headless:33061,…无MGR组成员发现transaction_write_set_extractionXXHASH64XXHASH64写集提取算法半同步复制不使用使用 rpl_semi_sync_master主备专用

3 MGR 专用配置文件文件:/etc/mysql.cnf.d/mgr_group.cnf[mysqld] report_host

245.

0.

201 loose-group_replication_local_address

245.

0.

201:33061 loose-group_replication_group_seedsmysql-65cbddad00-headless:33061,... loose-group_replication_gtid_assignment_block_size

1

4 主备集群半同步配置文件:/etc/mysql/ext.semi.cnf# 半同步复制插件 loose-rpl_semi_sync_master_enabled1 loose-rpl_semi_sync_master_timeout1000 loose-rpl_semi_sync_master_wait_no_slaveOFF loose-rpl_semi_sync_master_wait_for_slave_count1 loose-rpl_semi_sync_master_wait_pointAFTER_SYNC loose-rpl_semi_sync_slave_enabled1

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

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

2 关键配置参数log_bin_trust_function_creatorsMGR 集群: log_bin_trust_function_creators OFF 主备集群: log_bin_trust_function_creators OFF 配置文件中: log_bin_trust_function_creators1 (实际已启用)此参数控制是否信任存储函数创建者OFF: 创建存储函数/触发器需要 SUPER 权限或 DETERMINISTIC/NO SQL 声明ON: 允许创建任意存储函数

3 对象同步验证--

查看存储过程SELECTROUTINE_NAME,ROUTINE_TYPEFROMinformation_schema.ROUTINESWHEREROUTINE_SCHEMAyour_db;--

查看触发器SELECTTRIGGER_NAME,EVENT_MANIPULATIONFROMinformation_schema.TRIGGERSWHERETRIGGER_SCHEMAyour_db;--

查看事件/定时器SELECTEVENT_NAME,STATUS,EXECUTE_ATFROMinformation_schema.EVENTSWHEREEVENT_SCHEMAyour_db;

4 存储过程创建与验证

4.

1 创建存储过程示例-- 在主节点 (PRIMARY/Master) 执行USEtest_db;-- 删除已存在的存储过程幂等性设计DROPPROCEDUREIFEXISTSsp_sample_process;-- 创建存储过程DELIMITER//CREATEPROCEDUREsp_sample_process()DETERMINISTICREADSSQLDATABEGINSELECTCOUNT(*)AStable_countFROMinformation_schema.TABLESWHERETABLE_SCHEMAtest_db;END//DELIMITER;-- 验证创建成功SHOWPROCEDURESTATUSWHEREDbtest_dbANDNamesp_sample_process;

4.

2 验证同步到从节点#

获取 GTID 位置主节点kubectlexec-it -n qfusion-adminprimary-pod-c mysql -- mysql -u root -p -e SELECT GLOBAL.GTID_EXECUTED; #

检查从节点 GTID 是否一致kubectlexec-it -n qfusion-adminsecondary-pod-c mysql -- mysql -u root -p -e SELECT GLOBAL.GTID_EXECUTED; SHOW SLAVE STATUS\G #

在从节点验证存储过程已同步kubectlexec-it -n qfusion-adminsecondary-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; #

查看存储过程定义确认代码一致kubectlexec-it -n qfusion-adminsecondary-pod-c mysql -- mysql -u root -p -e SHOW CREATE PROCEDURE test_db.sp_sample_process\G

4.

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

5 触发器创建与验证

4.

1 创建触发器示例-- 在主节点 (PRIMARY/Master) 执行USEtest_db;-- 创建测试表DROPTABLEIFEXISTSt_audit_log;CREATETABLEt_audit_log(idBIGINTAUTO_INCREMENTPRIMARYKEY,table_nameVARCHAR(

,actionVARCHAR(

,old_value JSON,new_value JSON,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);DROPTABLEIFEXISTSt_users;CREATETABLEt_users(idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(

,emailVARCHAR(

,updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP);-- 删除已存在的触发器DROPTRIGGERIFEXISTStr_users_after_update;-- 创建触发器记录更新操作DELIMITER//CREATETRIGGERtr_users_after_updateAFTERUPDATEONt_usersFOR EACH ROWBEGININSERTINTOt_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;-- 验证创建成功SHOWTRIGGERSLIKEt_users;

4.

2 验证同步到从节点#

在主节点测试触发器kubectlexec-it -n qfusion-adminprimary-pod-c mysql -- mysql -u root -p test_db -e INSERT INTO t_users (username, email) VALUES (user1, user1test.com); UPDATE t_users SET email newemailtest.com WHERE username user1; SELECT * FROM t_audit_log ORDER BY id DESC LIMIT 1; #

检查从节点同步状态kubectlexec-it -n qfusion-adminsecondary-pod-c mysql -- mysql -u root -p -e SHOW SLAVE STATUS\G |grep-ESlave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master#

在从节点验证触发器定义已同步kubectlexec-it -n qfusion-adminsecondary-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; #

查看触发器详细定义kubectlexec-it -n qfusion-adminsecondary-pod-c mysql -- mysql -u root -p -e SHOW CREATE TRIGGER test_db.tr_users_after_update\G #

验证数据已同步注意从节点不会再次执行触发器kubectlexec-it -n qfusion-adminsecondary-pod-c mysql -- mysql -u root -p test_db -e SELECT * FROM t_users; SELECT * FROM t_audit_log;

4.

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

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

4.

1 创建定时器示例-- 在主节点 (PRIMARY/Master) 执行USEtest_db;-- 先启用事件调度器仅主节点SETGLOBALevent_schedulerON;-- 验证调度器已启动SHOWVARIABLESLIKEevent_scheduler;-- 删除已存在的事件DROPEVENTIFEXISTSev_cleanup_old_logs;-- 创建定时清理任务每分钟执行一次DELIMITER//CREATEEVENT ev_cleanup_old_logsONSCHEDULE EVERY1MINUTESTARTSCURRENT_TIMESTAMPDOBEGINDECLARErows_deletedINTDEFAULT0;-- 清理30天前的审计日志DELETEFROMt_audit_logWHEREcreated_atDATE_SUB(NOW(),INTERVAL30DAY)LIMIT1000;SETrows_deletedROW_COUNT();-- 记录执行日志可选INSERTINTOt_audit_log(table_name,action,new_value)VALUES(event_scheduler,cleanup,JSON_OBJECT(deleted_rows,rows_deleted));END//DELIMITER;-- 验证事件创建并查看状态SELECTEVENT_NAME,STATUS,EXECUTE_AT,INTERVAL_VALUE,INTERVAL_FIELDFROMinformation_schema.EVENTSWHEREEVENT_SCHEMAtest_dbANDEVENT_NAMEev_cleanup_old_logs;-- 启用事件默认创建后即启用ALTEREVENT ev_cleanup_old_logsENABLE;

4.

2 验证同步到从节点#

检查从节点事件定义是否同步kubectlexec-it -n qfusion-adminsecondary-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; #

验证从节点 event_scheduler 状态应为 OFFkubectlexec-it -n qfusion-adminsecondary-pod-c mysql -- mysql -u root -p -e SELECT event_scheduler; #

查看从节点事件详情kubectlexec-it -n qfusion-adminsecondary-pod-c mysql -- mysql -u root -p -e SHOW CREATE EVENT test_db.ev_cleanup_old_logs\G #

等待1分钟后检查主节点执行结果kubectlexec-it -n qfusion-adminprimary-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; #

验证从节点数据已同步但事件未在从节点执行kubectlexec-it -n qfusion-adminsecondary-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.

3 定时器验证检查清单检查项命令预期结果主节点调度器SELECT event_schedulerON从节点调度器SELECT event_schedulerOFF重要事件定义同步SHOW EVENTS能查到 ev_cleanup_old_logs事件状态SELECT * FROM information_schema.EVENTSSTATUSENABLED主节点执行检查 t_audit_log有执行记录从节点数据检查 t_audit_log数据已同步但非本地执行

4.

4 定时器生产环境配置建议-- 生产环境建每天凌晨2点执行DROPEVENTIFEXISTSev_cleanup_old_logs;DELIMITER//CREATEEVENT ev_cleanup_old_logsONSCHEDULE EVERY1DAYSTARTS CONCAT(CURDATE()INTERVAL1DAY, 02:00:

ONCOMPLETION PRESERVEDOBEGINDELETEFROMt_audit_logWHEREcreated_atDATE_SUB(NOW(),INTERVAL90DAY)LIMIT10000;END//DELIMITER;-- 查看所有事件状态SELECTEVENT_NAME,STATUS,LAST_EXECUTED,ON_COMPLETION,INTERVAL_VALUE,INTERVAL_FIELDFROMinformation_schema.EVENTSWHEREEVENT_SCHEMAtest_db;

7 完整同步验证流程

总结#!/bin/bash# 完整的对象同步验证脚本NAMESPACEqfusion-adminPRIMARY_PODprimary-pod-nameSECONDARY_PODsecondary-pod-nameDB_USERrootDB_PASSpasswordDB_NAMEtest_dbecho

检查复制状态 kubectlexec-it -n$NAMESPACE$SECONDARY_POD-c mysql -- mysql -u$DB_USER-p$DB_PASS-e SHOW SLAVE STATUS\G |grep-ESlave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Last_Errorecho-e\n

验证存储过程同步 kubectlexec-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

验证触发器同步 kubectlexec-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

验证定时器同步 kubectlexec-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

验证 GTID 一致性 echo主节点 GTID:kubectlexec-it -n$NAMESPACE$PRIMARY_POD-c mysql -- mysql -u$DB_USER-p$DB_PASS-e SELECT GLOBAL.GTID_EXECUTED; echo从节点 GTID:kubectlexec-it -n$NAMESPACE$SECONDARY_POD-c mysql -- mysql -u$DB_USER-p$DB_PASS-e SELECT GLOBAL.GTID_EXECUTED; echo-e\n

检查 event_scheduler 状态 echo主节点:kubectlexec-it -n$NAMESPACE$PRIMARY_POD-c mysql -- mysql -u$DB_USER-p$DB_PASS-e SELECT event_scheduler; echo从节点:kubectlexec-it -n$NAMESPACE$SECONDARY_POD-c mysql -- mysql -u$DB_USER-p$DB_PASS-e SELECT event_scheduler;

节点读写状态对比

1 MGR 集群节点角色super_read_onlyread_only说明mysql-65cbddad

PRIMARY00可读写mysql-65cbddad

SECONDARY11只读mysql-65cbddad

SECONDARY11只读

2 主备集群节点角色super_read_onlyread_only说明mysql-a486e45d

Master00可读写mysql-a486e45d

Slave10只读注意:主备集群的 Slave 节点read_only1由配置文件/etc/mysql/ext.semi.cnf设置。

配置、检查方法

总结

1 检查 event_scheduler 状态SHOWVARIABLESLIKEevent_scheduler;-- 或SELECTevent_scheduler;

2 检查节点角色-- MGR 集群SELECTMEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLEFROMperformance_schema.replication_group_members;-- 主备集群SHOWSLAVESTATUS\G

3 检查复制状态-- MGR 集群SHOWVARIABLESLIKEgroup_replication%;-- 主备集群SHOWSLAVESTATUS\GSHOWMASTERSTATUS;

4 检查对象同步-- 检查 GTID 执行情况SHOWVARIABLESLIKEgtid%;SELECTGLOBAL.GTID_EXECUTED;-- 检查 binlog 位置SHOWMASTERSTATUS;

5 启用 event_scheduler (仅主节点)-- MGR 集群 - 在 PRIMARY 节点执行SETGLOBALevent_schedulerON;-- 主备集群 - 在 Master 节点执行SETGLOBALevent_schedulerON;

6 永久配置修改# 编辑配置文件kubectlexec-it -n qfusion-adminpod-name-c mysql --vi/etc/mysql/my.cnf# 修改 event_scheduler0 为 event_scheduler1# 然后重启 Podkubectl delete pod -n qfusion-adminpod-name

建议与

注意事项

1 event_scheduler 使用建议默认保持关闭: 集群默认配置为关闭是合理的按需启用: 仅在需要执行定时任务的节点上手动启用单点执行: 避免多节点同时执行相同任务应用层控制: 建议在应用层检测节点角色后再启用

2 存储过程/触发器/定时器开发建议幂等性设计: 确保对象可以被重复创建而不报错DROPPROCEDUREIFEXISTSproc_name;CREATEPROCEDUREproc_name()...声明确定性: 函数应声明 DETERMINISTIC 或 NO SQLCREATEFUNCTIONfunc_name()RETURNSINTDETERMINISTICREADSSQLDATABEGIN...避免不确定性操作: 不使用 RAND(), UUID(), NOW() 等不确定函数

3 监控建议-- 监控 MGR 状态SELECT*FROMperformance_schema.replication_group_member_stats;-- 监控主备延迟SHOWSLAVESTATUS\G-- 关注: Seconds_Behind_Master-- 监控事件执行SELECT*FROMinformation_schema.EVENTS;

配置文件路径汇总文件MGR 集群主备集群主配置/etc/mysql/my.cnf/etc/mysql/my.cnf只读配置/etc/mysql/my.ro.cnf/etc/mysql/my.ro.cnfMGR配置/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同左

别揉我胸…啊…嗯~喷水了日本-别揉我胸…啊…嗯~喷水了日本应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123