哪个MySQL Server为Magento提供了更好的性能


30

您将什么用作Magento的MySQL服务器?

  • MySQL(Oracle)
  • 佩尔科纳
  • 其他(MariaDB)

Percona为Magento大量使用的InnoDB存储提供了一系列改进,但是这些改进确实在运行Magento存储时有所作为。

如何提高性能(关于体系结构的通用方法,而不是有关设置诸如此类的特定变量的特定信息innodb_flush_log_at_trx_commit=2)。我知道NBS尝试了主-主复制,但这种情况不稳定。

我的主从复制确实遇到了很多问题,读取重定向到从属,因为复制数据存在一些延迟。

尽可能退出MySQL?(搜索为solr等)。


1
FlorinelChis,谢谢您提出这个问题,但这是一个非常广泛的主题(性能改进),选择数据库引擎本身就是一个领域。除非该问题中有与Magento特别相关的重要部分,否则最好在DBA问答中提出。但是,无论您提出什么问题,都必须提供有关所遇到的特定问题的更多信息。抱歉给您带来混乱,祝您好运!
罗伯特Cartaino

我知道这个问题是模棱两可的,似乎是一个非常广泛的话题。关于Magento并不是那么广泛,它涉及非常具体的细节。当您需要扩展Magento时,MySQL是瓶颈,根据我的经验,在某些设置中仅更改为percona可以提高性能。我想知道其他Magento系统管理员的工作方式。我不是在寻找非常具体的信息,例如您需要设置innodb-flush-log-at-trx-commit = 2,而是更多地寻求使用Mysql,percona或其他(MariaDB)的方法来获得更好的性能。
FlorinelChis

FlorinelChris,我不是领域专家,但是基于投票和举报,我怀疑这个问题需要/需要更多信息才能获得有用的答复。但是我很高兴重新打开它,让社区适当地处理它。您可能想看看可以添加哪些信息,这样人们就不必再猜测如何最好地为您提供帮助了。
罗伯特·卡塔诺

Answers:


73

您正在进入一个广阔而广泛的优化世界,并且肯定没有一种适合所有需求的方法。

定义绩效

您是指单个用户的页面加载时间,还是整体容量/总并发时间?两者非常不同-并不严格相关。快速存储容量有限是完全有可能的。或容量大的慢商店。

因此,在处理任何一种性能时:

  1. 单用户感知页面加载时间
  2. 总容量/并发

您必须使用各自的解决方案独立解决每个问题-尤其是因为每个都有各自的瓶颈。

让我们假设您与一台合格的主机配合使用,该主机已经为商店优化了服务器的其他方面。

单用户感知页面加载时间

是MySQL的瓶颈
。不是直接的。在所有情况下,在测试页面加载时间时,所有这些都与延迟有关-仅会命中缓存。因此,这里的关键是使延迟最小化。

  • 适当地 调整MySQL缓存的大小(没有正确的答案,我们每个商店每月都会对设置进行完全不同的调整)
  • 减少网络延迟。对于64字节帧;10Mbps为51.2µs,100Mbps为5.12µs,1Gbps为4.096µs。仅从100Mbps过渡到1Gbps,就可以提高20%。s1
  • 增加网络容量。Web和DB服务器之间每秒要交换许多兆字节(通常超过10MB / s),因此s1至少需要100Mb / s,您会感到惊讶。或者,只需将数据库服务器移动到本地。
  • 使用SOLR。外部引擎有时更适合,对于较大的目录,SOLR当然更快(我要强调的是,较大的目录)。甚至未经调整的SOLR也会比MySQL更快地产生分层的导航和搜索结果。

但是这些更改将对页面加载时间产生微小的影响-瓶颈确实在其他地方。

  • 调整应用程序。Magento在构建集合和缓存它们的方式方面存在一些相当大的错误;我们遇到了许多可能影响性能的重大核心代码问题。在某些情况下,只需删除分层导航结果上的产品计数显示,就可以减少加载大集合的2 秒时间
  • 查看MySQL慢日志。检查慢查询并根据需要添加索引。使用带有和不带有适当索引的多个联接运行复杂查询之间的差异可能是数十秒

应用程序是瓶颈。不是软件。因此,与任何 MySQL配置更改相比,仅改进核心代码或减轻模板的负担将对性能产生更大的影响。

我们不会打扰什么

  • 更改存储引擎。MariaDB和Percona共享同一个InnoDB引擎-Percona XtraDB。它们可以被视为相同。就单个查询执行时间而言-性能将完全反映出原始MySQL构建。这在负载/并发下起作用。
  • 运行一个MySQL从站。除非从站在物理上距离更近(从网络角度来看),或者从站的硬件比主站更好,否则这不会提高性能。这在负载/并发下起作用。
  • 运行外部数据库服务器。到目前为止,这是我们看到的许多主机/代理机构反复发出的最糟糕的建议。除非您在硬件/资源上达到顶峰或拥有多个Web服务器(阅读:高可用性),否则在Magento商店的本地计算机上使用MySQL是一个好主意。它减少了所有网络开销和延迟。即使是100Gb / s的网络(是的,每秒100吉比特)也不会与本地unix套接字的原始卷,吞吐量和延迟进行比较。

s1仅适用于单独的数据库服务器。不适用于本地数据库服务器。

总容量/并发

是MySQL的瓶颈吗
?但是只有在您将PHP的性能和容量提高到使MySQL变慢的程度时,才可以这样做。如果您已经正确配置 了Varnish和FPC (不要让我们开始尝试使用任何一种尝试失败的次数),那么MySQL确实成为了瓶颈。

因此除了上述修改。

  • 更改MySQL引擎。XtraDB在负载下可以表现出色,并且确实比现有的MySQL发行版显示出真正的优势。
  • 随时了解MySQL。5.5在负载下的性能优于5.0。
  • 更改PHP MySQL驱动程序。PHP 5.3和更高版本具有本机MySQL驱动程序,但是在某些情况下,我们发现PHP 5.2具有单独的驱动程序,其性能优于Magento的MySQLND。自己测试
  • 更改搜索引擎。将搜索移至SOLR / Sphinx(甚至某些第三方外部服务)可以真正减轻非交易负载的负担(即,人们不下订单)
  • 更改分层的导航引擎。同样,SOLR是用于分层导航的出色引擎,并且由于其非锁定性质,其运行速度比MySQL快得多。
  • 添加一个MySQL从站。这确实有助于浏览(非事务性)负载,但并不能帮助您每小时处理更多订单-因为它依赖于主服务器来处理和复制此数据

我们不会打扰什么

  • 硕士/硕士。由于主站/从站设置的硬件饱和非常高的临界点(每小时超过1000个订单)-我们从来没有发现在生产中使用主站/主站的要求。我们已经进行了广泛的测试,但是从性能的角度来看,它从来没有发现有优势,而且由于母带/母带的固有风险和问题,这根本不值得。

读取与写入可扩展性

最后一段实际上指向了读写可伸缩性的关键领域。随着越来越多的从机的添加,读缩放可以无限无限制地执行,而不会造成太多的复杂性。

考虑到Magento的读写比约为0.1%-考虑写应该不是太大的问题。这就是为什么我不介意提及MySQL Cluster及其聪明的功能,例如自动分片(将表分割到单独的机器上)。

硬件,硬件,硬件

在改进方面,硬件很容易是最快的答案,因此,在以上两种情况下,我都没有故意提到硬件。

但是,如果您的基础硬件不足,那么世界上所有的软件更改都不会起作用。那可能意味着...

  • 缓冲区有限的低质量开关
  • 过度饱和的网络链接
  • 地理位置遥远的服务器
  • 不良的网络QoS / CoS
  • RAM总量有限
  • 低内存带宽RAM
  • 低IOP HDD子系统
  • 软件RAID控制器
  • 低时钟速度的CPU
  • 低带宽芯片组
  • 硬件虚拟化(除内核级虚拟化外,几乎所有类型)

如今,在硬件上实际可扩展的数量有很高的上限。让我们忽略“在云中”无限扩展的神话,因为云硬件往往相当中等。例如,亚马逊的旗舰机型只有12核@ 3.3GHz。但是除此之外,还有一些非常强大的服务器可用- 我们的顶级服务器具有160个内核和2TB(是,太字节)的RAM。我们还没有看到任何人能够超越此功能。

因此,在您甚至需要考虑水平缩放之前,您就拥有了很大的垂直缩放范围。

永远移动的目标

值得一提的是,在追求性能的过程中,瓶颈将一直存在。

对于Magento的库存商店。

打开缓存。PHP是瓶颈
添加后端缓存。PHP是瓶颈
添加应用程序级的全页缓存。PHP是瓶颈
添加服务器级前端缓存(例如Varnish)。MySQL是瓶颈
添加替代搜索/分层导航引擎(例如SOLR / Sphinx)。PHP是瓶颈
添加更多应用程序服务器。MySQL是瓶颈
添加MySQL从站。前端缓存是瓶颈
添加更多前端缓存服务器。PHP是瓶颈
添加更多应用程序服务器。SOLR /狮身人面像是瓶颈

Etcetera。

这几乎成为重复冲洗的情况。但是要清楚地理解的是,MySQL当然不是优化的第一个调用端口-实际上仅在MySQL与PHP成比例地消耗更多CPU时才起作用-并且只有在同时使用FPC和Varnish时才会发生这种情况并且服务器纯粹是在处理订单,而没有其他(因为其他所有内容都在缓存中)。

不要盲目地进行更改

只需添加一个MySQL从站即可,因为您已经阅读了我们上面所说的内容,这将对您有帮助,可能会在很大程度上降低您的性能和可靠性。拥塞的网络,低规格的从属服务器甚至不正确的设置都可能导致复制问题,从而使您的存储比开始时的速度慢-或导致主从服务器之间的同步问题。

透视事物-一些现实世界的例子。

示例1-每小时300个订单

我们使用以下硬件每小时可以处理300个订单 ; 而且只有在那个临界点时,我们才感到需要添加专用的MySQL服务器和本地MySQL从站。

1个服务器
CPU:2个Intel E5-4620
RAM:64GB硬盘:4个80k IOP / s SSD
RAID:硬件RAID 10
Magento版本:Magento EE
操作系统:MageStack

在整个过程中,平均负载保持在3.00以下。

示例2-每小时180个订单

就在两天前,我们的新客户很容易吸收了巨大的流量高峰。使用单服务器和Magento Community Edition每小时处理180个订单。

1个服务器
CPU:2个Intel E5-4620
RAM:64GB硬盘:4个80k IOP / s SSD
RAID:硬件RAID 10
Magento版本:Magento CE
操作系统:MageStack
网站:Wellgosh.com

在整个时间内,平均负载保持在6.00以下。在这种情况下,负载较高,这可以归结为两个因素。

  1. 没有像示例1那样执行存储侧调整
  2. 缺乏应用程序级别的FPC

鉴于这一点的近期性,我们仍然可以获得详细的统计数据,以通过图表的方式提供一些反馈。这些讲述了一个很好的故事,说明如何在单独的Magento体系结构的关键组件(负载均衡器,Web服务器,数据库服务器等- 使用MageStack)之间分配负载。

因此,从头到尾……您要查看的日期是2月22日凌晨12:00。

防火墙数据包
防火墙数据包

清漆交通
清漆交通

Nginx流量
Nginx流量

MySQL加载
MySQL线程 MySQL字节 MySQL查询

CPU负载
CPU负载

最重要的是负载分配

该图像可以说明一切。而且MySQL当然不是负担- 至少现在还不是。因此,我们的建议将您的性能问题集中在其他地方,除非您每小时处理数千个订单。

负荷分配

并总结一下

进行性能更改并非“一刀切”。这是分析您当前的瓶颈并进行细微更改/调整以适合您的商店和基础架构的情况。

除了性能,使用Percona还有其他好处

我们几乎完全使用Percona XtraDB。我们运行专门为Magento开发的自定义编译的MySQL版本,并在此过程中咨询了Percona。但是,影响选择的不仅是性能。

  • Percona工具包
    • pt-query-digest
    • xtrabackup
    • 等等
  • Percona释放频率
  • Percona咨询支持
  • 热缓存重新启动并保留InnoDB池

以及更多。因此,在MySQL上使用它不仅具有性能方面的其他优势。实际上,在追求性能和稳定性方面,MySQL一直是我们关注的最少的问题。

归因:wellgosh.comsonassi.comiebmedia.com


这是一个很长的答案:)非常感谢,谢谢。关于MySQL的规模和负载,这是MySQL的munin图表:twitter.com/ze_m0n5t3r/status/232864932482396160。优化Magento是一个持续的过程(各种错误,未优化的代码等)。减少负载(将搜索/导航移动到solr,更好地缓存)是第一种方法。而且,数据库需要在冷缓存下表现更好。当这种情况发生时,我正在寻找一个容量更大的速度较慢的网站。
FlorinelChis

别客气。没有理由说您不能拥有快速的网站强大的功能- 我们的客户可以做到。MySQL性能显然比我上面提到的要多。但这将在某种程度上放弃我们的“秘密调味料”。我已经将该答案面向小型商店所有者(每天少于25k唯一身份)作为MySQL的“入门”指南。
Ben Lessani-Sonassi

只是一个旁注。查看您的图表,您的插入内容的峰值约为正常负载的10倍,更新保持较低,选择内容显示出最大的负担。我会赌博,包括客户日志,搜索相关性/查询或禁止访问的会话。但是数量仍然很少,不会引起问题,甚至不会考虑Master / Master。因此,根据您的图表,简单地添加更多硬件将绰绰有余;跟着一个奴隶。使用Percona,s.onas.si/5g8s
Ben Lessani-Sonassi

搜索很简单,会话-内存缓存。你知道有人在经营成功的大师班吗?(NBS对此失败,我们也对此失败,Magento不稳定,在其他更轻便的php应用程序上也能正常工作)
FlorinelChis 2013年

1
这是一个不可思议的答案。只是想说。
尘土飞扬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.