当MongoDB中的数据未能同步到Elasticsearch时,可以采取以下解决方法

通过使用 Elasticsearch 的 MongoDB River 插件,可以将 MongoDB 的数据同步到 ElasticSearch 中。
然而,在进行同步设置之后,如果在 MongoDB 中添加了新的列,这些更改不会反映到 ElasticSearch 中。为了解决这个问题,我会写下对应的解决方法。

使用过的版本

    • MongoDB 2.4.9

 

    • Elasticsearch 1.1.1

 

    • MongoDB River Plugin 2.0.0

 

    • Attachments Plugin 2.0.0

 

    Kuromoji Analysis Plugin 2.1.0

停止同步的步骤

简单来说,似乎无法以 Elasticsearch -> MongoDB 的顺序启动服务器。

    1. 启动MongoDB并添加列

 

    1. 停止MongoDB

 

    1. 启动Elasticsearch

 

    日志出现错误
[2014-10-31 13:34:09,356][WARN ]    [org.elasticsearch.river.mongodb.MongoDBRiver] Fail to start river portal
com.mongodb.MongoException: can't find a master
        at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:517)
    1. 启动MongoDB

 

    Elasticsearch 中未添加列

如果按照此顺序启动一次,即使以3和4进行了切换顺序重新启动,也无法同步,并在Elasticsearch启动过程中出现状态错误。

[2014-10-31 13:45:08,028][INFO ][org.elasticsearch.river.mongodb.MongoDBRiver] Starting river portal
[2014-10-31 13:45:08,031][ERROR][org.elasticsearch.river.mongodb.MongoDBRiver] Cannot start river portal. Current status is START_FAILED

应对方法(1)

我认为这可能是正确的方法。

1. 删除_riverstatus

curl -XDELETE 'http://localhost:9200/_river/testdb/_riverstatus'

停止 Elasticsearch

curl -XPOST 'http://localhost:9200/_shutdown'

– 启动 Elasticsearch

elasticsearch -d

处理方法(2)

即使强制全部重做,还是能修好的。

-0. 请确认当前的设置

$ curl -XGET "http://localhost:9200/_river/testdb/_meta" 

-1. 删除Elasticsearch侧的数据库

$ curl -XDELETE 'http://localhost:9200/testdb'

– 删除Elasticsearch的River

$ curl -XDELETE 'http://localhost:9200/_river'

重新设置MongoDB River插件的配置。

$ curl -XPUT "localhost:9200/_river/testdb/_meta" -d '
{
  "type": "mongodb",
  "mongodb": {
    "db": "testdb",
    "servers": [
      { "host": "127.0.0.1", "port": 27101 },
      { "host": "127.0.0.1", "port": 27102 }
    ],
    "options": { "secondary_read_preference": true, "import_all_collections": true }
  },
  "index": { "name": "testdb" }
}'