【发布时间】:2011-06-30 21:54:03
【问题描述】:
对于具有大量传入读取和更新最终成为数据库 I/O 的大型网站(流量方面),减轻性能影响的最佳方法是什么?我能想到的一种解决方案是 - 写入,缓存然后延迟写入(使用单独的作业);对于阅读,使用 memcached 概念。还有其他更好的解决方案吗?
【问题讨论】:
标签: database performance web
对于具有大量传入读取和更新最终成为数据库 I/O 的大型网站(流量方面),减轻性能影响的最佳方法是什么?我能想到的一种解决方案是 - 写入,缓存然后延迟写入(使用单独的作业);对于阅读,使用 memcached 概念。还有其他更好的解决方案吗?
【问题讨论】:
标签: database performance web
以下是最常见的数据库性能解决方案:
【讨论】:
不要忘记优化您的查询。大多数时候,瓶颈不是磁盘 I/O,而是写得不好的查询。
如果内容不会经常更改,您还可以缓存查询结果和整个网页。
【讨论】:
这在很大程度上取决于使用模式和数据类型。根据是否支持事务、您是否对完全一致性或“最终一致性”感兴趣、数据有多大(它们都适合巨大的内存吗?)、数据的复杂程度,确实有不同的事情要做并且查询是,列表可能会继续下去......很多变量,只有在列出所有约束/要求之后,您才能做出正确的决定。不过有两个一般性建议:
【讨论】:
10 年前,除了优化您的特定数据库之外,标准答案是通过两种方式使用 MySQL 进行横向扩展。
可以通过两种方式扩展读取。第一种是通过缓存,它引入了可能的不一致并创建了一个单独的缓存层。读取也可以通过创建“读取副本”在 MySQL 中进行扩展,其中可以查询任何数据库。任何写入都必须应用于所有服务器,因此复制无助于写入吞吐量。
写入通过分片进行扩展。例如,假设所有姓氏为“a”的用户都分配给某个服务器。现在想象一个更复杂的分片算法,其中特定行的主 ID 使用哈希函数进行哈希处理,然后分发到服务器池中的一个。
Facebook 是分片 MySQL 架构最先进的支持者之一。您可以“加入”单个表格,但您必须编写自定义代码,因为您可能必须从服务器跳到服务器 - 假设您想要获取朋友的时间线帖子,您不能简单地加入它,您必须编写一些应用程序代码。
一旦您对数据库进行了分片,您就无法进行连接,并且范围查找变得很困难。这个子集有时被称为 CRUD 操作,因此 MySQL 是多余的。许多中国社交网络意识到了这一点,并使用了分片的 Redis(比 MySQL 快得多),并编写了自己的分片层和应用逻辑层。
想象一下分片中的下一个问题 - 您想添加一个新服务器,并开始将一些用户分配给该新服务器。
另一种方法是使用分布式数据库,它通常以 NoSQL 或 NewSQL 的名称出现,并且有多种方法。有些,比如 MongoDB,有一个分片系统来管理这个映射,但是需要手动步骤来添加服务器。 Cassandra 有一个更灵活的集群方案,称为 chorded 架构。 CouchBase 和 Aerospike 等系统使用随机分布机制,无需分片层。其中一些数据库每台服务器每秒可以超过 100,000 到 200,000 个请求,横向扩展以添加新服务器 - 足以满足非常大型的操作。使用这种集群方式,您通常可以获得更高级别的冗余和可靠性。
其他分布式方法以更有效的方式表示数据,例如图形数据库。如果您有一个问题可以更好地表示为图,那么集群图数据库可能更合适。
【讨论】: