Mongodb與Elasticsearch實時同步

目錄

引言:

初次接觸Mongodb與Elasticsearch,學習Mongodb與Elasticsearch的實時同步,參考了“銘毅天下”的“mongo-connector實現MongoDB與elasticsearch實時同步深入詳解”,記錄配置過程,留作筆記。

1、下載mongo-connector和elastic-doc-manager

1.1下載mongo-connector

mongo-connector GitHub

#下載mongo-connector
pip install mongo-connector

若出現Pymongo>=2.9的錯誤提醒需要安裝Pymongo

pip install pymongo
#對pymongo進行升級
pip --upgrade pymongo

可用如下測試安裝是否成功,在Terminal鍵入python,進入python

>>> import pymongo
#以上這步報錯就重新安裝吧
>>> client = pymongo.MongoClient("localhost", 27017)
>>> db = client.test
>>> db.name
u'test'
>>> db.my_collection
Collection(Database(MongoClient('localhost', 27017), u'test'), u'my_collection')
>>> db.my_collection.insert_one({"x": 10}).inserted_id
ObjectId('4aba15ebe23f6b53b0000000')
>>> db.my_collection.insert_one({"x": 8}).inserted_id
ObjectId('4aba160ee23f6b543e000000')
>>> db.my_collection.insert_one({"x": 11}).inserted_id
ObjectId('4aba160ee23f6b543e000002')
>>> db.my_collection.find_one()
{u'x': 10, u'_id': ObjectId('4aba15ebe23f6b53b0000000')}
>>> for item in db.my_collection.find():
...     print(item["x"])
...
10
8
11
>>> db.my_collection.create_index("x")
u'x_1'
>>> for item in db.my_collection.find().sort("x", pymongo.ASCENDING):
...     print(item["x"])
...
8
10
11
>>> [item["x"] for item in db.my_collection.find().limit(2).skip(1)]
[8, 11]

1.2下載Elastic的文檔管理器,需對應Elasticsearc的版本下載。

#Elasticsearch 1.x
pip install 'mongo-connector[elastic]'

#Elasticsearch 2.x
pip install 'mongo-connector[elastic2]'

#Elasticsearch 5.x
pip install 'mongo-connector[elastic5]'

2、MongoDB 開啓複製集

MongoDB複製是將數據同步在多個服務器的過程。
複製提供了數據的冗餘備份,並在多個服務器上存儲數據副本,提高了數據的可用性, 並可以保證數據的安全性。
複製還允許您從硬件故障和服務中斷中恢復數據。

2.1關閉正在運行的MongoDB服務器,開啓複製集。

通過指定 –replSet 選項來啓動mongoDB。–replSet 基本語法格式如下:

./mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

實例

./mongod --port 27017 --dbpath "/data/rs0" --replSet rs0

注意:這裏需要在/目錄下創建好/data/rs0這個文件。
以上實例會啓動一個名爲rs0的MongoDB實例,其端口號爲27017。

2.2將mongo客戶端與副本集成員連接。

進入mongodb/bin下

#啓動Mongo客戶端並連接上mongoDB服務
./mongo

2.3初始化副本集

在Mongo客戶端輸入rs.initiate(),初始化副本集。

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

我們可以使用rs.conf()來查看副本集的配置。

rs0:SECONDARY> rs.conf()
{
  "_id" : "rs0",
  "version" : 1,
  "protocolVersion" : NumberLong(1),
  "members" : [
  {
  "_id" : 0,
  "host" : "test: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")
  }
}

看副本集狀態使用 rs.status() 命令。

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" : "test: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
}

3、Elasticsearch 與MongoDB開啓同步

3.1開啓同步

[root@test]# mongo-connector -m localhost:27017 -t localhost:9200 -d elastic2_doc_manager
Logging to mongo-connector.log.

參數含義:
-m: mongodb的地址與端口,端口默認爲27017。
-t:ES的地址與端口,端口默認爲9200。
-d:doc manager的名稱,2.x版本爲: elastic2-doc-manager。
注意:
Elasticsearch1.x的版本使用elastic-doc-manager
Elasticsearch2.x以上的版本使用elastic2-doc-manager。
(個人理解,因爲博主的Elasticsearch5.x使用elastic5-doc-manager不管用,使用elastic2-doc-manager連接上了)

4、Elasticsearch與MongoDB Insert插入操作的同步驗證

4.1Mongo端插入數據操作

#Mongo創建數據庫(對應ES的Index)
rs0:PRIMARY> use test_index
switched to db test_index

#Mongo中插入數據(其中col_02對應ES中的Type)
rs0:PRIMARY> db.col_02.insert({name:"zhangsan", birth:"1964-03-21", sex:"man", company:"baidu"});
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.col_02.insert({name:"lisi", birth:"1954-03-21", sex:"man", company:"huawei"});

4.2ES端檢索驗證

[root@test]# curl -XGET http://localhost:9200/test_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" : "test_index",
  "_type" : "col_02",
  "_id" : "577b7d8ceb8e3dc2d1db12a9",
  "_score" : 1.0,
  "_source" : {
  "company" : "huawei",
  "name" : "lisi",
  "birth" : "1954-03-21",
  "sex" : "man"
  }
  }, {
  "_index" : "test_index",
  "_type" : "col_02",
  "_id" : "577b7d4aeb8e3dc2d1db12a7",
  "_score" : 1.0,
  "_source" : {
  "company" : "baidu",
  "name" : "zhangsan",
  "birth" : "1964-03-21",
  "sex" : "man"
  }
  } ]
  }
}

至此Mongodb與Elasticsearch實現同步,可在Mongodb 中對數據進行增刪改然後查詢Elasticsearch看數據的變化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章