如何为 mongodb 副本集配置 grails 3

Posted

技术标签:

【中文标题】如何为 mongodb 副本集配置 grails 3【英文标题】:How to configure grails 3 for mongodb replicaset 【发布时间】:2017-09-01 11:50:11 【问题描述】:

我正在将 grails 3 应用程序部署到实时服务器。一个 mongodb 实例已设置为复制模式,并在 live box 中成功测试。我测试过:

mongo -u uname -authenticationDatabase dbname ip-1.ec2.internal:27017/dbname -p password

我使用了replicaSetconnectionString 指定的here 和here。但在这两种情况下,它的行为都好像没有提供主机配置,因此默认为 localhost。而且由于没有设置它失败。这是 application.groovy

mongodb 
            replicaSet = [ "ip-1.ec2.internal", "ip-12.ec2.internal", "ip-3.ec2.internal"]
            host = "ip-1.ec2.internal" //This works for any of the hosts
            port = 27017
            username = "username"
            password = "password"
            databaseName = "dbname"
        

我使用的是最新版本:

grailsVersion=3.2.8 //It was the same for 3.2.5
gormVersion=6.0.9.RELEASE
gradleWrapperVersion=3.4.1 //It was the same for 3.0

以下是插件列表及其版本:

compile 'org.grails.plugins:mongodb:6.1.0'
compile 'org.grails:grails-datastore-rest-client:6.0.9.RELEASE'

这是我遇到的错误:

01:22:26.410 - [localhost-startStop-1] INFO  org.mongodb.driver.cluster - No server chosen by 
ReadPreferenceServerSelectorreadPreference=primary from cluster description ClusterDescriptiontype=UNKNOWN, connectionMode=SINGLE, 
all=[ServerDescriptionaddress=127.0.0.1:27017, type=UNKNOWN, state=CONNECTING, exception=com.mongodb.MongoSecurityException: 
Exception authenticating MongoCredentialmechanism=null, userName='username', source='dbname', password=<hidden>, 
mechanismProperties=, caused by com.mongodb.MongoCommandException: Command failed with error 18: 
'Authentication failed.' on server 127.0.0.1:27017. The full response 
is  "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." ]. Waiting for 30000 ms before timing out

我现在已经用完了选项,有人可以在这里指点帮助我吗?谢谢。

【问题讨论】:

这是文档gorm.grails.org/latest/mongodb/manual/index.html#advancedConfig。我看不到任何关于能够以这种方式指定副本集的信息。我想你只需要设置 url 字符串 @JamesKleeh 谢谢,效果很好。 【参考方案1】:

James Kleeh 建议的 connection strings 解决了这个问题。这就是我参考example 使用它的方式:

mongodb 
    url = "mongodb://ip-1.ec2.internal,ip-2.ec2.internal,ip-3.ec2.internal/?replicaSet=hostname-of-mongod-instance"
    port = 27017
    ...

【讨论】:

以上是关于如何为 mongodb 副本集配置 grails 3的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个 url 配置 grails/spring 身份验证方案?

如何为登录GRAILS(Spring security)的用户实现会话?

如何为 .NET 应用程序域重新加载程序集?

配置MongoDB副本集

数据流 ReadFromBigQuery 转换 - 如何为临时表配置位置

如何为同一个类对象的成员函数保留单独的变量副本?