一、pseudo-gtid 原理解析
在开始配置之前,先简单理解 pseudo-gtid 的工作原理:
- 定期注入唯一标记:在 mysql 的 binlog 中定期插入一个全局唯一的 sql 语句
- 作为定位锚点:这些标记成为 binlog 中的"坐标点",orchestrator 可以通过它们快速定位数据同步位置
- 无需开启 gtid:在传统复制模式下,也能实现类似 gtid 的自动定位能力
二、配置步骤详解
2.1 第一步:创建元数据库(所有节点)
首先在每个 mysql 实例上创建用于存放伪 gtid 相关对象的数据库:
-- 登录 mysql(所有节点:192.168.56.80、61、60) mysql -uroot -p -- 创建 meta 数据库(如果不存在) create database if not exists meta;
2.2 第二步:创建 pseudo-gtid 事件(所有节点)
这是最核心的步骤,需要创建一个定时事件来定期注入伪 gtid 标记:
-- 切换到 meta 数据库
use meta;
-- 确保事件调度器已开启
set global event_scheduler = on;
-- 创建伪 gtid 注入事件
delimiter $$
create event if not exists create_pseudo_gtid_event
on schedule every 10 second
starts current_timestamp
on completion preserve
enabled
comment 'inject pseudo-gtid markers for orchestrator'
do
begin
declare lock_result int;
-- 获取锁,确保同一时间只有一个会话执行注入
select get_lock('pseudo_gtid_lock', 0) into lock_result;
if lock_result = 1 then
-- 执行一个会产生 binlog 事件的语句
-- drop view 即使视图不存在也会记录 binlog
drop view if exists `meta`.`pseudo_gtid_view`;
-- 释放锁
do release_lock('pseudo_gtid_lock');
end if;
end$$
delimiter ;
2.3 第三步:验证事件创建成功
-- 查看事件是否创建成功
show events from meta\g
-- 查看事件调度器状态(应为 on)
show variables like 'event_scheduler';
-- 查看事件的具体定义
select
event_name,
status,
starts,
interval_value,
interval_field,
execute_at
from information_schema.events
where event_schema = 'meta';
2.4 第四步:配置 mysql 持久化
为了确保重启后配置依然有效,需要将相关配置写入 my.cnf:
# 编辑 mysql 配置文件 vim /etc/my.cnf # 添加以下配置 [mysqld] # 确保事件调度器开机自启 event_scheduler = on # 可选:优化 binlog 格式 binlog_format = row # 推荐使用 row 格式 binlog_rows_query_log_events = on # 记录原始 sql,便于调试
重启 mysql 使配置生效:
systemctl restart mysqld # 验证重启后事件调度器状态 mysql -e "show variables like 'event_scheduler';"
2.5 第五步:验证 pseudo-gtid 是否正常工作
方法一:直接查看 binlog 内容
# 找到最新的 binlog 文件 mysql -e "show master status\g" # 查看 binlog 中的 pseudo-gtid 标记 mysqlbinlog /var/lib/mysql/mysql-bin.000001 | grep -a 3 -b 3 "drop view" | head -20
你应该能看到类似这样的输出:
# at 12345678 #230101 10:00:00 server id 1113306 end_log_pos 12345689 query thread_id=123 exec_time=0 error_code=0 set timestamp=1704070800/*!*/; drop view if exists `meta`.`pseudo_gtid_view`/*!*/;
方法二:通过 orchestrator 验证
# 使用 orchestrator-client 查看集群拓扑 orchestrator-client -c topology -i 192.168.56.80:3306 # 在 orchestrator 日志中查看伪 gtid 相关信息 tail -f /var/log/orchestrator.log | grep -i pseudo
三、高级配置选项
3.1 多语句 pseudo-gtid 模式
如果希望 pseudo-gtid 标记更明显,可以使用复合语句:
delimiter $$
create event if not exists create_pseudo_gtid_event_advanced
on schedule every 10 second
starts current_timestamp
on completion preserve
enabled
do
begin
declare lock_result int;
declare pseudo_gtid_value varchar(50);
-- 生成一个唯一值
set pseudo_gtid_value = concat('pseudo_gtid_', unix_timestamp(), '_', rand());
select get_lock('pseudo_gtid_lock', 0) into lock_result;
if lock_result = 1 then
-- 创建一个包含唯一值的注释和 drop view 语句
set @pseudo_gtid_sql = concat('/* ', pseudo_gtid_value, ' */ drop view if exists `meta`.`pseudo_gtid_view`');
prepare stmt from @pseudo_gtid_sql;
execute stmt;
deallocate prepare stmt;
do release_lock('pseudo_gtid_lock');
end if;
end$$
delimiter ;
3.2 监控 pseudo-gtid 健康状况
创建监控脚本 /usr/local/bin/check_pseudo_gtid.sh:
#!/bin/bash
# 检查事件是否存在且启用
mysql_cmd="mysql -uroot -pyourpassword -e"
event_status=$($mysql_cmd "show events from meta like 'create_pseudo_gtid_event'" 2>/dev/null | grep enabled)
if [ -z "$event_status" ]; then
echo "error: pseudo-gtid event is not enabled or missing"
exit 1
fi
# 检查最近是否有注入
last_inject=$($mysql_cmd "select max(str_to_date(event_time, '%y%m%d %h:%i:%s'))
from (select substring_index(substring_index(event_time, '# at', -1), ' ', 2) as event_time
from mysql.general_log where argument like '%drop view%' limit 100) t" 2>/dev/null)
current_time=$(date +%s)
last_inject_time=$(date -d "$last_inject" +%s)
if [ $((current_time - last_inject_time)) -gt 30 ]; then
echo "warning: no pseudo-gtid injection in last 30 seconds"
exit 2
fi
echo "ok: pseudo-gtid is working properly"
exit 0
四、orchestrator 配置文件调整
确保 orchestrator.conf.json 中包含正确的 pseudo-gtid 配置:
{
"autopseudogtid": true,
"pseudogtidpattern": "drop view if exists `meta`.`pseudo_gtid_view`",
"pseudogtidpatternisfixedsubstring": true,
"pseudogtidmonotonichint": "order:asc",
"detectpseudogtidquery": "select max(substring_index(substring_index(event_time, '# at', -1), ' ', 2)) as pseudo_gtid from mysql.general_log where argument like '%drop view if exists `meta`.`pseudo_gtid_view`%'",
"recovermasterbinlogfilelocation": true,
"recovermasterclusterfilters": ["*"],
"instancepollseconds": 5
}
五、常见问题排查
5.1 事件未执行
现象:pseudo-gtid 标记没有在 binlog 中出现
排查步骤:
-- 检查事件状态
select
event_name,
status,
last_executed,
last_altered
from information_schema.events
where event_schema = 'meta';
-- 手动执行事件测试
call meta.create_pseudo_gtid_event();
-- 查看是否有锁冲突
show processlist;
select * from performance_schema.metadata_locks;
5.2 权限问题
现象:orchestrator 无法识别 pseudo-gtid 标记
解决方案:
-- 确保监控用户有足够的权限 grant drop on meta.* to 'orch_topology_user'@'192.168.56.%'; grant select on mysql.general_log to 'orch_topology_user'@'192.168.56.%'; flush privileges; -- 如果不想开启 general_log,可以授予对 binlog 的访问权限 grant replication client on *.* to 'orch_topology_user'@'192.168.56.%';
5.3 性能影响评估
pseudo-gtid 对性能的影响极小,但可以通过以下方式监控:
-- 查看事件执行耗时
select
event_name,
avg_exec_time,
max_exec_time,
count_exec
from performance_schema.events_statements_summary_by_account_by_event_name
where event_name like '%create_pseudo_gtid_event%';
-- 查看 binlog 增长速度
show master status;
-- pseudo-gtid 每10秒产生约 200-300 字节的 binlog 事件
-- 每天约增加 2-3 mb,影响可忽略不计
六、最佳实践建议
注入频率选择:
- 默认 10 秒是平衡点,故障转移速度和性能影响的最佳实践
- 对延迟敏感的业务可以调整为 5 秒
- 超大集群可以适当延长到 15-20 秒
监控告警配置:
# 添加 crontab 监控 */5 * * * * /usr/local/bin/check_pseudo_gtid.sh > /dev/null 2>&1
版本升级注意事项:
- mysql 小版本升级不会影响已配置的事件
- 主从切换后,事件会在新主库上继续运行
- 建议在事件定义中使用
if not exists,避免重复创建
备份恢复考虑:
-- 导出事件定义作为备份 mysqldump --events --no-data meta > meta_events_backup.sql
总结
通过以上配置,mysql 5.7 就成功开启了 pseudo-gtid 功能。这将让 orchestrator 在不开启原生 gtid 的情况下,依然能够实现接近 gtid 的自动化故障转移能力。
最后验证清单:
- 所有节点都创建了 meta 数据库
- 所有节点的事件调度器已开启
- 所有节点的 pseudo-gtid 事件已创建并启用
- 监控用户有 drop 权限
- 至少观察到一个 pseudo-gtid 标记写入 binlog
- orchestrator 配置文件已更新
如果遇到任何问题,建议先从验证 binlog 中的 pseudo-gtid 标记开始排查。
到此这篇关于mysql5.7配置pseudo-gtid完整步骤的文章就介绍到这了,更多相关mysql5.7配置pseudo-gtid内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论