随着连接到源的副本数量增加,负载虽然很小,但也会增加,因为每个副本都使用客户端连接到源。此外,由于每个副本都必须接收源二进制日志的完整副本,因此源上的网络负载也会增加并可能成为瓶颈。
如果您正在使用大量连接到一个源的副本,并且该源也很忙于处理请求(例如,作为横向扩展解决方案的一部分),那么您可能希望提高复制过程的性能。
提高复制过程性能的一种方法是创建更深层的复制结构,使源只复制到一个副本,而其他副本连接到此主副本以满足其各自的复制需求。此结构的示例如图 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
。 这将阻止““哑”” 副本将它们执行的事件记录到自己的二进制日志中。