GTID模式解说
发布时间:2022-07-01 10:18 所属栏目:115 来源:互联网
导读:从MySQL5.6开始增加了强大的GTID(Global Transaction ID,全局事务ID)这个特性,用来强化数据库的主备一致性, 故障恢复, 以及容错能力。用于取代过去传统的主从复制(即:基于binlog和position的异步复制)。 基于GTID复制的优点: 1、根据传统的复制原
从MySQL5.6开始增加了强大的GTID(Global Transaction ID,全局事务ID)这个特性,用来强化数据库的主备一致性, 故障恢复, 以及容错能力。用于取代过去传统的主从复制(即:基于binlog和position的异步复制)。 基于GTID复制的优点: 1、根据传统的复制原理,当连接发生故障时,需要重新连接到master主机,需要找到binlog和position,然后change master to 连接到master主机,此过程需要人工来做,比较麻烦,也容易出错,尤其是master写操作较多时,更不容易确定position,如果flush table with read lock,势必会影响到线上业务。而GTID复制方式不需要找master的binlog和position,只需要知道master的ip、端口、账号密码,即可进行复制,MySQl会通过内部机制自动找点同步(MASTER_AUTO_POSITION=1) 简单来说就是:简化复制。传统复制是基于file和position来实现的,而file和position是人为确定的,file还好一些,但是position却是实时变动的,难以确定,除非对全库加读锁,但这势必会对线上业务产生影响,GTID会自动找position进行数据同步 2、多线程复制(基于库),在MySQL5.6以前的版本,slave的复制是单线程的。一个事件一个事件的读取应用。而master是并发写入的,所以延迟是避免不了的。唯一有效的方法是把多个库放在多台slave,这样又有点浪费服务器。在MySQL5.6里面,我们可以把多个表放在多个库,这样就可以使用多线程复制,当只有1个库,多线程复制是没有用的(即:所谓的并行复制) 简单来说就是:跟多线程复制相关。多线程复制是基于组提交方式实现的,而组提交信息是存储在GTID中的 GTID的作用: 1、根据GTID可以知道事务最初是在哪个实例上提交的 2、GTID的存在方便了Replication的Failover GTID复制实现的工作原理: 1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中 2、slave端的I/O线程将变更的binlog,写入到本地的relay log中 3、SQL线程从relay log中获取GTID,然后对比slave端的binlog是否有记录(所以MySQL5.6 slave端必须开启binlog) 4、如果有记录,说明该GTID的事务已经执行,slave会忽略 5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog 6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描 GTID使用限制: 1、 MySQL5.7之后才开始支持动态切换GTID相关的参数 2、 不支持CREATE TABLE ... SELECT statements 3、 不支持CREATE TEMPORARY TABLE statements inside transactions 4、 transaction or statement 既更新了事务表又更新了非事务表 5、 使用GTID复制从库跳过错误时,不支持执行sql_slave_skip_counter参数的语法 以下内容是笔者从博客、论坛等收集的资料,不保证正确性,仅供参考: 1、gtid_executed 在当前实例上执行过的GTID集合,实际上包含了所有记录到binlog中的事务。所以,设置set sql_log_bin=0后执行的事务不会生成binlog事件,也不会被记录到gtid_executed中。执行reset master可以将该变量清空 2、gtid_purged binlog不可能永久停留在服务器上,需要进行定期清理(如通过expire_logs_days),否则迟早它会把磁盘空间用完。gtid_purged用于记录已经被清除了的binlog事务集合,它是gtid_executed的子集。只有gtid_executed为空时才能手动设置该变量,此时会同时更新gtid_executed为和gtid_purged相同的值。gtid_executed为空意味着要么之前没有启动过基于GTID的复制,要么执行过reset master。执行reset master时同样也会把gtid_purged置空,即始终保持gtid_purged是gtid_executed的子集。 (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读