• mongo同步到es


    刚开始我找到的方案是利用 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的管理员权限。

             

  • 相关阅读:
    伪元素:placeholder-shown&&:focus-within
    伪元素:target
    伪元素:focus-within
    MpVue解析
    ESLint在vue中的使用
    vue动态 设置类名
    Java 文件流操作.
    SpringMVC 与 REST.
    基于Nginx和Zookeeper实现Dubbo的分布式服务
    基于Spring的RPC通讯模型.
  • 原文地址:https://www.cnblogs.com/liqing1009/p/8426651.html
Copyright © 2020-2023  润新知