【问题标题】:what are the best ways to mitigate database i/o bottoleneck for large web sites?缓解大型网站的数据库 i/o 瓶颈的最佳方法是什么?
【发布时间】:2011-06-30 21:54:03
【问题描述】:

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

【问题讨论】:

    标签: database performance web


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不要忘记优化您的查询。大多数时候,瓶颈不是磁盘 I/O,而是写得不好的查询。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          写入通过分片进行扩展。例如,假设所有姓氏为“a”的用户都分配给某个服务器。现在想象一个更复杂的分片算法,其中特定行的主 ID 使用哈希函数进行哈希处理,然后分发到服务器池中的一个。

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2019-11-18
            • 2020-03-17
            • 1970-01-01
            • 1970-01-01
            • 2011-02-05
            • 2012-07-31
            • 2021-12-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多