【问题标题】:MongoDB Performance Issue at AWSAWS 的 MongoDB 性能问题
【发布时间】:2019-10-16 09:16:42
【问题描述】:

我有几个关于 MongoDB 性能的问题。提前感谢您的帮助。

数据库架构

已根据以下说明安装了数据库: https://docs.aws.amazon.com/quickstart/latest/mongodb/step2.html

它有一个堡垒和三个副本。

该数据库用于带有 MongoDB 4.09 的 Ruby on Rails 5 应用程序

问题

  1. 我想知道“hosts”参数是应该包括所有副本还是只包括主副本?

mongoid.yml 配置

"mongoid": {
                "production": {
                    "clients": {
                        "default": {
                            "options": {
                                "user": "USER",
                                "password": "PASS****",
                                "auth_source": "admin",
                                "read": {
                                    "mode": "primary_preferred"
                                },
                                "max_pool_size": 200,
                                "min_pool_size": 10,
                                "ssl_verify": false
                            },
                            "database": "pro_db",
                            "hosts": [
                                "PRIMARY_REPLICANODE.3.0.53:27017",
                                "SECONDARY_NODE0.3.62.61:27017",
                                "SECONDARY_NODE1.3.80.80:27017"
                            ]
                        }
                    }
                }
            },
  1. max_pool_size 的合适值是多少?每个 Mongo DB 节点都有大约 16 GiB 的 RAM 和 2 个虚拟 CPU。是否还有其他相关参数需要修改默认值?

  2. 具有不同参数的并发 API 请求存在性能问题。具有相同参数的 API 请求的平均响应时间为 11 毫秒,但一旦参数更改并并发,平均响应时间为 8904 毫秒。还有一些超时。我想知道可能导致问题的原因是什么?

具有相同参数的 API 请求 11 毫秒

不同参数的 API 请求 8904 毫秒

【问题讨论】:

  • 在评论任何有关性能的内容之前,应该考虑更多的事情。哪些查询需要更多时间,模式是什么?这些查询中使用了哪些参数?这些参数是否已编入索引?触发查询时 RAM 的使用情况是什么?磁盘 IOPS、复制延迟、写入和读取吞吐量等不同参数表示什么?在考虑了所有这些之后,您还应该考虑是否可以对您期望的查询模式进行分片(线性或散列)。

标签: ruby-on-rails mongodb mongoid


【解决方案1】:
  1. 应在应用程序配置中列出所有 MongoDB 主机。哪台服务器是主要的服务器会随着时间的推移而变化,例如在维护期间。如果应用程序仅引用一个服务器并且该服务器正在重新启动,则应用程序将无法定位任何其他服务器(其中一个可能是当前的主服务器)并且可能会遇到中断。

    驱动程序执行集群中节点的发现,如果它能够联系种子列表中的节点(这是配置中的服务器列表),那么将能够找出所有其他节点在集群中并遵循主要更改。但是,如果您碰巧重新启动了应用程序,并且当时它只引用了一台服务器并且该服务器已关闭,则该应用程序将无法找到其他服务器。

  2. 最大池大小是每个客户端将保留的最大打开连接数。 16 GB RAM 节点应该没有 200 个打开连接的问题。如果最大池大小设置得太小,应用程序可能会遇到错误,因为它将无法获得连接来执行操作。

    请注意,最大值 200 大致表明您希望同时执行大约 200 个操作,这对于典型的 Rails 应用程序来说似乎不太可能。但是,将最大值设置为 200 并没有什么问题。

  3. 鉴于您提供的详细信息,具体的性能问题无法真正回答。缩小花费在应用程序或数据库中的时间;如果它在数据库中花费,查询是什么以及它们有何不同。如果时间花在应用程序上,您通常必须自己分析应用程序,因为时间可能会花在很多可能性上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2012-11-07
    • 2021-08-31
    • 2017-08-22
    • 1970-01-01
    • 2011-06-30
    • 2012-08-18
    相关资源
    最近更新 更多