在 GCE 中使用 StackDriver 监控 MongoDB 3

在 GCE 中使用 StackDriver 监控 MongoDB 3

是否有人成功地使用 GCE 中的 StackDriver 监控 MongoDB 3 集群(或独立数据库)?

我在 GCE 中设置了一个 MongoDB 3.0.6 集群(副本集有 2 个副本和 1 个仲裁器)

我正在尝试通过 Google 提供的 StackDriver 来监控它。

我已按照此处的所有说明安装监控代理和 mongodb 插件: https://cloud.google.com/monitoring/agent/plugins/mongodb

当我在配置它的副本上启动代理时:

sudo /etc/init.d/stackdriver-agent restart

我在 /var/log/syslog 中收到以下错误:

collectd[6013]: tcpconns plugin: Reading from netlink succeeded. Will use the netlink method from now on.
collectd[6013]: mongo plugin: Authenticating to localhost:27017 failed:
collectd[6013]: mongo plugin: Connecting to localhost:27017 failed:
collectd[6013]: read-function of plugin `mongodb' failed. Will suspend it for 120.000 seconds.

我怀疑 StackDriver 代理与 MongoDB 3 不兼容,因为:

  • 过去,我曾使用 GCE 的 Click-to-deploy 功能创建集群,并能够使用 StackDriver 对其进行监控。当时使用的是 MongoDB 2.6.x。

  • 我很快再次设置了 MongoDB 2.6.x 的独立安装,以相同的方式配置了 StackDriver 代理,并且......它可以正常工作 :-(

任何帮助都将不胜感激。

配置详情:

MongoDB:

  • 身份验证=真

  • 在数据库管理员中,具有角色的用户:dbAdminAnyDatabase、clusterAdmin 和 readAnyDatabase

Stackdriver Mongodb插件:

  • /opt/stackdriver/collectd/etc/collectd.d/mongodb.conf 中使用的用户和密码

附加信息 :

沒有授權:插件初始化成功地

/etc/mongod.conf:

# Turn on/off security.  Off is currently the default
#noauth = true
#auth = true

/opt/stackdriver/collectd/etc/collectd.d/mongodb.conf:

LoadPlugin mongodb

<Plugin "mongodb">
    Host "localhost"
    Port "27017"

   #  If you restricted access to the database, you can
   #  set the username and password here
   #  User "user_name"
   #  Password "user_password"

   # For performance/eventually consistent trade-offs you may add this line
   # PreferSecondaryQuery true
</Plugin>

身份验证模式:重新启动代理时出现身份验证错误

/etc/mongod.conf:

# Turn on/off security.  Off is currently the default
#noauth = true
auth = true

配置了 3 个用户

use admin
db.createUser(
  {
    user: "siteUserAdmin",
    pwd: "xxx",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

db.auth("siteUserAdmin", "xxx");

db.createUser( {
    user: "siteRootAdmin",
    pwd: "xxx",
    roles: [ { role: "root", db: "admin" } ]
  });

db.createUser(
  {
    user: "monitoring",
    pwd: "xxx",
    roles: [ 
    { role: "dbAdminAnyDatabase", db: "admin" },
    { role: "clusterAdmin", db: "admin" },
    { role: "readAnyDatabase", db: "admin" } ]
  }
)

/opt/stackdriver/collectd/etc/collectd.d/mongodb.conf:

LoadPlugin mongodb

<Plugin "mongodb">
    Host "localhost"
    Port "27017"

   #  If you restricted access to the database, you can
   #  set the username and password here
   User "monitoring"
   Password "xxx"

   # For performance/eventually consistent trade-offs you may add this line
   # PreferSecondaryQuery true
</Plugin>

当我在插件配置中使用 siteRootAdmin 时出现同样的错误。

解释和解决方案

罪魁祸首实际上是 StackDriver 代理使用的身份验证模式

我适应了Adam C 建议的解决方案,因为我已经使用 SCRAM-SHA-1 模式创建了用户。

其实我只需要监控的用户使用MONGODB-CR就可以了。

要做到这一点:

使用以下命令重新启动 MongoDB 3.0授权已禁用

连接到实例

将身份验证模式暂时更改为 MONGODB-CR

use admin
var schema = db.system.version.findOne({"_id" : "authSchema"});
schema.currentVersion = 3;
db.system.version.save(schema);

为 StackDriver 插件创建用户

db.createUser(
      {
        user: "monitoring",
        pwd: "xxx",
        roles: [ 
        { role: "dbAdminAnyDatabase", db: "admin" },
        { role: "clusterAdmin", db: "admin" },
        { role: "readAnyDatabase", db: "admin" } ]
      }
    )

检查它具有正确的身份验证模式:MONGODB-CR

> db.system.users.find({"user":"monitoring"})
{ "_id" : "admin.monitoring", "user" : "monitoring", "db" : "admin", "credentials" : { "MONGODB-CR" ...

将身份验证架构重新设置为 SCRAM-SHA-1

var schema = db.system.version.findOne({"_id" : "authSchema"});
schema.currentVersion = 5;
db.system.version.save(schema);

使用以下命令重新启动 MongoDB 3.0已启用身份验证

重启 StackDriver 代理

当 StackDriver 支持 SCRAM-SHA-1 时,升级此用户的身份验证架构将会很有用

db.adminCommand({authSchemaUpgrade: 1});

答案1

我怀疑 Stack Driver 还不支持新的SCRAM-SHA-1身份验证机制。这种新机制在 3.0 版中新增来替代MONGODB-CR并在 3.0+ 中成为默认设置,但是它要求驱动程序支持新机制。

要让 MongoDB 3.0 使用旧机制,您可以从 2.6 开始并在其中创建用户,然后升级,或者您可以执行以下操作(基于此评论):

  • 启动 MongoDB 3.0 并禁用身份验证(确保尚未添加任何用户)
  • 连接到实例并运行以下命令:

    var schema = db.system.version.findOne({"_id" : "authSchema"}); schema.currentVersion = 3; db.system.version.save(schema);

  • 启动 MongoDB 并启用身份验证并创建用户

现在应该使用 创建这些用途MONGODB-CR。 StackDriver 正在使用libmongoc,它自 起支持 SCRAM-SHA-1版本 1.1但根据 Github 浏览,他们的版本看起来要旧得多。一旦他们更新了驱动程序,这个问题就会消失 - 现在你必须解决这个问题。

答案2

我在 Google 从事 Stackdriver 代理工作。Adam C 的回答是正确的。我最近一直在研究这个问题,现在我们有一个测试版,在我们自己的测试中运行良好。这个新版本不仅解决了 SCRAM-SHA-1 问题,而且还有一些性能改进。在更广泛地发布它之前,我们希望有机会在几个客户环境中对其进行测试。

如果有人愿意成为我们新版本代理的 beta 测试员,我可以安排向您提供适合您平台的 .deb 或 .rpm 文件。一如既往,可能会出现一些小问题,所以我认为只有在您有可以尝试的非生产环境时,这才有意义。

编辑:截至 2016 年 7 月 12 日,此更改现已在生产中可用!

相关内容