MYSQL5.7 复制模式的概念

MYSQL5.7 复制模式的概念

https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-concepts.html

为了安全的配置复制模式,必须要懂得一些复制的关键概念。这节解释了这些概念并且在修改在线系统之前必须要知道的事情。

用于MYSQL的复制模式依赖于被记录的事务标识符。被复制的事务类型如下所示:

  • GTID事务由GTID标识,它的格式UUID:NUMBER。每一个在日志中记录的GTID事务,都是由 Gtid_log_event开头。GTID事务即可以使用GTID,也可以使用文件名和位置定位。
  • 匿名事务没有GTID,并且MYSQL中的每个匿名事务都以 Anonymous_gtid_log_event 开头记录到日志中。

当使用GTID你能使用auto-positioning功能和自动的失效转移(fail-over),也可以使用WAIT_FOR_EXECUTED_GTID_SET(), session_track_gtids,并且可以使用 Performance Schema 表监控复制。使用GTID时不能使用 sql_slave_skip_counter,而使用空事务代替。

在relay log中的事务,在主服务器上运行时可能没以任何特定事务开头,但是在备机上重放后并被记录到备机上的binary log中后它们会以Anonymous_gtid_log_event开头。

账户拥有SUPER权限可以动态的设置gtid_modeenforce_gtid_consistency 两个变量。在之前的版本中这两个变量只能在服务启动时设置。在所有的版本中 gtid_mode 参数都与是否使用GTID保持一致。当gtid_mode=ON时不可能复制匿名事务,而当gtid_mod=OFF时,只有匿名事务可以被复制。MYSQL5.7.6的gtid_mode变量有两个额外的状态,OFF_PERMISSIVE和ON_PERMISSIVE。当gtid_mode=OFF_PERMISSIVE 时,那么新的事务是匿名的同时,允许复制GTID或匿名事务。当 gtid_mode=ON_PERMISSIVE 时,那么新的事务使用GTID的同时,允许复制GTID或匿名事务。这意味着服务器使用了匿名和GTID两种事务。例如一个主服务器使用了gtid_mode=ON,备机使用gtid_mode=ON_PERMISSIVE。对于gtid_mode的有效值顺序如下:

  • OFF
  • OFF_PERMISSIVE
  • ON_PERMISSIVE
  • ON

改变gtid_mode状态的顺序非常重要,只能按上面的顺序一次一步的改变。例如,如果gtid_mode当前设置成OFF_PERMISSIVE,它可能在下一次改变成OFF或ON_PERMISSIVE,但是不能设置成ON。这为了保证从匿名事务在线改变到GTID事务,能被服务器正确处理。当gtid_mode的模式在ON和OFF之间切换时,GTID的状态(换句话说就是 gtid_executed 的值)是连续的。这确保GTID集已经被服务器应用,无论gtid_mode的值是什么。

作为MYSQL5.7.6改变的一部分,关联到GTID的字段已经被修改,以至于无论gtid_mode当前的值被选择成什么,都能显示正确的信息。这意味着像是在 replication_connection_status Performance Schema表中的gtid_executed, gtid_purged, RECEIVED_TRANSACTION_SET 显示GTID集的字段,和 SHOW SLAVE STATUS 显示相关GTID结果的字段,当没有提供GTID时返回空字符串。当没使用GTID事务时,显示单条GTID的字段现在显示ANONYMOUS。如在 replication_applier_status_by_worker Performance Schema表中的CURRENT_TRANSCTION。

在主服务器上使用gtid_mode=ON提供使用auto-positoning的能力,方法是在配置时使用CHANGE MASTER TO MASTER_AUTO_POSITION = 1;语句。复制的拓扑结构影响是否开启auto-positioning,这个功能依赖于GTID和是否兼容匿名事务。如果auto-positioning开启并且使用了匿名事务,那么会发生错误。强烈建议在使用auto-positioning之前,先确认没有使用匿名事务( see Section 16.1.5.2, “Enabling GTID Transactions Online”)。在主从服务器上gtid_mode和auto-positioning的兼容表如下所示,在表中gtid_mode水平显示的是主服务器,从服务器的gtid_mode垂直显示:

 

MASTER/SLAVE GTID_MODE OFF OFF_PERMISSIVE ON_PERMISSIVE ON
OFF Y Y N N
OFF_PERMISSIVE Y Y Y Y*
ON_PERMISSIVE Y Y Y Y*
ON N N Y Y*

在上面的表中:

  • Y:代表主从服务器的gtid_mode是兼容的。
  • N:代表主从服务器的gtid_mode是不兼容的。
  • *可以使用auto-positioning。

当前选择的gtid_mode同样能影响 gtid_next  变量。下面的表显示了服务器上不同的gtid_mode和gtid_next值的行为:

ON_PERMISSIVENEW GTIDANONYMOUSANONYMOUSUUID:NUMBER

gtid_next AUTOMATIC BINARY LOG ON AUTOMATIC BINARY LOG OFF ANONYMOUS UUID:NUMBER
OFF ANONYMOUS ANONYMOUS ANONYMOUS ERROR
OFF_PERMISSIVE ANONYMOUS ANONYMOUS ANONYMOUS UUID:NUMBER
ON NEW GTID ANONYMOUS ERROR UUID:NUMBER

在上面的表中:

  • ANONYMOUS:产生匿名事务。
  • ERROR:产生错误并且会在执行SET GTID_NEXT时失败。
  • UUID:NUMBER:代一个指定的UUID:NUMBER的GTID。
  • NEW GTID:自动产生一个GTID。

当binary log关闭并且gtid_next设置成AUTOMATIC时,那么没有GTID产生。这个行为和之前的版本一致。

发表回复