最近一个项目要求部署Elasticsearch+mongdb,感觉是一个比较简单的事,却遇到了不少的坑。客户的数据库有5万多条数据,大小共60多G的文档。
先说明步骤:
1、安装Elasticsearch和elasticsearch-river-mongodb,就不多说了,按照随下官方说明安装即可(https://github.com/richardwilly98/elasticsearch-river-mongodb/wiki)。
2、增量导入
先导入30%文档到mongodb,然后启动Elasticsearch服务,通过river插件自动同步到Elasticsearch服务器。
完成后,再导入30%文档到mongodb,这时候不需要关闭Elasticsearch,让它自动同步。
一直增量导入,直到完成。
遇到的坑
1、不能连接远程mongodb。
原来之前mongodb初始化副本集都是本地模式,如下图 : 127.0.0.1一定要换成具体IP,否则远程不能连接。
rs.initiate({“_id” : “rs0”,”members” : [{“_id” : 0,”host” : “127.0.0.1:27017”}]})
2、第一次初始化ES时很顺利,再次增量时,报River out of sync with oplog.rs collection。
由于mongodb oplog大小太小。官方建议100MB,如果硬盘足够,可以扩展到10-20G,修改oplog大小,百度一下 。
3、每次同步到某个文档时,就失败,具体错误忘了,应该也是内存溢出之类的。
后来发现,文档中居然有3G多的文档,这个文档肯定同步不到Elasticsearch里。只有修改river的源码了 ,修改org.elasticsearch.river.mongodb.util.MongoDBHelper.serialize()方法,增加大小判断,如果大于50MB,就不同步内容到Elasticsearch。重新编译并拷贝到Elasticsearch插件里。
Long maxLength=50000000L;
if(file.getLength()<maxLength){
try (InputStream stream = file.getInputStream()) {
while ((nRead = stream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
}
encodedContent=Base64.encodeBytes(buffer.toByteArray());
buffer.close();
}