刚开始我找到的方案是利用 ElasticSearch 的 来同步数据,并在 GitHub 上到了 MongoDB River 插件:。但是,随后我又在 ElasticSearch 官网上看了这篇博客:,官方已经在 1.5 以后的版本弃用 River,为了用户的迁移,会一直保留到 2.0 版本。
于是,我得另寻方案了。然后我又在网上找到了另外一个方案:。这个是 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的管理员权限。