关于mysql:分布式恢复进阶篇
1. 概述:每当一个MySQLserver新退出或者重新加入一个MGR集群时,它都必须追平集群内相差的事务,保障这个节点的数据和集群内最新的数据是同步的。这个新退出集群的节点在追平集群中的数据或者重新加入集群的节点追评它脱离集群后到当初这段时间内相差的事务数据的过程称为分布式复原。 申请加入集群的节点首先查看groupreplicationapplier通道中的中继日志,查看该节点目前尚未从集群中同步过去的事务数据。如果是重新加入集群的节点,则该节点会找到在来到集群后到当初和集群最新数据中未回放的事务数据,在这种状况下,该节点首先会利用这些未同步的事务。对于新退出集群的节点,间接从一个疏导节点上进行全量数据恢复即可。 尔后,新退出的节点和集群中现有的online状态的节点(疏导节点)建设连贯进行状态转移。新退出的节点从集群中的疏导节点中同步退出集群之前或者来到集群后到当初未同步过去的数据,这些相差的事务由集群中的疏导节点提供。接下来,新退出的节点利用从集群中的疏导节点同步过去的未进行利用的事务。此时申请加入集群的节点将利用在状态传输过程中集群内新事务写入的数据。(此时集群内新事物写入的数据临时寄存在缓存队列中,并未将数据写入磁盘中)实现此过程后,新退出的节点的数据和整个集群的数据相比,处于一个追平的状态,并且该节点设置为online状态。 留神:新退出集群的节点,不论是之前有没有在此集群中,都会先随机选一个online节点先同步该节点和集群相差的事务。 组复制在分布式复原期间用下述办法实现状态传输: 应用克隆插件的性能进行近程克隆操作,该插件可从MySQL 8.0.17开始反对。要应用这种办法,必须在疏导节点和新退出的节点上提前装置克隆插件。组复制会主动配置所需的克隆插件设置,并治理近程克隆操作。 从疏导节点的二进制日志复制数据并在新退出的节点上利用这些事务。此办法须要在疏导节点和退出节点之间建设的名为groupreplicationrecovery的规范异步复制通道。 在退出节点上执行STARTGROUP_REPLICATION后,组复制会主动抉择上述办法的最佳组合进行状态转移。为此,组复制将会查看集群中哪些现有节点适宜用作疏导节点,退出节点须要疏导节点传输多少事务,以及是否有事务不再存在于集群中任意节点的二进制日志文件中。如果退出节点与疏导节点之间的事务差距很大,或者如果某些要求的事务不在疏导节点的二进制日志文件中,则组复制将通过近程克隆操作开始分布式复原。如果没有较大的事务间隙,或者未装置克隆插件,则组复制将间接从疏导节点的二进制日志进行状态转移。 在近程克隆操作期间,将删除退出节点上的现有数据,并用疏导节点数据的正本替换。当近程克隆操作实现并且新退出节点已重新启动时,将继续执行来自疏导节点二进制日志来进行状态转移,以获取在进行近程克隆操作时集群所写入的增量数据。 在从疏导节点的二进制日志进行状态转移期间,新退出节点从疏导节点的二进制日志中复制并利用所需的事务,并在收到事务时利用事务,直到二进制日志记录新退出节点退出了集群。(当退出节点胜利退出集群时,二进制日志中会记录对应的视图更改event)在此过程中,退出节点将缓冲该集群利用的新事务数据。从二进制日志的状态传输实现后,新退出节点将利用缓冲的事务。 当退出节点与该集群的所有事务放弃最新时,该节点将在设置为online状态并能够作为一般节点退出集群,并且分布式复原已实现。 ps:从二进制日志进行状态转移是组复制进行分布式复原的根本机制,并且如果未将复制组中的疏导节点和退出节点设置为反对克隆。因为从二进制日志进行状态转移是基于经典的异步复制,因而,如果退出该集群的MySQL server基本没有该集群的数据,或者从十分旧的备份中获取了数据,则可能要花费很长时间来复原最新数据。因而,在这种状况下,倡议在将MySQL server增加到集群之前,则应通过传输集群中已有节点的相当近期的快照来应用集群的数据对其进行设置。这能够最大水平地缩小分布式复原所需的工夫,并缩小对疏导节点的影响,因为疏导节点必须保留和传输较少的二进制日志文件。 2. 分布式复原的连贯:当退出节点连贯到现有节点中的疏导节点进行分布式复原期间的状态转移时,退出节点充当客户端,而疏导节点充当服务端。当通过此连贯(应用异步复制通道groupreplicationrecovery)从疏导节点的二进制日志进行状态转移时,退出节点充当正本,疏导节点充当源端。通过此连贯进行近程克隆操作时,新退出节点充当全量数据接收者,疏导节点充当全量数据提供者。利用于组复制上下文之外的角色的配置设置也能够利用于组复制,除非它们被特定于组复制的配置设置或行为所笼罩。 现有节点提供给新退出节点以进行分布式复原的连贯与组复制用于集群内节点之间的通信的连贯是不同的。 组通信引擎用于组复制(XCom,Paxos变体),用于近程XCom实例之间的TCP通信的连贯由groupreplicationlocal_address零碎变量指定。此连贯用于集群内online节点之间的TCP / IP消息传递。与本地实例的通信是通过应用内存内共享的传输通道进行的。 对于分布式复原,直到MySQL8.0.20为止,集群内的节点都将其规范SQL客户端连贯提供给退出节点,这由MySQL Server的主机名和端口零碎变量指定。如果report_port零碎变量指定了备用端口号,则改用该端口号。 从MySQL 8.0.21开始,组成员能够将分布式复原端点的代替列表作为加入成员的专用客户端连贯,从而使得独立于成员的惯例客户端用户的连贯能够用来管制分布式复原。能够应用groupreplicationadvertiserecoveryendpoints零碎变量来指定此列表,并且成员在退出组时将其分布式复原端点的列表传输到该组。默认值为成员持续提供与晚期版本雷同的规范SQL客户端连贯。 PS: 如果退出节点无奈应用MySQLServer的零碎变量定义的主机名正确辨认其余节点,则分布式复原可能会失败。倡议运行MySQL的操作系统应用DNS或本地设置具备正确配置的惟一主机名。能够在“performanceschema”库下的Replicationgroupmembers表的Memberhost列中验证server用于SQL客户端连贯的主机名。如果多个组成员将操作系统设置的默认主机名内部化,则退出节点有可能无奈将其解析为正确的地址,并且无奈连贯以进行分布式复原。在这种状况下,能够应用MySQL Server的report_host零碎变量来配置由每个server内部化的惟一主机名。 退出节点为分布式复原建设连贯的步骤如下: 当节点退出集群时,它会应用groupreplicationgroupseeds零碎变量中列表中蕴含的一个种子节点进行连贯,最后应用该列表中指定的groupreplicationlocaladdress连贯。种子节点可能是集群数据的子集。 通过此连贯,种子节点应用组复制的成员资格服务以视图的模式向退出的节点提供集群中所有online节点的列表。成员资格信息包含每个成员为分布式复原提供的分布式复原端点或规范SQL客户端连贯的详细信息。 退出节点从此列表中抉择适合的online节点作为其疏导节点进行分布式复原 退出节点尝试应用疏导节点的分布式复原端点来连贯到疏导节点,并按列表中指定的程序顺次尝试连贯每个端点。如果疏导节点没有提供端点,则退出节点将尝试应用疏导节点的规范SQL客户端连贯进行连贯。连贯的SSL要求由groupreplicationrecoveryssl *选项指定。 如果退出节点无奈连贯到指定的疏导节点,则它将与其余适合的疏导节点重试连贯。如果退出节点在没有建设连贯的状况下耗尽了端点的播送列表,则它不会回退到疏导节点的规范SQL客户端连贯,而是切换到另一个疏导节点尝试从新建设连贯。 退出节点与疏导节点建设分布式复原连贯时,它将应用该连贯进行状态转移,退出节点的日志中显示了所应用的连贯的主机和端口。如果应用近程克隆操作,则在操作完结时重新启动退出节点时,它将与新的疏导节点建设连贯,从疏导节点的二进制日志进行状态转移。这可能是与用于近程克隆操作的疏导节点不同的连贯,也可能是与疏导节点建设雷同的连贯。无论如何,分布式复原将以雷同的形式与疏导节点建设连贯。 2.1分布式复原端地址的查找:groupreplicationadvertiserecoveryendpoints零碎变量作为分布式复原端提供的IP地址,不用为MySQL Server配置(也就是说,不用由adminaddress零碎变量或在bindaddress零碎变量的列表中指定)。 为MySQL Server配置为分布式复原端提供的端口,必须由port,reportport或adminport零碎变量指定。必须在这些端口上侦听TCP / IP连贯。如果指定adminport,则用于分布式复原的复制用户须要SERVICECONNECTIONADMIN权限能力连贯。抉择adminport可使分布式复原连贯与惯例MySQL客户端连贯离开。 退出节点按列表中指定的程序顺次尝试每个端点。如果将groupreplicationadvertiserecoveryendpoints设置为DEFAULT而不是端点列表,则将提供规范SQL客户端连贯。规范SQL客户端连贯不会主动蕴含在分布式复原端点列表中,并且如果疏导节点的端点列表在没有连贯的状况下被用尽,则不会将其作为备用。如果要提供规范SQL客户端连贯作为多个分布式复原端点之一,则必须将其显式包含在groupreplicationadvertiseadvertiserecovery_endpoints指定的列表中。能够将其放在最初,以便作为连贯的最初伎俩。 无需将组成员的分布式复原起点(或规范SQL客户端连贯,如果未提供起点)增加到groupreplicationipallowlist(来自MySQL 8.0.22)或groupreplicationipwhitelist零碎变量指定的组复制容许列表中。许可列表仅实用于由groupreplicationlocal_address为每个节点指定的地址。退出节点必须具备与容许列表容许的集群的初始连贯,以便检索一个或多个地址进行分布式复原。 设置零碎变量和执行STARTGROUP_REPLICATION语句后,将验证列出的分布式复原端点。如果无奈正确解析列表,或者因为服务未在侦听列表而无奈在主机上拜访任何端点,则组复制将记录谬误并且无奈启动。 2.2分布式复原压缩在MySQL 8.0.18中,能够抉择应用疏导节点二进制日志中的状态转移办法为分布式复原配置压缩。在网络带宽无限的状况下,压缩能够使分布式复原受害,而疏导节点必须将许多事务传输给退出节点。groupreplicationrecoverycompressionalgorithm和groupreplicationrecoveryzstdcompression_level零碎变量配置容许的压缩算法以及zstd压缩级别,这些级别用于从疏导节点的二进制日志执行状态转移时应用。 这些压缩设置不适用于近程克隆操作。当近程克隆操作用于分布式复原时,将利用克隆插件的cloneenablecompression设置。 2.3分布式复原的用户分布式复原须要具备正确权限的复制用户,以便组复制能够建设间接的节点到节点的复制通道。复制用户还必须具备正确的权限,如果该复制用户还同充当近程克隆操作中的克隆用户,则在疏导节点中该复制用户还必须具备近程克隆相干的权限(BACKUP_ADMIN权限)能力充当疏导节点上的克隆用户以进行近程克隆操作。除此之外,必须将同一复制用户用于集群内每个节点上的分布式复原。 2.4分布式复原和SSL认证用于分布式复原的SSL与用于一般组通信的SSL离开配置,这由server的SSL设置和groupreplicationssl_mode零碎变量确定。对于分布式复原连贯,能够应用专用的组复制分布式复原SSL零碎变量来配置专门用于分布式复原的证书和密钥的应用。 默认状况下,SSL不用于分布式复原连贯。设置groupreplicationrecoveryusessl= ON启用,而后配置组复制分布式复原SSL零碎变量,将复制用户设置为应用SSL。 将分布式复原配置为应用SSL时,组复制会将此设置利用于近程克隆操作以及从疏导节点的二进制日志进行状态转移。组复制会主动配置克隆SSL选项(clonesslca,clonesslcert和clonesslkey),以匹配相应组复制分布式复原选项(groupreplicationrecoverysslca,groupreplicationrecoverysslcert和groupreplicationrecoverysslkey)的设置。 如果未应用SSL进行分布式复原(groupreplicationrecoveryusessl设置为OFF),并且组复制的复制用户帐户应用cachingsha2password插件(MySQL 8.0中的默认设置)或sha256password插件进行身份验证,则RSA密钥对为用于明码替换。在这种状况下,应用groupreplicationrecoverypublickeypath零碎变量指定RSA公共密钥文件,或者应用groupreplicationrecoverygetpublic_key零碎变量申请公共密钥。否则整个分布式回复会因为报错导致复原失败。 3. 利用克隆插件进行分布式复原:MySQLServer的克隆插件可从MySQL8.0.17取得。如果要将近程克隆操作用于集群中的分布式复原,则必须事后设置现有节点和退出节点能力反对此性能。如果不想在集群中应用此性能,请不要进行设置,在这种状况下,组复制仅应用二进制日志中的状态传输。 要应用克隆插件,必须事后设置至多一个现有的集群节点和退出节点反对近程克隆操作。至多,必须在疏导节点和退出节点上装置克隆插件,将BACKUPADMIN权限授予复制用户以进行分布式复原,并将groupreplicationclonethreshold零碎变量设置为适当的级别。(默认状况下为GTID序列容许的最大值,示意失常状况下,始终优先应用基于二进制日志的状态传输,除非joiner节点所申请的事务在组中任意成员中都不存在,这个时候,如果设置好了克隆性能,则无论该零碎变量的值设置为多少,都会触发通过克隆的形式进行分布式复原,例如:全新初始化的Server申请加入组时。如果不心愿应用克隆性能,则不要对其进行装置与配置)为了确保疏导节点的最大可用性,倡议设置所有以后和未来的集群节点反对近程克隆操作。以便后续有Server退出集群时可能应用近程克隆操作来疾速追赶集群中的最新数据。 在从疏导节点向退出节点传输数据之前,近程克隆操作会删除退出节点中用户创立的表空间和数据。如果在中途意外终止操作,则退出节点可能只剩下局部数据或没有数据。能够通过从新执行组复制主动执行的近程克隆操作来修复此问题。 这里次要针对近程克隆时应用DATADIRECTORY子选项指定了一个数据保留门路的状况,指定门路时,数据会保留在指定的目录下,即克隆之后的数据与操作克隆的实例没有关联,须要手动启动实例并指定datadir到保留克隆数据的目录进行启动,当然,MGR插件能够主动执行近程克隆的重试操作(须要保障克隆操作不指定DATA DIRECTORY子选项,在这种状况下,近程克隆数据会笼罩掉操作近程克隆的Server数据,实现近程克隆操之后,操作近程克隆的Server会基于克隆数据主动重新启动)。另外,克隆插件尽管与组复制配合应用对组复制的治理保护来说更加自动化,然而,克隆插件不要求必须在集群中运行(但MGR插件必须要装置)。 3.1克隆的根本条件对于组复制,应用克隆插件进行分布式复原须要留神以下要点和区别: 现有集群节点和退出节点必须已装置克隆插件并处于激活状态。 疏导节点和退出节点必须在雷同的操作系统上运行,并且必须具备雷同的MySQL Server版本(必须为MySQL 8.0.17或更高版本能力反对克隆插件)。因而,克隆不适用于成员运行不同MySQL版本的集群。 ...