19.4.7 提高复制性能
随着副本数量增加,虽然负载增加,但每个副本都使用客户端连接到源服务器,这也增加了负载。同时,每个副本都需要从源服务器接收完整的二进制日志副本,这可能会增加源服务器的网络负载并导致瓶颈。
如果您使用大量副本连接到一个源服务器,并且该源服务器还在处理请求(例如作为扩展解决方案的一部分),那么您可能想提高复制过程的性能。
一种提高复制过程性能的方法是创建一个更深的复制结构,使源服务器只复制到一个副本,然后其他副本连接到这个主副本以满足其个体复制需求。该结构的示例在Figure 19.3,“使用额外的复制源来提高性能”中展示。
为了使这工作,您需要配置MySQL实例如下:
-
源服务器1是所有更改和更新都写入到数据库的源服务器。启用了源服务器的二进制日志记录,这是默认设置。
-
源服务器2是连接到源服务器1的副本,提供复制功能到复制结构中的其他副本。源服务器2是唯一允许连接到源服务器1的机器。源服务器2启用了
--log-replica-updates
选项(默认设置)。使用该选项,源服务器1的复制指令也将被写入到源服务器2的二进制日志中,以便将其复制到真正的副本。 -
副本1、副本2和副本3作为源服务器2的副本,复制来自源服务器2的信息,这些信息实际上是源服务器1上记录的升级。
上述解决方案减少了客户端负载和网络接口负载在主源服务器上,这应该提高了主源服务器在直接数据库解决方案中的性能。
如果您的副本无法跟上源服务器的复制过程,您可以选择以下选项:
-
如果可能,将relay日志和数据文件分配到不同的物理磁盘上。要实现这一点,请将
relay_log
系统变量设置为指定relay日志的位置。 -
如果读取二进制日志文件和relay日志文件的磁盘I/O活动是一个问题,考虑增加
rpl_read_size
系统变量的值。这系统变量控制从日志文件读取的最小数据量,增加它可能会减少文件读取和I/O停顿,因为文件数据不在操作系统的缓存中。请注意,这个值将为每个读取日志文件和relay日志文件的线程分配一个缓冲区,包括dump线程在源服务器和协调线程在副本服务器上。设置一个大值可能会对服务器的内存使用产生影响。 -
如果复制的副本远远慢于源服务器,您可能想将不同数据库的复制责任分配给不同的副本。请参阅第19.4.6节,“将不同数据库复制到不同的副本”。
-
如果源服务器使用事务,您不关心副本上的事务支持,可以在副本上使用
MyISAM
或其他非事务存储引擎。请参阅第19.4.4节,“使用不同源和副本存储引擎的复制”。 -
如果您的副本不作为源服务器,并且您已经准备了一种解决方案,以确保在故障情况下可以快速启动源服务器,那么可以禁用
log_replica_updates
。这将防止““”的副本也将执行的事件写入自己的二进制日志。