• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 复制通道

    在MySQL多源复制中,一个从属服务器打开多个复制通道,每个主复制通道一个。复制通道表示从主机流向从机的事务的路径。每个复制通道都有其自己的接收器(I / O)线程,一个或多个应用程序(SQL)线程以及中继日志。通道的接收器线程接收到来自主服务器的事务后,会将它们添加到通道的中继日志文件中,并传递到通道的应用程序线程。这样可使每个通道独立运行。

    本节介绍如何在复制拓扑中使用通道以及它们对单源复制的影响。有关配置主服务器和从服务器以进行多源复制,启动,停止和重置多源从属服务器以及监视多源复制的说明,请参见“ MySQL多源复制”。

    在多源复制拓扑中的一个从属服务器上最多可以创建256个通道。每个复制通道必须具有唯一的(非空)名称,如“复制通道命名约定”中所述。启用多源复制时发出的错误代码和消息指定生成错误的通道。

    注意

    多源复制从属服务器上的每个通道都必须从其他主服务器复制。您无法设置从单个从服务器到单个主机的多个复制通道。这是因为复制从属服务器的服务器ID在复制拓扑中必须唯一。主服务器仅通过从服务器的服务器ID来区分从服务器,而不能通过复制通道的名称来区分,因此它无法识别来自同一从服务器的不同复制通道。

    通过将slave_parallel_workers系统变量设置为大于0的值,还可以将多源复制从属服务器设置为多线程复制从属服务器。在多源复制从属服务器上执行此操作时,从属服务器上的每个通道都具有指定数量的应用程序线程,再加上一个协调器线程来管理它们。您不能为单个通道配置应用程序线程数。

    从MySQL 8.0开始,可以在特定复制通道上使用复制过滤器配置多源复制从属。当多个主服务器上存在相同的数据库或表时,可以使用通道特定的复制过滤器,并且您只需要从属服务器就可以从一个主服务器复制它。有关更多信息,请参见“基于复制通道的过滤器”。

    为了提供与以前版本的兼容性,MySQL服务器在启动时自动创建一个默认通道,该通道的名称为空字符串("")。该频道始终存在;它不能由用户创建或销毁。如果未创建其他通道(具有非空名称),则复制语句仅在默认通道上起作用,以便来自较旧从属的所有复制语句均按预期运行(请参见“与以前的复制语句的兼容性”)。仅当存在至少一个命名通道时,才能使用本节中描述的复制通道。


    单通道操作命令

    为了使MySQL复制操作能够作用于各个复制通道,请将该子句与以下复制语句一起使用:FOR CHANNEL channel

    • CHANGE MASTER TO
    • START SLAVE
    • STOP SLAVE
    • SHOW RELAYLOG EVENTS
    • FLUSH RELAY LOGS
    • SHOW SLAVE STATUS
    • RESET SLAVE

    channel为以下功能引入了一个附加参数:

    • MASTER_POS_WAIT()

    group_replication_recovery通道不允许使用以下语句:

    • START SLAVE
    • STOP SLAVE

    group_replication_applier通道不允许使用以下语句:

    • START SLAVE
    • STOP SLAVE
    • SHOW SLAVE STATUS

    FLUSH RELAY LOGS现在允许该group_replication_applier通道使用“允许”,但是如果在应用事务时接收到请求,则在事务结束后执行请求。请求者必须等待交易完成和轮换。此行为可防止拆分事务,这对于组复制是不允许的。

    与以前的复制语句的兼容性

    当复制从属具有多个通道且未指定选项时,有效语句通常会作用于所有可用通道,但有一些特定的例外。FOR CHANNEL channel

    例如,对于某些“组复制”通道,以下语句的行为均符合预期:

    • START SLAVE启动除group_replication_recoverygroup_replication_applier通道之外的所有通道的复制线程。
    • STOP SLAVE停止所有通道(group_replication_recovery和和group_replication_applier通道除外)的复制线程。
    • SHOW SLAVE STATUS报告除group_replication_applier通道之外的所有通道的状态。
    • RESET SLAVE重置所有通道。
    警告

    RESET SLAVE谨慎使用,因为此语句将删除所有现有通道,清除其中继日志文件并仅重新创建默认通道。

    某些复制语句无法在所有通道上运行。在这种情况下,从站上将出现错误1964 多个通道。请提供频道名称作为参数。生成。在多源复制拓扑中使用以下语句和函数时,会产生此错误,并且未使用选项指定要对哪个通道进行操作:FOR CHANNEL channel

    • SHOW RELAYLOG EVENTS
    • CHANGE MASTER TO
    • MASTER_POS_WAIT()

    请注意,默认通道始终存在于单个源复制拓扑中,其中语句和函数的行为与MySQL早期版本中的行为相同。

    启动选项和复制通道

    本节介绍了受复制通道影响的启动选项。

    必须正确配置以下启动设置才能使用多源复制。

    • relay_log_info_repository

      必须将其设置为TABLE。如果将此变量设置为FILE,尝试将更多源添加到从属服务器失败ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORYFILE现在已弃用该设置,它TABLE是默认设置。

    • master_info_repository

      必须将其设置为TABLE。如果将此变量设置为FILE,尝试将更多源添加到从属服务器失败ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORYFILE现在已弃用该设置,它TABLE是默认设置。

    现在,以下启动选项会影响复制拓扑中的所有通道。

    • --log-slave-updates

      从站接收到的所有事务(甚至来自多个源)都被写入二进制日志中。

    • --relay-log-purge

      设置后,每个通道都会自动清除其自己的中继日志。

    • --slave_transaction_retries

      指定次数的事务重试可以在所有通道的所有应用线程上进行。

    • --skip-slave-start

      没有复制线程在任何通道上启动。

    • --slave-skip-errors

      执行继续,所有通道的错误均被跳过。

    为以下启动选项设置的值适用于每个通道。由于这些是mysqld启动选项,因此它们适用于每个通道。

    • --max-relay-log-size=size

      每个通道的单个中继日志文件的最大大小;达到此限制后,将旋转文件。

    • --relay-log-space-limit=size

      每个通道的所有中继日志的总大小上限。对于N通道,这些日志的总大小限制为。relay_log_space_limit *N

    • --slave-parallel-workers=value

      每个通道的从并行工作者数。

    • slave_checkpoint_group

      每个源的I / O线程等待时间。

    • --relay-log-index=filename

      每个通道的中继日志索引文件的基本名称。请参见“复制通道命名约定”。

    • --relay-log=filename

      表示每个通道的中继日志文件的基本名称。请参见“复制通道命名约定”。

    • --slave_net-timeout=N

      为每个通道设置此值,以便每个通道等待N几秒钟以检查断开的连接。

    • --slave-skip-counter=N

      为每个通道设置此值,以便每个通道跳过N其主站的事件。

    复制通道命名约定

    本节介绍复制通道如何影响命名约定。

    每个复制通道都有一个唯一的名称,该名称是一个字符串,最大长度为64个字符,并且不区分大小写。因为在从属表中使用了通道名称,所以用于它们的字符集始终为UTF-8。尽管通常可以自由使用任何名称作为频道,但保留以下名称:

    • group_replication_applier
    • group_replication_recovery

    您为复制通道选择的名称也会影响多源复制从属设备使用的文件名。每个通道的中继日志文件和索引文件都命名为,其中是使用系统变量指定的基本名称,也是登录到该文件的通道的名称。如果未指定系统变量,则使用默认文件名,其中还包括通道名。relay_log_basename-channel.xxxxxxrelay_log_basenamerelay_logchannelrelay_log