咱們產品中須要全文檢索的功能,後端數據存儲主要使用了 MySQL + MongoDB,而其中須要檢索的內容是在 MongoDB 中的。html
MongoDB 自己是自帶文本索引功能的,可是,不支持中文。術業有專攻,MongoDB 是數據存儲應用,那麼全文檢索就使用專業的全文搜索引擎吧。python
預選的幾個選手有:Solr、ElasticSearch、Xapian、Sphinx、XunSearch。因爲咱們的數據量比較大,以爲如今單機已經有些力不從心了,MongoDB 也開始計劃作分片,那麼全文搜索若是自帶分佈式技能那就最合適不過了。通過一系列的考量,最後,咱們就決定用 ElasticSearch 了。git
如今後端程序是直接將數據寫到 MongoDB 中,我不想修改程序代碼,不想在增刪改 MongoDB 中數據的同時去增刪改 ElasticSearch 中的數據。但願 MongoDB 中數據發送變化時自動同步到 ElasticSearch 中,這樣就能夠最快地用上 ElasticSearch 了。github
剛開始我找到的方案是利用 ElasticSearch 的 River 來同步數據,並在 GitHub 上到了 MongoDB River 插件:elasticsearch-river-mongodb。可是,隨後我又在 ElasticSearch 官網上看了這篇博客:《Deprecating Rivers》,官方已經在 1.5 之後的版本棄用 River,爲了用戶的遷移,會一直保留到 2.0 版本。mongodb
因而,我得另尋方案了。而後我又在網上找到了另一個方案:mongo-connector。這個是 MongoDB 官方的開發人員用 Python 寫的一個工具,目前支持將 MongoDB 的數據同步到 Solr、ElasticSearch、MongoDB 中,而且支持用戶本身擴展。看到 README 中的免責聲明,我有點以爲這是玩票性質的工具,可是仍是抱着試試看的心態決定試試看了。shell
下面是部署過程:後端
MongoDB 必須開啓複製集,若是已經開啓請忽略這一步:
配置複製集的名稱:mongod --replSet myDevReplSet
在 mongo shell 中初始化複製集:rs.initiate()
api
安裝 ElasticSearch,若是已經安裝請忽略這一步。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 一直能在後臺好好幹活。
拓展閱讀: