基於nodejs將mongodb的數據實時同步到elasticsearch

一、前言

因公司需要選用elasticsearch做全文檢索,持久化存儲選用的是mongodb,但是希望mongodb裏面的數據發生改變可以實時同步到elasticsearch上,一開始主要使用elasticsearch v1.7.2的版本,mongo-river可以搞定這個問題。隨着elasticsearch的升級,發現elasticsearch已經放棄了mongo-river,咋整......Google之後發現一神器mongo-connector,國外大神用python寫的工具而且MongoDB官網也極力推薦使用。But,我們需要把文檔中的附件信息也同步到elasticsearch上,mongo-connector對附件同步支持的不是很好。能不能有個nodejs版本的數據同步?GitHub上發現一個大神寫的node-elasticsearch-sync很好用,但是功能太簡單了,不支持複雜的數據篩選,也不支持附件同步。活人不能被尿憋死,參考node-elasticsearch-sync自己寫了一個同步工具node-mongodb-es-connector

二、準備工作

2.1 安裝mongodb

安裝mongodb可以去官網下載:

https://www.mongodb.com/

PS:關於如何搭建mongodb replica集羣:

https://www.cnblogs.com/ljhdo/p/4503317.html

2.2 安裝elasticsearch

安裝elasticsearch可以去官網下載:

https://www.elastic.co/cn/downloads

PS:關於elasticsearch-head、kibana、logstash等相關安裝請自己google吧

2.3 安裝nodejs

安裝nodejs可以去官網下載:

http://nodejs.cn/

PS:別忘記安裝npm,如何安裝請自己google吧

以上是使用node-mongodb-es-connector的前提

2.4 node-mongodb-es-connector下載地址

github: https://github.com/zhr85210078/node-mongodb-es-connector

npm: https://www.npmjs.com/package/es-mongodb-sync?activeTab=readme

 

三、文件結構

複製代碼
├── crawlerDataConfig    項目構建配置(這裏添加你要同步數據的配置)
│       ├── mycarts.json  一個index一個配置文件(唯一需要自己增加或者修改的配置文件,這個文件只是提供了一個例子,不用可以刪除)    
│       └── ……    
├── lib  
│   ├── pool
│   │   ├──  elasticsearchPool.js  elasticsearch連接池
│   │   ├──  mongoDBPool.js      mongodb連接池
│   ├── promise
│   │   ├──  elasticsearchPromise.js elasticsearch方法類(增刪改查)  
│   │   ├──  mongoPromise.js      mongodb方法類(增刪改查)
│   ├── util
│   │   ├──  fsWatcher.js        配置文件監控類(主要監控crawlerDataConfig目錄裏面的配置文件)
│   │   ├──  logger.js          日誌類
│   │   ├──  oplogFactory.js      mongo-oplog觸發事件之後的執行方法(增刪改)
│   │   ├──  tail.js           監聽mongodb數據是否發生變化 
│   │   ├──  util.js                  工具類
│   ├── main.js                        主方法(主要是第一次啓動立刻同步mongodb裏面的數據到elasticsearch)
├── logs
│       ├── logger-2018-03-23.log     同步數據打印日誌
│       └── ……    
├── test
│   ├── img
│   │    ├── elasticsearch.jpg      圖片不解釋
│   │    ├── mongoDB.jpg        圖片不解釋
│   │    └── structure.jpg        圖片不解釋
│   └── test.js              測試類(啥也沒寫)
├── app.js       啓動文件               
├── index.js      接口文件(只提供配置文件的增刪改)
├── package-lock.json 
├── package.json
├── ReadMe.md      英文文檔(markdown)
├── README.zh-CN.md  中文文檔(markdown)
└── LICENSE       
複製代碼

 mycarts.json文件(這個文件只是提供了一個例子)

複製代碼
{
    "mongodb": {
        "m_database": "myTest",
        "m_collectionname": "carts",
        "m_filterfilds": {
            "version" : "2.0"
        },
        "m_returnfilds": {
            "cName": 1,
            "cPrice": 1,
            "cImgSrc": 1
        },
        "m_connection": {
            "m_servers": [
                "localhost:29031",
                "localhost:29032",
                "localhost:29033"
            ],
            "m_authentication": {
                "username": "UserAdmin",
                "password": "pass1234",
                "authsource":"admin",
                "replicaset":"my_replica"
            }
        },
        "m_documentsinbatch": 5000
    },
    "elasticsearch": {
        "e_index": "mycarts",
        "e_type": "carts",
        "e_connection": {
            "e_server": "http://localhost:9200",
            "e_httpauth": {
                "username": "EsAdmin",
                "password": "pass1234"
            }
        },
        "e_pipeline": "mypipeline"
    }
}
複製代碼
  • m_database - MongoDB裏需要監聽的數據庫.
  • m_collectionname - MongoDB裏需要監聽的collection.
  • m_filterfilds - MongoDB裏的查詢條件,目前支持一些簡單的查詢條件.(默認值爲null)
  • m_returnfilds - MongoDB需要返回的字段.(默認值爲null)
  • m_connection
    • m_servers - MongoDB服務器的地址.(replica結構,數組格式)
    • m_authentication - 如果需要MongoDB的登錄驗證使用下面配置(默認值爲null).
      • username - MongoDB連接的用戶名.
      • password - MongoDB連接的密碼.
      • authsource - MongoDB用戶認證,默認爲admin.
      • replicaset - MongoDB的repliac結構的名字.
  • m_documentsinbatch - 一次性從mongodb往Elasticsearch裏傳入數據的條數. (你可以設置比較大的值,默認爲1000.).
  • e_index - ElasticSearch裏的index.
  • e_type - ElasticSearch裏的type,這裏的type主要爲了使用bulk.
  • e_connection
    • e_server - ElasticSearch的連接字符串.
    • e_httpauth - 如果ElasticSearch需要登錄驗證使用下面配置(默認值爲null).
      • username - ElasticSearch連接的用戶名.
      • password - ElasticSearch連接的密碼.
  • e_pipeline - ElasticSearch 中pipeline的名稱.(沒有pipeline就填null)

四、如何使用

用戶可以事先在/crawlerDataConfig目錄下編輯好自己的配置文件,文件必須以json格式存放.

在文件根目錄下,打開cmd命令窗口,輸入以下信息:

node app.js

項目啓動後,修改配置文件 (如:mycarts.json,數據也會實時同步。或者修改mongodb中的某一條數據,也會實時同步到elasticsearch中。

PS:如何把mongodb的主文檔和附件信息都同步到elasticsearch中?

利用elasticsearch的pipeline來實現。

首先需要創建一個pipeline到elasticsearch中:

複製代碼
PUT _ingest/pipeline/mypipeline
{
  "description" : "Extract attachment information from arrays",
  "processors" : [
    {
      "foreach": {
        "field": "attachments",
        "processor": {
          "attachment": {
            "target_field": "_ingest._value.attachment",
            "field": "_ingest._value.data"
          }
        }
      }
    }
  ]
}
複製代碼

然後在配置文件中(如:mycarts.json)修改節點數據即可

"e_pipeline": "mypipeline"

五、結果展示

 mongodb裏面的數據 

 elasticsearch裏面的數據 

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