基于GTID主从复制,如何让MariaDB主动推送最新GTID?
实现MariaDB主动通知最新GTID的方案
一、基于事件调度器的主动推送方案
MariaDB自带事件调度器,可定期触发任务,结合自定义逻辑实现最新GTID的主动通知,替代轮询方式。
1. 启用事件调度器
先确保调度器处于开启状态:
SET GLOBAL event_scheduler = ON; -- 永久生效需修改my.cnf配置文件,添加event_scheduler=ON
2. 创建自定义函数封装GTID获取逻辑
主库和从库的GTID获取路径不同,用函数统一处理:
DELIMITER // CREATE FUNCTION get_latest_gtid() RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE gtid_str VARCHAR(255); -- 通过进程判断角色:主库存在Binlog Dump线程,从库存在Slave相关线程 IF EXISTS(SELECT 1 FROM information_schema.processlist WHERE COMMAND = 'Binlog Dump') THEN SET gtid_str = @@GLOBAL.gtid_current_pos; ELSEIF EXISTS(SELECT 1 FROM information_schema.processlist WHERE COMMAND LIKE 'Slave%') THEN SET gtid_str = @@GLOBAL.gtid_slave_pos; ELSE SET gtid_str = '未处于复制架构中'; END IF; RETURN gtid_str; END // DELIMITER ;
3. 创建事件触发通知逻辑
根据需求选择以下两种方式:
方式1:调用外部脚本推送
依赖lib_mysqludf_sys插件(需提前安装),调用自定义脚本将GTID推送到监控系统或消息队列:
DELIMITER // CREATE EVENT notify_gtid_event ON SCHEDULE EVERY 10 SECOND -- 可根据实时性需求调整间隔 DO BEGIN SET @latest_gtid = get_latest_gtid(); -- 调用外部脚本,传递GTID参数 SELECT sys_exec(CONCAT('/usr/bin/python3 /opt/scripts/notify_gtid.py ', @latest_gtid)); END // DELIMITER ;
示例notify_gtid.py脚本:
import sys import requests gtid = sys.argv[1] # 示例:发送到内部监控API requests.post('http://your-monitor-internal/gtid/update', data={'gtid': gtid}) # 或写入本地日志文件 with open('/var/log/mariadb_gtid.log', 'a') as f: f.write(f"{gtid}\n")
方式2:通过HTTP UDF直接推送
安装lib_mysqludf_http插件后,无需外部脚本即可直接发送HTTP请求:
DELIMITER // CREATE EVENT notify_gtid_http ON SCHEDULE EVERY 10 SECOND DO BEGIN SET @latest_gtid = get_latest_gtid(); SELECT http_post('http://your-monitor-internal/gtid/update', CONCAT('gtid=', @latest_gtid)); END // DELIMITER ;
二、基于复制事件的实时触发方案
若对实时性要求极高,可通过监听事务提交事件触发通知,但需注意:触发器无法直接获取GTID,需结合binlog解析或在事务提交后通过事件调度器补充触发。这种方式仅在有数据变更时触发,适合低写入量但需实时感知GTID的场景。
三、注意事项
- 确保MariaDB账号拥有创建事件、函数的权限,以及调用UDF的权限。
lib_mysqludf_sys和lib_mysqludf_http插件需从可信渠道安装,避免安全风险。- 事件调度间隔需平衡实时性与服务器负载,短间隔会增加CPU消耗。
- 从库若需获取已接收但未应用的GTID,可查询
SHOW SLAVE STATUS中的Retrieved_Gtid_Set字段。
内容的提问来源于stack exchange,提问作者programZhuang
相关产品推荐
相关产品推荐

