MongoDB 數據自動同步到 ElasticSearch
Elasticsearch日志分析
我們產品中需要全文檢索的功能,后端數據存儲主要使用了 MySQL + MongoDB,而其中需要檢索的內容是在 MongoDB 中的。
MongoDB 本身是自帶文本索引功能的,但是,不支持中文。術業有專攻,MongoDB 是數據存儲應用,那么全文檢索就使用專業的全文搜索引擎吧。
預選的幾個選手有:Solr、ElasticSearch、Xapian、Sphinx、XunSearch。由於我們的數據量比較大,覺得現在單機已經有些力不從心了,MongoDB 也開始計划做分片,那么全文搜索如果自帶分布式技能那就最合適不過了。經過一系列的考量,最后,我們就決定用 ElasticSearch 了。
現在后端程序是直接將數據寫到 MongoDB 中,我不想修改程序代碼,不想在增刪改 MongoDB 中數據的同時去增刪改 ElasticSearch 中的數據。希望 MongoDB 中數據發送變化時自動同步到 ElasticSearch 中,這樣就可以最快地用上 ElasticSearch 了。
剛開始我找到的方案是利用 ElasticSearch 的 River 來同步數據,並在 GitHub 上到了 MongoDB River 插件:elasticsearch-river-mongodb。但是,隨后我又在 ElasticSearch 官網上看了這篇博客:《Deprecating Rivers》,官方已經在 1.5 以后的版本棄用 River,為了用戶的遷移,會一直保留到 2.0 版本。
於是,我得另尋方案了。然后我又在網上找到了另外一個方案:mongo-connector。這個是 MongoDB 官方的開發人員用 Python 寫的一個工具,目前支持將 MongoDB 的數據同步到 Solr、ElasticSearch、MongoDB 中,並且支持用戶自己擴展。看到 README 中的免責聲明,我有點覺得這是玩票性質的工具,但是還是抱着試試看的心態決定試試看了。
下面是部署過程:
MongoDB 必須開啟復制集,如果已經開啟請忽略這一步:
配置復制集的名稱:mongod --replSet myDevReplSet
在 mongo shell 中初始化復制集:rs.initiate()
安裝 ElasticSearch,如果已經安裝請忽略這一步。
安裝 mongo-connector:
先安裝 pip:
yum install python-setuptools && easy_install pip
通過 pip 安裝 mongo-connector:
pip install mongo-connector
運行 mongo-connector:
mongo-connector -m 127.0.0.1:27017 -t 127.0.0.1:9200 -d elastic_doc_manager
OK,現在,在 MongoDB 中增刪改數據,都能立刻同步到 ElasticSearch 中了。在試用過程中,mongo-connector 退出過兩次,其中一次斷開太久沒有發覺,害我不得不重新同步。還是有點不靠譜的感覺,可能還得專門寫個守護程序,讓 mongo-connector 一直能在后台好好干活。
拓展閱讀:
用 mongodb + elasticsearch 實現中文檢索
使用Mongo Connector和Elasticsearch實現模糊匹配