关于在产品环境中使用 MySQL 5.6 GTIDs 的一些问答

jopen 9年前

感谢上星期参加了我全局事务ID(GTIDs)研讨会的所有朋友,其介绍了MySQL 5.6中简单复制的重构。如果你错过了课程,你还可以听录音或下载讲稿(免费)。会上我们收到了很多问题,下面我将在这里试着回答它们。如果需进一步阐述请在评论中让我了解。

Q:在master-master结构中GTID有什么优势?如果有, 它是如何做的?
Q:GTID可以应用到MySQL的ACTIVE ACTIVE MASTER MASTER结构上吗?


A:GTID不会改变MySQL数据备份的本质:比如在配置GTID之后,数据备份同样是异步的;如果向master-master结构上的两个 master写入数据,GTID同样没有写冲突检测机制.GTID的主要优势在于能够很容易的改变数据备份的拓补结构,当连接一个slave节点到新的 master节点时不再需要为了找到正确的binlog的位置而做一些复杂的计算.
在master-master数据备份的结构中可以配置GTID, 相对于基于位置的数据备份,GTID并不没有很多的优势,因为你不会改变数据备份的拓补结构.
GTID同样不推荐在两个master都可接受数据的结构中向两个master都写入数据.

Q:GTIDs在主机:备用主机上运行的好吗?失效备援有多快?

A:是的,GTIDs能够很好的处理这种类型的设置(一个主机一个备机)。GTIDs不提供失效备援,必须使用一个额外的工具才行。失效备援的速度取决于使用的工具。

Q:对于已经建立的MASTER-MASTER/MASTER-SLAVE复制,在GTID设置后,我们需要使用 AUTO POS=1重新建立复制,对吗?

A:是的,使用 MASTER_AUTO_POSITION=1 是需要指出将要使用GTID复制。所以必须运行:STOP SLAVE; CHANGE MASTER TO … MASTER_AUTO_POSITION = 1; START SLAVE;

Q: GTID是怎么处理那些应用的,这些应用拥有来自不同引擎(比如:InnoDB和MyISAM)的数据表?

A: 事务不能同时用于MyISAM和InnoDB表,请参照文档.

Q:在master-slave备份的拓补结构(GTID是可用的)中,如果master节点上的二进制日志被删除,并且使用AUTO_POSITION=1改变了master命令的情况下, slave节点是怎么从master节点上获取数据的?

A: 备份将被中断,并抛出1236错误.

Q: 在slave节点上有什么值表示该节点的数据滞后了?

A: 是用Seconds_Behind_Master表示的.虽然它不是非常可靠.比如你有一个这样的备份序列 A -> B -> C, 在C节点上的Seconds_Behind_Master表示的滞后是相对于B节点,而不是A节点.  

Q: 保存先前的master的GTIDs有何意义呢?这些GTIDs是在show slave status显示的Executed_Gtid_Set中执行的.
A: 新的复制协议保证,当slave连接到它的master的时候,slave将已经执行的一定范围的GTIDs发送给master.然后,master发送所有其他的事务给slave.这就是为什么Executed_Gtid_Set包含了所有已执行的事务的历史信息.

Q: 我们在服务器上使用DB Master和Slave VIPs, 那么mysqlfailover工具也能切换VIP到新的master吗?基于故障恢复的事件,可以脚本化吗?
A: 是的,你可以使用拓展,通过mysqlfailover工具来增加自定义脚本.请查看–exec-before–exec-after相关文档.

Q: mysqlfailover工具如何处理Master和Slaves之间网络不稳定的情况?
A: mysqlfailover工具,只是在它认定master不再存活的情况下,触发故障恢复.所以,在master和slaves之间网络不稳定的情况, 不会影响它对master崩溃的检测.但是,当一个或者多个slave不可到达的情况下,在故障恢复/正常切换时,它会阻止工具重新正确配置复制过程.

Q: 非死book使用MySQL的GTID吗? 如果是的话, 具体是哪个模块,还是所有的呢?
A: 我无法代表非死book发言,但是在今年的MySQL会议的this talk之中,他们暗示在产品中使用GTIDs.他们已经增加了个性化的代码,以便让GTIDs更易于使用.

Q: GTID_SUBSET是MySQL工具包的一部分吗?或者说我们需要写一个脚本来定期的检测它吗? GTID_SUBSET的优势也能体现在ACTIVE ACTIVE MASTER MASTER架构中吗?

Q: 你能确认getid方法是如何得到gitd集合的吗?

A: GTID_SUBSET()是MySQL 5.6的内置功能, 你不需要额外的工具包. 从它能够很容易的知道指定的server的Executed_Gtid_Set是不是另一台server Executed_Gtid_Set的一个子集,所有在任何备份拓补结构中都可以使用它.

Q: HOLE和BUGS之间的区别是什么?

A: 在实现了GTID的MySQL 5.6中是没有漏洞的,如果你遇到了所谓的漏洞,其实它是一个bug.

Q: 使用MySQL工具包, 我们也可以使用一条python命令来安装备份. 它能自动的获得master到slave节点的dump 并且启动备份吗? 如果能, 可以用shell脚本在后台备份300GB的数据吗? 还是它只能在当前位置开始备份不能收集dump信息?

A: 我认为你讨论是的mysqlreplicate. 这个工具有CHANGE MASTER TO模式, 所以它没有任何形式的备份.

Q: mysqlfailover脚本有可能在任何节点(比如slave节点)的任何时间知道当前可用的节点是master还是其他的slave节点吗? 如果不能, 有其他的方法可以做到吗?

A: 你可以用mysqlrplshow.

Q: 正如前面说所,MySQL工具在故障自动转移上存在局限性, 但我想把故障自动转移作为首选项, 我该怎么做呢?

A:如果运行mysqlfailover的节点故障了,故障自动转移的功能就会失效.所有这个节点不是非常可靠. 如果故障自动转移对你很重要,你可以尝试下面的几种方法: 小心监控你的监控节点, 或者使用像Percona Replication manager的解决方法使用Pacemaker, 或是像Percona XtraDB Cluster那样用Galera备份.

Q: 我们可以在slave节点或者其他监控节点上使用mysqlrpladmin failover/switchover命令吗?

A: 可以的, 只要server上安装了mysqlrpladmin, 并且mysqlrpladmin能够连接到数据库, 就可以在任何地方执行这个命令.

Q: 如果我们设置slave为只读…是否建议删除错误事务?

A是的,建议删除。不过这不阻止用户使用SUPER权限在slave上意外写入。

Q:这些错误事务问题可以用 (active-passive) master-master复制阻止吗?

 A:Master-master复制将确保任何事务写入一个服务将自动结束在另一个slave上写入。所以它就像在避免错误事务。不过不建议在两个master上写入,因为你会遇到写冲突。

Q:在MHA上使用GTID有什么实用的优势吗?

A:GTID不提供任何方法执行failover,他们只是简化你怎样重新配置复制。所以使用MHA利用GTID是有意义的。

Q: GUID 和 GTID的区别是什么?什么时候我们必须使用GUID 和 GTID?

A:我不确定我是否正确的理解了这个问题。GTID由源 id 和事务 id 组成。源 id 是master的server_uuid,是当MySQL首次启动时自动生成的 GUID。

Q:怎样检查slave数据库表和记录?我们必须从master到salve数据库同步数据还是自动进行?

A:你可以使用Percona工具包的 pt-table-checksum 和 pt-table-sync。

再次感谢出席研讨会!你可以回放、下载幻灯片,也可以在这里访问Percona的图书馆查看其它MySQL研讨会的记录。