当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 的顺序启动服务器。
-
- 启动MongoDB并添加列
-
- 停止MongoDB
-
- 启动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)
-
- 启动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" }
}'