单机搭建elasticsearch和mongodb river的数据同步

网上有许多elasticsearch和mongodb之间通过elasticsearch的mongodb-river插件建立管道的文章,这些文章都有一个要求:需要一个mongodb的集群,也就是需要至少两个mongodb的实例。原因也好理解:river插件是通过读取mongodb的oplog.rs这个表来同步mongodb中的更新的,而要oplog.rs只有在replicset中才能生效。所以

本文的重点也就变成了如何在一个mongodb的实例下搭建replicset环境了。

总之,三个步骤:
测试环境 elasticsearch 1.1.X + mongodb 2.4.6 + centos 6.5

搭建单机replicSet
安装mongodb-river插件
验证
搭建replicSet

这个问题其实网上已经有现成的方案了,略

这里摘录关键的两步:

1、配置/etc/mongodb.conf

增加两个配置:

replSet=rs0 #这里是指定replSet的名字
oplogSize=100 #这里是指定oplog表数据大小(太大了不支持)

2 初始化replicSet

rs.initiate( {"_id" : "rs0", "version" : 1, "members" : [ { "_id" : 0, "host" : "127.0.0.1:27017" } ]})

结果

搭建好replicSet之后,在mongo shell中的提示符会变成:

rs0:PRIMARY>
安装 mongodb-river插件

插件在此:
https://github.com/richardwilly98/elasticsearch-river-mongodb

基本上可以分为两步:

准备jar包
创建meta信息
1、两个必须的jar包(elasticsearch-river-mongodb-1.6.2-SNAPSHOT.jar和mongo-java-driver-2.10.1.jar)放到es_home/plugins/mongodb_river

其中mongodb_river是自定义的一个名字。

2、创建meta信息

curl -XPUT "localhost:9400/_river/mongodb_application/_meta" -d '
{
"type": "mongodb",
"mongodb": {
    "host": "localhost",
    "port": "27017",
    "db": "application",
    "collection": "page"
},
"index": {
    "name": "application",
    "type": "page"} }
'
主要分为三个部分:

type:river的类型,也就是“mongodb”

mongodb:mongodb的连接信息

index:elastisearch中用于接收mongodb数据的index和“type”。

验证结果

curl "http://localhost:9200/_river/mongodb_application/_meta"

验证

另外如果只想索引并同步部分字段可以这样

curl -XPUT "localhost:9200/_river/tbJobResume/_meta" -d '
{
"type": "mongodb",
"mongodb": {
    "host": "192.168.1.7",
    "port": "37017",
    "db": "MongoModelJobResume",
    "collection":"tbJobResume",
    "options":{
      "include_fields":["WorkMode","Phone","PositionIntends","WorkStatus","NetName"]
}
},
"index": {
    "name": "resume",
    "type": "tbJobResume"}
 }'

针对同样的表建不同的索引可以这样

curl -XPUT "localhost:9200/_river/tbJobResume2/_meta" -d '
{
"type": "mongodb",
"mongodb": {
    "host": "192.168.1.7",
    "port": "37017",
    "db": "MongoModelJobResume",
    "collection":"tbJobResume",
    "options":{
      "include_fields":["WorkMode","Phone","PositionIntends","WorkStatus","NetName"]
}
},
"index": {
    "name": "resume2",
    "type": "tbJobResume"}
 }'


在mongo里插入一条数据,在对应的elasticsearch里就会有相应的数据。

一个问题在river建立之后的数据变动会体现在elasticsearh里,但是river建立前的数据变动因为没有在oplog表里,所以不能被同步。我的解决方案是,遍历一次需要导出的表,重新插入到另外一个表里,然后将river指定到这个新表,这样新表的变动就可以全部体现在oplog里了。

遍历mongodb的表可以通过cursor来实现:


var myCursor = db.page.find( {  }, {html:0} );
myCursor.forEach(function(myDoc) {db.application.save(myDoc); });

其中page是老表,application是新表(database名字也叫application,不要弄错)


注:在单机上也可以通过运行多个mongod实例(指定不同的端口)构建mongodb replicSet,同在多台服务器搭建类似

你可能感兴趣的:(数据与性能,搜索引擎)