10bet网址
MySQL复制
相关的文档10bet官方网站 下载此节选
PDF(美国高级主任)- 1.5 mb
PDF (A4)- 1.6 mb
HTML下载(TGZ)- 322.5 kb
HTML下载(Zip)- 330.4 kb


2.3.5使用gtid进行故障切换和扩展

在使用带全局事务标识符(gtid)的MySQL复制时,有许多技术可以提供一个新的副本,然后可以用于扩展,并在必要时用于故障转移,将其提升到源。介绍以下技术:

全局事务标识符被添加到MySQL Replication中是为了简化复制数据流的一般管理,特别是故障转移活动。每个标识符唯一地标识组成一个事务的一组二进制日志事件。gtid在将更改应用到数据库方面发挥了关键作用:服务器自动跳过任何具有标识符的事务,该标识符被服务器识别为以前处理过的事务。此行为对于自动复制定位和正确的故障转移至关重要。

标识符和组成给定事务的事件集之间的映射在二进制日志中捕获。这在使用另一个现有服务器的数据配置新服务器时带来了一些挑战。为了重现新服务器上设置的标识符,需要将标识符从旧服务器复制到新服务器,并保持标识符与实际事件之间的关系。这对于恢复在故障转移或切换时作为候选副本立即可用以成为新源的副本是必要的。

简单的复制。在新服务器上重现所有标识符和事务的最简单方法是将新服务器转换为具有整个执行历史的源服务器的副本,并在两台服务器上启用全局事务标识符。看到第2.3.4节,“使用gtid建立复制”,以获取更多资料。

一旦复制启动,新服务器将从源服务器复制整个二进制日志,从而获得关于所有gtid的所有信息。

这种方法简单有效,但需要副本从源读取二进制日志;新副本有时需要相当长的时间才能赶上源文件,因此这种方法不适合快速故障转移或从备份恢复。本节解释如何通过将二进制日志文件复制到新服务器来避免从源获取所有的执行历史记录。

将数据和事务复制到副本。当源服务器之前处理了大量事务时,执行整个事务历史记录可能会很耗时,这可能是设置新副本时的一个主要瓶颈。为了消除这种需求,可以将数据集的快照、二进制日志和源服务器包含的全局事务信息导入到新的副本中。拍摄快照的服务器可以是源服务器,也可以是其副本之一,但是在复制数据之前,必须确保服务器已经处理了所有必需的事务。

此方法有几种变体,区别在于二进制日志中的数据转储和事务传输到副本的方式,如下所述:

数据集
  1. 创建转储文件, mysqldump在源服务器上。设置, mysqldump选项——主数据(默认值为1)来包含一个将复制源更改为|将master更改为带有二进制日志信息的语句。设置——set-gtid-purged选项汽车(默认值)或,以在转储中包含有关已执行事务的信息。然后使用mysql客户端导入转储文件到目标服务器。

  2. 或者,使用原始数据文件创建源服务器的数据快照,然后按照中的说明将这些文件复制到目标服务器第2.2.5节“选择数据快照的方法”.如果你使用InnoDB表,您可以使用mysqlbackup命令从MySQL Enterprise Backup组件生成一个一致的快照。该命令记录要在副本上使用的快照对应的日志名称和偏移量。MySQL企业备份是一个商业产品,包含在MySQL企业订阅中。看到MySQL企业备份简介有关详细信息。

  3. 或者,同时停止源服务器和目标服务器,将源数据目录的内容复制到新副本的数据目录,然后重新启动副本。如果使用此方法,必须将副本配置为基于gtid的复制,换句话说就是使用gtid_mode =对.有关此方法的说明和重要信息,请参见第2.2.8节,“向复制环境中添加副本”

交易历史记录

如果源服务器的二进制日志(即GTID集合)中有完整的事务历史记录@@GLOBAL.gtid_purged为空),您可以使用这些方法。

  1. 将二进制日志从源服务器导入到新的副本mysqlbinlog,与——read-from-remote-server而且——read-from-remote-master选项。

  2. 或者,将源服务器的二进制日志文件复制到副本。您可以使用mysqlbinlog——read-from-remote-server而且——生选项。这些可以通过使用读入副本mysqlbinlog>文件(没有——生选项)将二进制日志文件导出为SQL文件,然后将这些文件传递给mysql客户端进行处理。确保所有二进制日志文件都使用一个mysql进程,而不是多个连接。例如:

    Shell > mysqlbinlog copy -binlog。000001 copied-binlog。000002 | mysql -u root -p

    有关更多信息,请参见使用mysqlbinlog备份二进制日志文件

这种方法的优点是新服务器几乎立即可用;只有那些在重放快照或转储文件时提交的事务仍然需要从现有源中获取。这意味着副本的可用性不是瞬时的,但是副本应该只需要相对较短的时间就可以赶上这些剩余的事务。

提前将二进制日志复制到目标服务器通常比实时从源读取整个事务执行历史要快。然而,由于大小或其他考虑因素,在需要时将这些文件移动到目标可能并不总是可行的。本节中讨论的提供新副本的其余两种方法使用其他方法将有关事务的信息传输到新副本。

注入空事务。源是全局的gtid_executed变量包含源上执行的所有事务的集合。的内容,而不是在获取快照以提供新服务器时复制二进制日志gtid_executed在快照所在的服务器上。在将新服务器添加到复制链之前,只需在新服务器上为源服务器中包含的每个事务标识符提交一个空事务gtid_executed,像这样:

设置GTID_NEXT = ' aaa-bbb-ccc-ddd: N ';开始;提交;设置GTID_NEXT = '自动';

一旦使用空事务以这种方式恢复了所有事务标识符,就必须刷新和清除副本的二进制日志,如下所示,其中N当前二进制日志文件名的非零后缀:

刷新日志;清除二进制日志到'source-bin.00000N”;

您应该这样做,以防止该服务器在稍后将复制流提升到源时,用错误的事务淹没复制流。(刷新日志语句强制创建一个新的二进制日志文件;清除二进制日志清除空事务,但保留它们的标识符。)

此方法创建的服务器本质上是一个快照,但随着它的二进制日志历史记录与复制流的历史记录收敛(即,当它赶上源时),它能够及时成为一个源。这个结果在效果上与使用剩余的供应方法所获得的结果相似,我们将在接下来的几段中讨论。

排除使用gtid_purged的事务。源是全局的gtid_purged变量包含已从源二进制日志中清除的所有事务的集合。与前面讨论的方法一样(参见注入空事务),则可记录的值gtid_executed在快照所在的服务器上(代替将二进制日志复制到新服务器)。与前一种方法不同,不需要提交空事务(或发出空事务)清除二进制日志);相反,您可以设置gtid_purged的值直接在副本上执行gtid_executed在备份或快照所在的服务器上。

与使用空事务的方法一样,此方法创建的服务器在功能上是一个快照,但随着其二进制日志历史与源和其他副本的二进制日志历史收敛,它将及时成为一个源。

恢复GTID模式副本。在恢复遇到错误的基于GTID的复制设置中的副本时,注入空事务可能无法解决问题,因为事件没有GTID。

使用mysqlbinlog查找下一个事务,这可能是事件发生后下一个日志文件中的第一个事务。复制所有内容到提交对于该事务,确保包含设置@@SESSION.gtid_next.即使不使用基于行的复制,也可以在命令行客户端中运行二进制日志行事件。

停止副本并运行您复制的事务。的mysqlbinlog输出将分隔符设置为/ * ! * /;,所以让它后退:

mysql> DELIMITER;

从正确的位置自动重新启动复制:

mysql> SET GTID_NEXT=automatic;mysql> RESET SLAVE;mysql> START SLAVE;MySQL > SET GTID_NEXT=automatic;mysql>:mysql>启动副本