缓解大型网站数据库i / o瓶颈的最佳方法是什么?

时间:2011-06-30 21:54:04

标签: database performance web

对于大量网站(流量明智),它有很多传入读取和更新,最终成为数据库I / O,减轻性能影响的最佳方法是什么?我能想到的一个解决方案是 - 写入,缓存然后执行延迟写入(使用单独的作业);阅读,使用memcached概念。其他更好的解决方案?

4 个答案:

答案 0 :(得分:4)

以下是数据库性能最常见的解决方案:

  • 缓存(Memcache等)
  • 向数据库添加内存
  • 更多数据库服务器(主/从或分片)
  • 使用其他数据库类型(NoSQL,Redis等)
  • 索引以加快读取性能。 (小心,太多会影响写入性能)
  • SSD(快速SSD将有很大帮助)
  • RAID
  • 优化/调整SQL查询

答案 1 :(得分:2)

不要忘记优化您的查询。大多数情况下,它不是磁盘I / O,但写得不好的查询最终成为瓶颈。

如果内容不会经常更改,您还可以缓存查询结果以及整个网页。

答案 2 :(得分:2)

这在很大程度上取决于使用模式和数据类型。根据是否支持事务,是否对完全一致性或“最终一致性”感兴趣,数据有多大(它是否适合大量内存?),数据有多复杂,确实有不同的事情要做。和查询,列表可能会继续......很多变量,只有在列出所有约束/要求后,您才能做出正确的决定。但是有两个一般性的建议:

  • 使用SSD
  • 使用分布式架构和分布式“NoSQL”(键/值)方法(仅当您不必使用复杂的关系和事务时)

答案 3 :(得分:2)

10年前,除了优化您的特定数据库之外,标准答案是使用MySQL以两种方式扩展。

读取可以通过两种方式扩展。第一种是通过缓存,它引入了可能的不一致并创建了一个单独的缓存层。读取也可以通过创建“读取副本”在MySQL中进行扩展,其中可以查询任何数据库。任何写入都必须应用于所有服务器,因此复制无助于写入吞吐量。

通过分片缩放写入。例如,假设所有姓氏为“a”的用户都被分配到某个服务器。现在想象一个更复杂的分片算法,其中使用散列函数对特定行的主ID进行散列,并将其分发到服务器池中的一个。

Facebook是分片式MySQL架构的最先进支持者之一。您可以将各个表“加入”,但是您必须编写自定义代码,因为您可能必须从服务器跳到服务器 - 想象您想要获取朋友的时间轴帖子,您不能简单地加入它,您必须写一些应用代码。

一旦对数据库进行了分片,就无法进行连接,并且范围查找变得困难。这个子集有时被称为CRUD操作,因此MySQL是过度的。许多中国社交网络实现了这一点,并使用分片Redis(比MySQL快得多),并编写了自己的分片层和应用程序逻辑层。

想象一下分片中的下一个问题 - 您想要添加一个新服务器,并开始将一些用户分配给该新服务器。

另一种方法是使用分布式数据库,该数据库通常以NoSQL或NewSQL的名称提供,并且具有多种方法。有些像MongoDB一样,有一个分片系统来管理这个映射,但需要手动步骤来添加服务器。 Cassandra有一个更灵活的聚类方案,称为chorded架构。像CouchBase和Aerospike这样的系统使用随机分配机制,不再需要分片层。其中一些数据库每台服务器每秒可以超过100,000到200,000个请求,横向扩展可以添加新服务器 - 足够用于非常大的操作。通过这种类型的群集,您通常可以获得更高级别的冗余和可靠性。

其他分布式方法以更有效的方式表示数据,如图数据库。如果您有一个更好地表示为图形的问题,那么集群图形数据库可能更合适。