1. 程式人生 > >29.mongo-connector實現MongoDB與elasticsearch實時同步(ES與非關係型資料庫同步)

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

引言:

驗證表明: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:

相關推薦

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

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

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

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

27.logstash-output-mongodb實現Mysql到Mongodb資料同步(ES關係型資料庫同步)

本文主要講解如何通過logstash-output-mongodb外掛實現Mysql與Mongodb資料的同步。源資料儲存在Mysql,目標資料庫為非關係型資料庫Mongodb。0、前提1)已經安裝好源資料庫:Mysql; 2)已經安裝好目的資料庫:Mongodb; 3)已經

mongodb 3.2 實戰(一)關係型資料庫設計,如何進行mongo資料庫設計?

mongo 於2015,12,8 正式釋出了3.2的穩定版,這次重大的更新後,主要包括以下幾個比較令人興奮的點。 1.wiredtiger 引擎 在3.0釋出時,wiredtiger作為資料引擎之一。3.2之後wiredtiger作為建立資料庫的預設

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

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

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

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

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

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

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

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

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

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

5.關係型資料庫(Nosql)之mongodb:建立集合,備份匯入匯出, 資料還原,匯入匯出

1固定集合固定集合值得是事先建立而且大小固定的集合2固定集合的特徵:固定集合很像環形佇列,如果空間不足,最早文件就會被刪除,為新的文件騰出空間。一般來說,固定集合適用於任何想要自動淘汰過期屬性的場景

聊聊關係型資料庫MongoDB索引

今天和大家簡單聊下Mongo資料庫的索引。 Mongo索引是基於B-tree,儲存在一個易於遍歷讀取的資料集合中,它是對資料庫表中一列或多列的值進行排序的一種結構。 資料庫的索引和我們書籍目錄相似,有了索引,我們不需要翻閱整本書,只需要檢視目錄就知道我們要的內容在哪兒,並且直接定位到,這種

關係型資料庫mongodb的語法模式

from pymongo import MongoClient #連線 conn = MongoClient('127.0.0.1', 27017) #進入資料庫 db = conn.edianzu #連線mydb資料庫,沒有則自動建立 #進入集合 pinglun =

關係型資料庫關係型資料庫詳細比較

關係型資料庫與非關係型資料庫詳細比較 1.關係型資料庫通過外來鍵關聯來建立表與表之間的關係,

關係型資料庫關係型資料庫(Nosql)的區別於使用場景

個人理解: 如果資料量較小,那麼使用關係型資料庫即可,因為這個時候讀寫的IO瓶頸顯現不出來。如果資料量較大,這時,可能對於關係型資料庫(如mysql)來說,單表的大小就可以達到幾GB,這時K-V儲存的非關係型資料庫的優勢就體現出來了。一般來說,現在的網際網路公司,傾向於使用Nosql作為快取,儲

關係型資料庫 關係型資料庫比較

關係型資料庫 與 非關係型資料庫比較 詳細內容檢視我的腦圖 寫在前面 : 許多大型網際網路都會選用MySql+NoSql的組合方案,因為SQL和NoSql都有各自的優缺點 概念 關係型資料庫是指採用了關係模型來組織資料的資料庫。 簡單來說,關係模式就是二

mongodb 關係型資料庫

mongodb 非關係型資料庫 找到安裝根目錄 在該目錄下都是命令工具, 需要在dos下執行 重要命令介紹 mongo.exe: mongo 自帶的客戶端, 用於連線和操作mongo資料庫的 mongod.exe: 伺服器命令,用於啟動mongo服務

關係型資料庫——Mongodb筆記

SQL:     關係型資料模型     資料被存放在表中     每條記錄(資料)都是相同型別並且具有相同屬性     儲存資料需要定義     新增新資料必須修改表結構     ACID事務支援 NoSQL     非關係型資料模型     可以儲存jso

關係型資料庫關係型資料庫的區別和介紹

什麼是關係型資料庫? 關係型資料庫是依據關係模型來建立的資料庫。 所謂關係模型就是“一對一、一對多、多對多”等關係模型,關係模型就是指二維表格模型,因而一個關係型資料庫就是由二維表及其之間的聯絡組成的一個數據組織。 關係型資料可以很好地儲存一些關係模型的資料,比如一個老

python web 關係型資料庫儲存MongoDB Redis

MongoDB是由C++語言編寫的非關係型資料庫,基於分散式檔案儲存的開源資料庫系統,儲存形式類似於json物件,欄位值可以包含其他的文件,陣列以及文件資料 首先要連線資料庫,給定資料庫的名字,然後對資料庫進行操作 import pymongo #連線資料庫 client