刚开始我找到的方案是利用 ElasticSearch 的 River 来同步数据,并在 GitHub 上到了 MongoDB River 插件:elasticsearch-river-mongodb。但是,随后我又在 ElasticSearch 官网上看了这篇博客:《Deprecating Rivers》,官方已经在 1.5 以后的版本弃用 River,为了用户的迁移,会一直保留到 2.0 版本。

于是,我得另寻方案了。然后我又在网上找到了另外一个方案:mongo-connector。这个是 MongoDB 官方的开发人员用 Python 写的一个工具,目前支持将 MongoDB 的数据同步到 Solr、ElasticSearch、MongoDB 中,并且支持用户自己扩展。

首先安装工具

yum install python-setuptools

easy_install pip

pip install cryptography

pip install "setuptools>=11.3"

pip install "elasticsearch>=6.1.0"

pip install mongo-connector

pip install elastic2-doc-manager

然后mongo开启副本集,配置文件设置

vim mongodb.conf

replSet=es                #设置副本集名称

/ali/mongodb/bin/mongod -f /ali/mongodb/conf/mongodb.conf    #启动mongo

es:PRIMARY> rs.initiate()               #进入mongo,初始化副本集

es:PRIMARY> rs.config()                #查看副本集配置文件

es:PRIMARY> rs.status()                #查看副本集状态

es:PRIMARY> rs.status()
{
"set" : "es",
"date" : ISODate("2018-02-07T06:54:20.832Z"),
"myState" : 1,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "iZwz9amcsywc3lxhketqdpZ:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1463,
"optime" : {
"ts" : Timestamp(1517985382, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-02-07T06:36:22Z"),
"electionTime" : Timestamp(1517984997, 1),
"electionDate" : ISODate("2018-02-07T06:29:57Z"),
"configVersion" : 1,
"self" : true
}
],
"ok" : 1
}

mongo-connector -m 127.0.0.1:27017 -t 127.0.0.1:9200 -d elastic2_doc_manager          #启动同步服务

mongoDB需要用户名密码,使用下面的命令

mongo-connector -a root -p 123456 -m 127.0.0.1:27017 -t 127.0.0.1:9200 -d elastic2_doc_manager -n KYElog.*    #说明,连接账户必须要超级管理员的权限 mongodb的root权限才行

mongo-connector -m 127.0.0.1:27017 -t 127.0.0.1:9200 -a username -p password -d elastic2_doc_manager

-a mongodb用户名 
-p mongodb密码

ES与MongoDB Insert插入操作的同步验证

(1)Mongo端插入数据操作:

#Mongo创建数据库(对应ES的Index)
rs0:PRIMARY> use kyelog #Mongo中插入数据(其中col_02对应ES中的Type)
rs0:PRIMARY> db.col_02.insert({name:"laoluo", birth:"1964-03-21", sex:"man", company:"chuizi"});
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.col_02.insert({name:"renzhengfei", birth:"1954-03-21", sex:"man", company:"huawei"}); 查看是否同步到es curl -XGET http://127.0.0.1:9200/kyelog/col_02/_search?pretty

然后更新数据或者删除数据,查看es是否相应更改

导入mongodb中的数据到Elasticsearch集群

在安装了monog-connector的机子的命令行中执行下面的命令(该命令为测试时的真实命令)。

mongo-connector --auto-commit-interval=0 -m ip_addr1:27018 -t ip_addr2:9200 -d elastic2_doc_manager -n db.collection

mongo-connector命令主要参数解析:

-m   mongodb_host:port    —— 数据源地址,mongodb数据库地址。
-t target_host:port —— 数据目的地地址,elasticsearch/solr/mongodb集群地址。建议为集群中的协调节点的地址。
-d xxx_doc_manager —— 数据目的地的document类型。例如:
将mongodb中的数据同步到elasticsearch,使用elastic_doc_manager或elastic2_doc_manager。
将mongodb中的数据同步到solr,使用solr_doc_manager。
将mongodb中数据同步到其他mongodb,使用mongo_doc_manager。
-n db.collection ... —— 待同步的数据库及其collection。默认同步所有数据库。
-i filed_name ... —— 待同步的字段。默认同步所有字段。
-o mongodb_oplog_position.oplog —— mongo-connector的oplog。默认在mongo-connector命令执行目录下创建oplog.timestamp文件。
建议重新分配存储位置(也可重新分配存储文件名),例如 /opt/mongo-connector.oplog。
--auto-commit-interval —— 数据同步间隔。默认在不同系统上有不同的值。设置为0表示mongodb中的任何操作立即同步到数据目的地。
--continue-on-error —— 一条数据同步失败,日志记录该失败操作,继续后续同步操作。默认为中止后续同步操作。 其他参数包括设置日志输出行为(时间、间隔、路径等)、设置mongodb登录账户和密码、设置(数据目的地)Http连接的证书等、设置mongo-connector的配置文件

使用mongo-connector同步数据注意事项

1. mongodb必须开启副本集(Replica Set)。开启副本集才会产生oplog,副本拷贝主分片的oplog并通过oplog与主分片进行同步。
mongo-connector也是通过oplog进行数据同步,故必须开启副本集。 2. 使用mongo-connector命令同步数据时,-m参数中的mongodb地址应该是主/从分片的地址,
从该地址登录可以看见并操作local数据库(oplog存储在local.oplog.rs);不能使用mongoos地址。 3. 使用mongo-connector命令同步数据时 ,mongo-connector的oplog(参照-o参数)不能随便删除,
否则会引起重新同步所有数据的问题。该问题可以通过--no-dump选项关闭。 4. 生产环境下建议将mongo-connector配置为系统服务,运行mongo-connector时采用配置文件的方式。

踩过的坑

1. 数据库A中有多个集合(A1, A2, A3),且已开启了副本集(Replica Set),但是集合A1可以同步,集合A2不能同步.
原因:oplog中有A1的操作记录,没有A2的操作记录。
结论:开启副本集(Replica Set)并不能保证一定能同步,oplog中必须包含待同步集合的操作记录,才能通过mongo-connector同步到Elasticsearch集群。 2. mongodb3.x版本加强了安全机制,导致了在只拥有某个库的权限时不能同步数据的问题。
原因:拥有某个库的权限,并不能拥有oplog的读取权限,而mongo-connector需要读取oplog的权限。
结论:同步数据至少需要能够读取oplog的权限,确保当前mongodb用户的权限能够操作oplog,或者直接使用mongodb的管理员权限。

mongo同步到es的更多相关文章

  1. Mongo同步数据到Elasticsearch

    个人博客:https://blog.sharedata.info/ 最近需要把数据从Mongo同步到Elasticsearch环境:centos6.5python2.7pipmongo-connect ...

  2. 数据源、数据集、同步任务、数据仓库、元数据、数据目录、主题、来源系统、标签、增量识别字段、修改同步、ES索引、HBase列族、元数据同步、

    数据源.数据集.同步任务.数据仓库.元数据.数据目录.主题.来源系统.标签. 增量识别字段.修改同步.ES索引.HBase列族.元数据同步.DS.ODS.DW.DM.zk集群地址 == 数据源 数据源 ...

  3. MySQL数据以全量和增量方式,同步到ES搜索引擎

    本文源码:GitHub·点这里 || GitEE·点这里 一.配置详解 场景描述:MySQL数据表以全量和增量的方式向ElasticSearch搜索引擎同步. 1.下载内容 elasticsearch ...

  4. mongo批量写入es

    import pymongo import math from elasticsearch import Elasticsearch from elasticsearch import helpers ...

  5. Hive表数据同步到es

    1.首先服务器节点,进入到对应的数据库.2. 然后找到要同步的表,show create table + 表名查看一下或者自己可以新建一个表,用来测试原表,如下 CREATE TABLE `wb_tm ...

  6. elasticsearch+logstash_jdbc 实现mysql数据实时同步至es

    jdk安装1.8版本,es.ls.ik.kibana版本一致我这里使用的6.6.2版本 安装es tar xf elasticsearch-6.6.2.tar.gz mv elasticsearch- ...

  7. MongoDB——mongo-connector同步到ES

    1.搭建完毕MongoDb复制集环境 2.开始安装 mongo-connector pip install mongo-connector:基于pip命令,不管是linux .window 系统默认有 ...

  8. 使用logstash同步MySQL数据到ES

    使用logstash同步MySQL数据到ES 版权声明:[分享也是一种提高]个人转载请在正文开头明显位置注明出处,未经作者同意禁止企业/组织转载,禁止私自更改原文,禁止用于商业目的. https:// ...

  9. logstash-input-jdbc实现mysql 与elasticsearch实时同步(ES与关系型数据库同步)

    引言: elasticsearch 的出现使得我们的存储.检索数据更快捷.方便.但很多情况下,我们的需求是:现在的数据存储在mysql.oracle等关系型传统数据库中,如何尽量不改变原有数据库表结构 ...

随机推荐

  1. 浅谈GIT

    浅谈GIT: 牛老师提出的git,于我而言,是一个陌生和新鲜的词汇,在此之前我从未听过git,按照老师的要求,我去搜索了关于git的介绍,有些看懂了,但大部分还是不懂得,在介绍中我了解git其实之前使 ...

  2. matconvnet编译

    1.安装matconvnet 网上教程很多 2.编译 cd matconvnet/ addpath matlab/ vl_compilenn('enableGpu',true,'cudaRoot',' ...

  3. HDU 3853 LOOPS 期望dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3853 LOOPS Time Limit: 15000/5000 MS (Java/Others)Me ...

  4. 【图论】POJ-3723 最大生成树

    一.题目 Description Windy has a country, and he wants to build an army to protect his country. He has p ...

  5. sleep与信号唤醒的问题 & 内核对信号的处理方式 & udelay

    http://www.cnblogs.com/charlesblc/p/6277848.html 注意,sleep是会被信号唤醒的.   sleep函数:#include <unistd.h&g ...

  6. rpm安装和二进制安装

    rpm包安装 Tomcat RPM安装(先安装JDK + 再安装Tomcat) 1:升级系统自带的JDK(也可以使用oracle的JDK) yum install -y java-1.8.0-open ...

  7. 弹出提示框的方式——java

    1.显示一个错误对话框,该对话框显示的 message 为 'alert': JOptionPane.showMessageDialog(null, "alert", " ...

  8. Alpha阶段事后诸葛分析

    一.设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是解决在宿舍中购买商品的软件,不同于淘宝等软件,本软件主要是用于学生开设的店铺及宿 ...

  9. 软工网络15团队作业8——Beta阶段敏捷冲刺(day1)

    第 1 篇 Scrum 冲刺博客 1. 介绍小组新加入的成员,Ta担任的角色 --给出让ta担当此角色的理由 小组新加入的成员:3085叶金蕾 担任的角色:测试/用户体验/开发 理由:根据小组讨论以及 ...

  10. SQL中字符串截取、连接、替换等函数的用法

    一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...