1. 程式人生 > >mongo-connector實現MongoDB與elasticsearch實時同步深入詳解

mongo-connector實現MongoDB與elasticsearch實時同步深入詳解

引言:

驗證表明:mongo-connector工具支援MongoDB與ES之間的實時增insert、刪delete、改update操作。
對於歷史資料,mongo-connector工具不能同步到ES中,根因是本身工具不支援(初步界定),還是沒有這種場景,待查(進一步研究後再更新)。

1. mongo-connector 地址:

2、 mongo-connector 工具簡介

mongo-connector工具建立一個從MongoDB簇到一個或多個目標系統的管道,目標系統包括:Solr,Elasticsearch,或MongoDB簇。
該工具在MongoDB與目標系統間同步資料,並跟蹤MongoDB的oplog,保持操作與MongoDB的實時同步。
該工具已經在python2.6,2.7,3.3+下進行驗證。
mongo-connector工具是基於python開發的實時同步服務工具。它要求mongo執行在replica-set模式,且需要 elastic2_doc_manager將資料寫入ES。
這裡寫圖片描述

3、 elastic2-doc-manager 工具簡介

這是Elastic2.x版本的文件管理器。對應Elastic1.x版本需要使用 elastic-doc-manager。

4、ES與MongoDB同步步驟:

(1)安裝 mongo-connector。

pip install mongo-connector

(2)安裝 elastic2-doc-manager。

pip install elastic2-doc-manager

注意:
如果不安裝(2)直接進入(3)、(4)則會報錯:

[root@5b9dbaaa148a bin]# mongo-connector -m 10.8.5.99:27017 -t 10.8.5.101:9200 -d elastic2_doc_manager
Logging to mongo-connector.log. Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner self.run()

(3)mongo端啟動

MongoDB 必須開啟複製集,如果已經開啟請忽略這一步:

1)通過 –replSet 設定副本集名稱。

[root@b48eafd69929 bin]# ./mongod --replSet "rs0"

2)將mongo與副本整合員連線

[[email protected] bin]# ./mongo
MongoDB shell version: 3.2.4
connecting to: test
Server has startup warnings:
2016-07-05T09:49:01.330+0100 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2016-07-05T09:49:01.330+0100 I CONTROL [initandlisten]
2016-07-05T09:49:01.331+0100 I CONTROL [initandlisten]
2016-07-05T09:49:01.331+0100 I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine.
2016-07-05T09:49:01.331+0100 I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems:
2016-07-05T09:49:01.332+0100 I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options]
2016-07-05T09:49:01.332+0100 I CONTROL [initandlisten]
2016-07-05T09:49:01.332+0100 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-07-05T09:49:01.332+0100 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2016-07-05T09:49:01.332+0100 I CONTROL [initandlisten]
2016-07-05T09:49:01.332+0100 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-07-05T09:49:01.332+0100 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2016-07-05T09:49:01.332+0100 I CONTROL [initandlisten]

3)初始化副本集

> rs.initiate()
{
  "info2" : "no configuration specified. Using a default configuration for the set",
  "me" : "b48eafd69929:27017",
  "ok" : 1
}

4)【驗證】初始化副本集的配置

rs0:SECONDARY> rs.conf()
{
  "_id" : "rs0",
  "version" : 1,
  "protocolVersion" : NumberLong(1),
  "members" : [
  {
  "_id" : 0,
  "host" : "b48eafd69929:27017",
  "arbiterOnly" : false,
  "buildIndexes" : true,
  "hidden" : false,
  "priority" : 1,
  "tags" : {

  },
  "slaveDelay" : NumberLong(0),
  "votes" : 1
  }
  ],
  "settings" : {
  "chainingAllowed" : true,
  "heartbeatIntervalMillis" : 2000,
  "heartbeatTimeoutSecs" : 10,
  "electionTimeoutMillis" : 10000,
  "getLastErrorModes" : {

  },
  "getLastErrorDefaults" : {
  "w" : 1,
  "wtimeout" : 0
  },
  "replicaSetId" : ObjectId("577b74bd0ba41a313110ad62")
  }
}

5)【驗證】副本集的狀態。

rs0:PRIMARY> rs.status()
{
  "set" : "rs0",
  "date" : ISODate("2016-07-05T08:50:55.272Z"),
  "myState" : 1,
  "term" : NumberLong(1),
  "heartbeatIntervalMillis" : NumberLong(2000),
  "members" : [
  {
  "_id" : 0,
  "name" : "b48eafd69929:27017",
  "health" : 1,
  "state" : 1,
  "stateStr" : "PRIMARY",
  "uptime" : 115,
  "optime" : {
  "ts" : Timestamp(1467708606, 1),
  "t" : NumberLong(1)
  },
  "optimeDate" : ISODate("2016-07-05T08:50:06Z"),
  "infoMessage" : "could not find member to sync from",
  "electionTime" : Timestamp(1467708605, 2),
  "electionDate" : ISODate("2016-07-05T08:50:05Z"),
  "configVersion" : 1,
  "self" : true
  }
  ],
  "ok" : 1
}

(4)ES端同步操作

[[email protected] bin]# mongo-connector -m 10.8.5.99:27017 -t 10.8.5.101:9200 -d elastic2_doc_manager
Logging to mongo-connector.log.

引數含義:
-m: mongodb的地址與埠,埠預設為27017。
-t:ES的地址與埠,埠預設為9200。
-d:doc manager的名稱,2.x版本為: elastic2-doc-manager。

5、ES與MongoDB Insert插入操作的同步驗證

(1)Mongo端插入資料操作:

#Mongo建立資料庫(對應ES的Index)
rs0:PRIMARY> use zhang_index
switched to db zhang_index

#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"});

(2)Es端檢索驗證

[root@5b9dbaaa148a test_log]# curl -XGET http://10.8.5.101:9200/zhang_index/col_02/_search?pretty
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
  "total" : 8,
  "successful" : 8,
  "failed" : 0
  },
  "hits" : {
  "total" : 2,
  "max_score" : 1.0,
  "hits" : [ {
  "_index" : "zhang_index",
  "_type" : "col_02",
  "_id" : "577b7d8ceb8e3dc2d1db12a9",
  "_score" : 1.0,
  "_source" : {
  "company" : "huawei",
  "name" : "renzhengfei",
  "birth" : "1954-03-21",
  "sex" : "man"
  }
  }, {
  "_index" : "zhang_index",
  "_type" : "col_02",
  "_id" : "577b7d4aeb8e3dc2d1db12a7",
  "_score" : 1.0,
  "_source" : {
  "company" : "chuizi",
  "name" : "laoluo",
  "birth" : "1964-03-21",
  "sex" : "man"
  }
  } ]
  }
}

6、 ES與MongoDB Update更新操作的同步驗證

(1)MongoDB的更新update操作

rs0:PRIMARY> db.col_02.update({'name':'laoluo'}, {$set:{'name':'luoyonghao'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
rs0:PRIMARY>
rs0:PRIMARY> db.col_02.find().pretty()
{
  "_id" : ObjectId("577b7d4aeb8e3dc2d1db12a7"),
  "name" : "luoyonghao",
  "birth" : "1964-03-21",
  "sex" : "man",
  "company" : "chuizi"
}
{
  "_id" : ObjectId("577b7d8ceb8e3dc2d1db12a9"),
  "name" : "renzhengfei",
  "birth" : "1954-03-21",
  "sex" : "man",
  "company" : "huawei"
}

(2)Es端檢索更新後結果

[root@5b9dbaaa148a test_log]# curl -XGET http://10.8.5.101:9200/zhang_index/col_02/_search?pretty
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
  "total" : 8,
  "successful" : 8,
  "failed" : 0
  },
  "hits" : {
  "total" : 2,
  "max_score" : 1.0,
  "hits" : [ {
  "_index" : "zhang_index",
  "_type" : "col_02",
  "_id" : "577b7d8ceb8e3dc2d1db12a9",
  "_score" : 1.0,
  "_source" : {
  "company" : "huawei",
  "name" : "renzhengfei",
  "birth" : "1954-03-21",
  "sex" : "man"
  }
  }, {
  "_index" : "zhang_index",
  "_type" : "col_02",
  "_id" : "577b7d4aeb8e3dc2d1db12a7",
  "_score" : 1.0,
  "_source" : {
  "company" : "chuizi",
  "name" : "luoyonghao",
  "birth" : "1964-03-21",
  "sex" : "man"
  }
  } ]
  }
}

7、 ES與MongoDB delete刪除操作的同步驗證

(1) MongoDB的刪除delete操作

rs0:PRIMARY> db.col_02.remove({'name':'renzhengfei'})
WriteResult({ "nRemoved" : 1 })
rs0:PRIMARY> db.col_02.find()
{ "_id" : ObjectId("577b7d4aeb8e3dc2d1db12a7"), "name" : "luoyonghao", "birth" : "1964-03-21", "sex" : "man", "company" : "chuizi" }
rs0:PRIMARY> db.col_02.find().pretty()
{
  "_id" : ObjectId("577b7d4aeb8e3dc2d1db12a7"),
  "name" : "luoyonghao",
  "birth" : "1964-03-21",
  "sex" : "man",
  "company" : "chuizi"
}

(2)ES端檢索刪除後結果

結果表明,MongoDB刪除的內容,ES端已經同步刪除。

[root@5b9dbaaa148a test_log]# curl -XGET http://10.8.5.101:9200/zhang_index/col_02/_search?pretty
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
  "total" : 8,
  "successful" : 8,
  "failed" : 0
  },
  "hits" : {
  "total" : 1,
  "max_score" : 1.0,
  "hits" : [ {
  "_index" : "zhang_index",
  "_type" : "col_02",
  "_id" : "577b7d4aeb8e3dc2d1db12a7",
  "_score" : 1.0,
  "_source" : {
  "company" : "chuizi",
  "name" : "luoyonghao",
  "birth" : "1964-03-21",
  "sex" : "man"
  }
  } ]
  }
}

這裡寫圖片描述

參見詳細介紹:

Mongo與ES同步的5種方式:

常見Bug:

——————————————————————————————————
更多ES相關實戰乾貨經驗分享,請掃描下方【銘毅天下】微信公眾號二維碼關注。
(每週至少更新一篇!)

這裡寫圖片描述
和你一起,死磕Elasticsearch
——————————————————————————————————

2016年7月6日 23:22 思於家中床前

相關推薦

mongo-connector實現MongoDBelasticsearch實時同步深入

引言: 驗證表明:mongo-connector工具支援MongoDB與ES之間的實時增insert、刪delete、改update操作。 對於歷史資料,mongo-connector工具不能同步到ES中,根因是本身工具不支援(初步界定),還是沒有這種場景,

29.mongo-connector實現MongoDBelasticsearch實時同步(ES非關係型資料庫同步)

引言:驗證表明:mongo-connector工具支援MongoDB與ES之間的實時增insert、刪delete、改update操作。 對於歷史資料,mongo-connector工具不能同步到ES中,根因是本身工具不支援(初步界定),還是沒有這種場景,待查(進一步研究後再

logstash-input-jdbc實現mysql elasticsearch實時同步深入

引言: elasticsearch 的出現使得我們的儲存、檢索資料更快捷、方便。但很多情況下,我們的需求是:現在的資料儲存在mysql、oracle等關係型傳統資料庫中,如何儘量不改變原有資料庫表結構,將這些資料的insert,update,delete操作結果實時同步到elasticsearch(

go-mysql-elasticsearch實現mysql elasticsearch實時同步深入

引言: go-mysql-elasticsearch 是國內作者開發的一款外掛。測試表明:該外掛優點:能實現同步增、刪、改、查操作。不足之處(待完善的地方): 1、仍處理開發、相對不穩定階段; 2、沒有日誌,不便於排查問題及檢視同步結果。 本文深入詳解了

logstash-input-jdbc實現mysql elasticsearch實時同步

實現MySQL資料庫中資料到Elasticsearch的實時同步: 首先需要做好的準備工作: 1、伺服器上安裝好elasticsearch和logstash 2、安裝logstash-input-jdbc外掛,但從logstash5.X開始,已經至少集成了logstash-input-j

21.go-mysql-elasticsearch實現mysql elasticsearch實時同步(ES關係型資料庫同步)

引言:go-mysql-elasticsearch 是國內作者開發的一款外掛。測試表明:該外掛優點:能實現同步增、刪、改、查操作。不足之處(待完善的地方): 1、仍處理開發、相對不穩定階段; 2、沒有日誌,不便於排查問題及檢視同步結果。 本文深入詳解了外掛的安裝、使用、增刪改

22.mysql elasticsearch實時同步常用外掛及優缺點對比(ES關係型資料庫同步)

前言:目前mysql與elasticsearch常用的同步機制大多是基於外掛實現的,常用的外掛包括:elasticsearch-jdbc, elasticsearch-river-MySQL , go-mysql-elasticsearch, logstash-input-j

rsync+inotify實現文件實時同步-步驟

rsync inotify實驗拓撲(centos7下):192.168.80.181 服務器端(主機名www.aa.com)192.168.80.182 客戶端(主機名www.ab.com)1、使用SSH源:安裝rsync,服務端和客戶端同時安裝,只使用客戶端命令就OK了。systemctl stop fir

Elasticsearch Java API深入

0、題記 之前Elasticsearch的應用比較多,但大多集中在關係型、非關係型資料庫與Elasticsearch之間的同步。以上內容完成了Elasticsearch所需要的基礎資料量的供給。但想要在海量的資料中找到和自己相關的業務資料,實現對已有的資料實現全文檢索、分類統計等功能並應用到業務系統

乾貨 | Elasticsearch Nested型別深入

0、概要 在Elasticsearch實戰場景中,我們或多或少會遇到巢狀文件的組合形式,反映在ES中稱為父子文件。 父子文件的實現,至少包含以下兩種方式: 1)父子文件 父子文件在5.X版本中通過parent-child父子type實現,即:1個索引對應多個t

elasticsearch 索引儲存深入Elasticsearch教程03)|MVP講堂

作者:阿里雲MVP 銘毅 往期內容:死磕 Elasticsearch 方法論:普通程式設計師高效精進的 10 大狠招!Elasticsearch學習,請先看這一篇!(Elasticsearch教程01)Elasticsearch增、刪、改、查操作深入詳解(Elasticsearch教程02) 1、關於ES

Elasticsearch寫入原理深入

1、題記: Elasticsearch寫入流程,網上有視訊、筆記等各種版本,本文結合最新官方文件進行重新梳理,節省大家的時間。 思考如下幾個問題? 1、為什麼Elasticsarch是近實時,而不是準實時? 2、為什麼文件的CRUD操作是實時的? 3、為什麼Elastic

Elasticsearch檢索分類深入—基礎篇

題記 Elasticsearch中當我們設定Mapping(分詞器、欄位型別)完畢後,就可以按照設定的方式匯入資料。 有了資料後,我們就需要對資料進行檢索操作。根據實際開發需要,往往我們需要支援包含但不限於以下型別的檢索: 1)精確匹配,類似mysql中的 “=”操作;

Elasticsearch Jest實戰深入

以Jest為例,假設我們之前沒有用過Jest,對Jest的認知,需要經歷的過程: 步驟1:Jest是什麼?能解決什麼問題? 步驟2:Jest的優勢是什麼?為什麼會出現? 步驟3:Jest如何安裝與使用? 步驟4:Jest的樣例Demo&實戰。

MongoDBElasticsearch實現實時同步

Step1:安裝mongo-connector和elastic-doc-namager外掛pip installmongo-connector#Elasticsearch 1.xpip install 'mongo-connector[elastic]'#Elasticsea

elasticsearch+logstash_jdbc 實現mysql數據實時同步至es

use smart node allow 配置 option from 使用 時間 jdk安裝1.8版本,es、ls、ik、kibana版本一致我這裏使用的6.6.2版本 安裝es tar xf elasticsearch-6.6.2.tar.gz mv elasti

配置rsync+inotify實現站點文件實時同步

rep ron 文件實時同步 .tar.gz exp area 調整 資源 centos 一、rsync簡介 rsync是linux系統下的數據鏡像備份工具。可以在不同主機之間鏡像同步整個目錄樹,支持增量備份,保持鏈接和權限,且采用優化的同步算法,在傳輸前執行壓縮,因此非

elasticsearch-jdbc實現MySQL同步ElasticSearch深入

                     1.如何實現mysql與elasticsearch的資料同步?逐條轉換為json顯然不合適,需要藉助第三方工具或者自己實現。核心功能點:同步增、刪、改、查同步。2、mysql與elasticsearch同步的方法有哪些?優缺點對比?目前該領域比較牛的外掛有:1-3同步

.NET Core採用的全新配置系統[8]: 如何實現配置原始檔的同步

配置的同步涉及到兩個方面:第一,對原始的配置檔案實施監控並在其發生變化之後從新載入配置;第二,配置重新載入之後及時通知應用程式進而使後者能夠使用最新的配置。接下來我們利用一個簡單的.NET Core控制檯應用來演示針對檔案的配置會涉及到資料同步的問題,我們希望應用能夠對原始配置檔案實施監控,並在檔案內容發生改