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的管理員權限。

         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM