随着连接到源的副本数量增加,负载虽然很小,但也会增加,因为每个副本都使用一个客户端连接到源。此外,由于每个副本都必须接收源二进制日志的完整副本,因此源上的网络负载也可能增加并造成瓶颈。
如果您使用大量副本连接到一个源,而该源也忙于处理请求(例如,作为扩展解决方案的一部分),那么您可能希望提高复制过程的性能。
提高复制过程性能的一种方法是创建更深层的复制结构,使源仅复制到一个副本,而其他副本连接到这个主副本以满足其各自的复制要求。图 19.3, “使用其他复制源提高性能” 展示了这种结构的一个示例。
为了使此方法生效,您必须按如下方式配置 MySQL 实例
源 1 是主要源,所有更改和更新都写入到数据库中。两个源服务器都启用了二进制日志记录,这是默认设置。
源 2 是服务器源 1 的副本,它为复制结构中的其余副本提供复制功能。源 2 是唯一允许连接到源 1 的机器。源 2 启用了
--log-replica-updates
选项(默认选项)。使用此选项,来自源 1 的复制指令也会写入到源 2 的二进制日志,以便随后可以将其复制到实际副本。副本 1、副本 2 和副本 3 充当源 2 的副本,并复制来自源 2 的信息,这些信息实际上包含源 1 上记录的升级。
上述解决方案减少了主要源上的客户端负载和网络接口负载,这应该在将主要源用作直接数据库解决方案时提高其整体性能。
如果您的副本难以跟上源上的复制过程,则可以使用以下几种选项
如果可能,将中继日志和数据文件放在不同的物理驱动器上。为此,请设置
relay_log
系统变量以指定中继日志的位置。如果二进制日志文件和中继日志文件的读取导致严重的磁盘 I/O 活动,请考虑增加
rpl_read_size
系统变量的值。此系统变量控制从日志文件读取的最小数据量,增加其值可能会减少文件读取和 I/O 停顿,因为文件数据目前未被操作系统缓存。请注意,会为每个从二进制日志和中继日志文件读取数据的线程(包括源上的转储线程和副本上的协调器线程)分配大小为此值的缓冲区。因此,设置较大的值可能会影响服务器的内存消耗。如果副本比源服务器明显慢,您可能希望将复制不同数据库的责任分配给不同的副本。请参阅 第 19.4.6 节,“将不同的数据库复制到不同的副本”。
如果您的源服务器使用事务,并且您不关心副本上的事务支持,请在副本上使用
MyISAM
或其他非事务性引擎。请参阅 第 19.4.4 节,“在不同的源和副本存储引擎之间使用复制”。如果您的副本不是充当源服务器,并且您已有一套潜在的解决方案来确保您能够在发生故障时启动源服务器,那么您可以禁用
log_replica_updates
。这将阻止““哑””副本将其执行的事件记录到自己的二进制日志中。