随着连接到源的副本数量增加,负载也会增加,因为每个副本都使用客户端连接到源。此外,每个副本都需要从源的二进制日志中接收完整的副本,因此源上的网络负载也可能增加并创建瓶颈。
如果您使用了大量连接到一个源的副本,而该源也忙于处理请求(例如,在scale-out解决方案中),那么您可能想提高复制过程的性能。
提高复制性能的一种方法是创建一个更深的复制结构,使源只需将其复制到一个副本,而其他副本则连接到该主要副本以满足其个体复制要求。该结构的示例见图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
。这将阻止“愚蠢”的副本将它们执行的事件记录到自己的二进制日志中。