個人博客:https://blog.sharedata.info/
最近需要把數據從Mongo同步到Elasticsearch
環境:
centos6.5
python2.7
pip
mongo-connector
安裝:
pip install elastic2-doc-manager[elastic5]
pip install mongo-connector[elastic5]
命令參數:
-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 —— 一條數據同步失敗,日志記錄該失敗操作,繼續后續同步操作。默認為中止后續同步操作。
同步注意實現:
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時采用配置文件的方式
es注意實現:
在同步的時候會創建mongodb_meta索引,以便跟蹤最后一次修改的文檔,用於在復制集回滾事件中解決沖突,但保存在單獨的索引中,方面在必須要的時候刪除
事例:
mongo-connector --auto-commit-interval=0 -m localhost:27017 -t localhost:9200 -n db.table -d elastic2_doc_manager
同步中遇到錯誤:
2017-07-03 09:49:47,723 [ALWAYS] mongo_connector.connector:51 - Starting mongo-connector version: 2.5.1 2017-07-03 09:49:47,724 [ALWAYS] mongo_connector.connector:51 - Python version: 2.7.10 (default, May 23 2017, 18:33:08) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] 2017-07-03 09:49:47,724 [ALWAYS] mongo_connector.connector:51 - Platform: Linux-2.6.32-504.el6.x86_64-x86_64-with-centos-6.6-Final 2017-07-03 09:49:47,724 [ALWAYS] mongo_connector.connector:51 - pymongo version: 3.4.0 2017-07-03 09:49:47,729 [ALWAYS] mongo_connector.connector:51 - Source MongoDB version: 3.2.6 2017-07-03 09:49:47,729 [ALWAYS] mongo_connector.connector:51 - Target DocManager: mongo_connector.doc_managers.elastic2_doc_manager version: 0.3.0 2017-07-03 09:49:47,826 [ERROR] mongo_connector.oplog_manager:202 - OplogThread: Last entry no longer in oplog cannot recover! Collection(Database(MongoClient(host=[u'192.168.1.130:27018', u'192.168.1.137:27019', u'192.168.1.132:27017'], document_class=dict, tz_aware=False, connect=True, replicaset=u'shard1'), u'local'), u'oplog.rs') 2017-07-03 09:49:48,382 [ERROR] mongo_connector.connector:420 - MongoConnector: OplogThread <OplogThread(Thread-3, stopped 139942650967808)> unexpectedly stopped! Shutting down
解決方案:需要重新開始同步,刪除分片信息