Sitecore/xDB/MongoDB 仲裁实例接收应用程序帐户连接尝试

Sitecore/xDB/MongoDB arbiter instance receiving application account connection attempts

我有一个 Sitecore 8 测试环境,其中包含三个 mongo 2.6.5 xDB 实例。这些被配置为使用具有两个服务器 'mongotest1' & 'mongotest2' 和一个仲裁器 'mongotest3' 的密钥文件的复制集。已在 mongo 中为 Web 应用程序创建了一个非管理员帐户,该帐户存储在管理员数据库中,在所有五个 xDB 数据库中都具有读写权限。我的 sitecore 连接字符串的格式为:

connectionString="mongodb://webapp:password@mongotest1:27018,mongotest2.local:27019/sc8-tracking-history?replicaSet=repSet1&authSource=admin

注意连接字符串中没有指定仲裁器,这是正常的。

rs.status() 给出以下内容,看起来是正确的:

"date" : ISODate("2015-07-23T16:47:08Z"),
"myState" : 2,
"syncingTo" : "mongotest1.local:27018",
"members" : [
        {
                "_id" : 0,
                "name" : "mongotest1.local:27018",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 93,
                "optime" : Timestamp(1437668096, 1),
                "optimeDate" : ISODate("2015-07-23T16:14:56Z"),
                "lastHeartbeat" : ISODate("2015-07-23T16:47:07Z"),
                "lastHeartbeatRecv" : ISODate("2015-07-23T16:47:08Z"),
                "pingMs" : 0,
                "electionTime" : Timestamp(1437669503, 1),
                "electionDate" : ISODate("2015-07-23T16:38:23Z")
        },
        {
                "_id" : 1,
                "name" : "mongotest2.local:27019",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 93,
                "optime" : Timestamp(1437668096, 1),
                "optimeDate" : ISODate("2015-07-23T16:14:56Z"),
                "infoMessage" : "syncing to: mongotest1.local:27018",
                "self" : true
        },
        {
                "_id" : 2,
                "name" : "mongotest3.local:27020",
                "health" : 1,
                "state" : 7,
                "stateStr" : "ARBITER",
                "uptime" : 91,
                "lastHeartbeat" : ISODate("2015-07-23T16:47:07Z"),
                "lastHeartbeatRecv" : ISODate("2015-07-23T16:47:07Z"),
                "pingMs" : 0
        }
],
"ok" : 1

三个mongo实例启动后,观察日志输出正常。但是,在 Sitecore Web 应用程序连接到 mongo 之后,我看到使用 'webapp' 帐户连接到仲裁服务的尝试失败了,因为仲裁程序没有定义任何用户帐户的管理数据库。如果我关闭 mongotest1 和 mongotest2 实例,这种情况的频率会增加。如果我关闭 Sitecore,连接尝试就会停止。

2015-07-23T18:02:42.741+0100 [conn699] end connection 127.0.0.1:62206 (2 connections now open)
2015-07-23T18:02:43.610+0100 [conn689] end connection 127.0.0.1:62193 (1 connection now open)
2015-07-23T18:02:43.611+0100 [initandlisten] connection accepted from 127.0.0.1:62207 #700 (3 connections now open)
2015-07-23T18:02:43.613+0100 [conn700]  authenticate db: local { authenticate: 1, nonce: "xxx", user: "__system", key: "xxx" }
2015-07-23T18:02:43.890+0100 [initandlisten] connection accepted from 127.0.0.1:62208 #701 (3 connections now open)
2015-07-23T18:02:43.891+0100 [conn701]  authenticate db: admin { authenticate: 1, user: "webapp", nonce: "xxx", key: "xxx" }
2015-07-23T18:02:43.891+0100 [conn701] Failed to authenticate webapp@admin with mechanism MONGODB-CR: AuthenticationFailed UserNotFound Could not find
 user webapp@admin

为什么会这样?仲裁器不应接收来自客户端的任何连接尝试。就好像副本集正在共享与 Web 应用程序的仲裁连接,然后调用一些连接尝试。

这是一个已知的 c-sharp 驱动程序问题,请参阅 https://jira.mongodb.org/browse/CSHARP-851

情况的某些方面是特定于 Sitecore 版本的 - 捆绑驱动程序 (v1.8.3.9) 似乎略早于随 v2.6.5 发布的驱动程序,这意味着它早于修复。

Sitecore 8 更新 5 更新 Mongo 并包含修复程序。或者,可以通过 upgrading the bundled MongoDB.Driver.dll to v1.9 并将程序集重定向添加到 web.config.

来实现最小修复

我在 http://blog.paulgeorge.co.uk/2016/01/26/sitecore-mongo-arbiter-shows-failed-authentication-attempts/

上发布了此答案的更详细版本