Elasticsearch與MongoDB 資料同步及分布式叢集搭建

來源:互聯網
上載者:User

過River可以與多種資料來源Wikipedia, MongoDB, CouchDB, RabbitMQ, RSS, Sofa, JDBC, FileSystem,Dropbox等同步,公司的業務是用 MongoDB,今天測試環境虛擬機器上配置了一下Elasticsearch 與 MongoDB的同步,作個大概的過程記錄,主要利用richardwilly98 / elasticsearch-river-mongodb。
River通過讀取mongodb的oplog來同步資料,oplog這個表來使叢集中的不同機器資料同步的,可以保證es裡面的資料和mongodb裡面的是一樣的,所以Mongdb必須是個叢集才能擁有oplog.注意:該外掛程式只支援叢集環境下的mongodb,因為叢集環境下的mongodb才有oplog這個
Elasticsearch 和 MongoDB需要安裝對應的版本才能實現同步,我這裡用了最新的Elasticsearch 1.4.2 和 MongoDB 3.0.0,相應的版本要求參考下表

 
MongDB是一個複本集的叢集,具體複本集叢集的搭建不詳細寫了,Elasticsearch的安裝配置也省略。
1.安裝elasticsearch-river-mongodb
# ./elasticsearch-1.4.4/bin/plugin -install elasticsearch/elasticsearch-mapper-attachments/2.4.1

# ./elasticsearch-1.4.4/bin/plugin -i com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/2.0.5
 
2.建立river
curl -XPUT "http://10.253.1.70:9200/_river/threads_mongo_river/_meta" -d'

{
  "type": "mongodb",
  "mongodb": {
    "servers":
    [
      { "host": "10.253.1.71", "port": 27017}
    ],
    "db": "threads",
    "collection": "threads",
    "gridfs": false
  },
  "index": {
    "name": "test",
    "type": "threads"
  }
}'
這裡只是簡單的配置了建立串連的MongoDB以及相應的db,collection對於的elasticsearch index和type,還有詳細的配置沒有使用到,比如options等,具體根據業務可以配置,下面是一份詳細的配置範例:
$ curl -XPUT "localhost:9200/_river/${es.river.name}/_meta" -d '
{
  "type": "mongodb",
  "mongodb": {
    "servers":
    [
      { "host": ${mongo.instance1.host}, "port": ${mongo.instance1.port} },
      { "host": ${mongo.instance2.host}, "port": ${mongo.instance2.port} }
    ],
    "options": {
      "secondary_read_preference" : true,
      "drop_collection": ${mongo.drop.collection},
      "exclude_fields": ${mongo.exclude.fields},
      "include_fields": ${mongo.include.fields},
      "include_collection": ${mongo.include.collection},
      "import_all_collections": ${mongo.import.all.collections},
      "initial_timestamp": {
        "script_type": ${mongo.initial.timestamp.script.type},
        "script": ${mongo.initial.timestamp.script}
      },
      "skip_initial_import" : ${mongo.skip.initial.import},
      "store_statistics" : ${mongo.store.statistics},
    },
    "credentials":
    [
      { "db": "local", "user": ${mongo.local.user}, "password": ${mongo.local.password} },
      { "db": "admin", "user": ${mongo.db.user}, "password": ${mongo.db.password} }
    ],
    "db": ${mongo.db.name},
    "collection": ${mongo.collection.name},
    "gridfs": ${mongo.is.gridfs.collection},
    "filter": ${mongo.filter}
  },
  "index": {
    "name": ${es.index.name},
    "throttle_size": ${es.throttle.size},
    "bulk_size": ${es.bulk.size},
    "type": ${es.type.name}
    "bulk": {
      "actions": ${es.bulk.actions},
      "size": ${es.bulk.size},
      "concurrent_requests": ${es.bulk.concurrent.requests},
      "flush_interval": ${es.bulk.flush.interval}
    }
  }
}'
一些配置項的解釋如下,具體可以查看github的wiki:
db為同步的資料庫名,
host mongodb的ip地址(預設為localhost)
port mongodb的連接埠
collection 要同步的表名
fields 要同步的欄位名(用逗號隔開,預設全部)
gridfs 是否是gridfs檔案(如果collection是gridfs的話就設定成true)
local_db_user local資料庫的使用者名稱(沒有的話不用寫)
local_db_password local資料庫的密碼(沒有的話不用寫)
db_user 要同步的資料庫的密碼(沒有的話不用寫)
db_password 要同步的資料庫的密碼(沒有的話不用寫)
name 索引名(不能之前存在)
type 類型
bulk_size 大量新增的最大數
bulk_timeout 大量新增的逾時時間
3.測試是否成功
我測試的庫中資料較少,所以就直接都查出來看看是否能查出來吧
$ curl -XGET "http://10.253.1.70:9200/test/threads/_search" -d '

{
    "took": 20,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 4,
        "max_score": 1,
        "hits": [
            {
                "_index": "test",
                "_type": "threads",
                "_id": "54fa32b22c44cf67cb6a9d1b",
                "_score": 1,
                "_source": {
                    "_id": "54fa32b22c44cf67cb6a9d1b",
                    "title": "where is my car",
                    "content": "ask yourself"
                }
            },
            {
                "_index": "test",
                "_type": "threads",
                "_id": "54fa2f5c2c44cf67cb6a9d19",
                "_score": 1,
                "_source": {
                    "_id": "54fa2f5c2c44cf67cb6a9d19",
                    "title": "this is title",
                    "content": "what is the fuck"
                }
            },
            {
                "_index": "test",
                "_type": "threads",
                "_id": "54fa2f892c44cf67cb6a9d1a",
                "_score": 1,
                "_source": {
                    "_id": "54fa2f892c44cf67cb6a9d1a",
                    "title": "are you ok",
                    "content": "yes,i am ok"
                }
            },
            {
                "_index": "test",
                "_type": "threads",
                "_id": "54fa49ccc104e2264e02deea",
                "_score": 1,
                "_source": {
                    "_id": "54fa49ccc104e2264e02deea",
                    "title": "hello word",
                    "content": "hello hello haha"
                }
            }
        ]
    }
}

看來資料已經同步過來了,然後在MongoDB 添加一條記錄,執行同樣的操作尋找對於的記錄或者 total已經+1那麼同步完成了。

我們已經配置了一個Elasticsearch與MongoDB 資料同步高可用,可擴充以及分布式是ES的一個優勢和特色,擴充垂直擴充或者向上擴充,Vertical Scale/Scaling Up,或是水平擴充或者向外擴充,Horizontal Scale/Scaling Out。
一個節點會運行一個ES的執行個體,一個叢集則會包含擁有相同cluster.name的一個或者多個節點,這些節點共同工作來完成資料共用和負載分擔。隨著節點被添加到叢集,或者從叢集中被刪除,叢集會通過自身調節來將資料均勻分布。叢集中的一個節點會被選為主節點(Master Node),它負責管理整個叢集的變化,如建立或者刪除一個索引(Index),向叢集中添加或者刪除節點。任何節點都可以成為主節點。在我們的例子中只有一個節點,所以它就承擔了主節點的功能。ES通過分區將資料分布在叢集中。可以將分區想象成資料的容器。文檔會被儲存在分區中,而分區則會被分配到叢集中的節點中。隨著叢集的擴大和雖小,ES會自動地將分區在節點之間進行遷移,以保證叢集能夠保持一種平衡。一個分區可以是主分區(Primary Shard)或者副本分區(Replica Shard)。索引中的每份文檔都屬於一個主分區,所以主分區的數量就決定了你的索引能夠儲存的最大資料量。一個副本分區則只是一個主分區的拷貝。副本用來提供資料冗餘,用來保護資料在發生硬體故障是不會丟失,同時也能夠處理像搜尋和擷取文檔這樣的讀請求。主分區的數量在索引建立之初就會被確定下來,而副本分區的數量則可以在任何時候被更改。
 
具體原理可以參考官方文檔:《life inside a cluster》

示範水平擴充,這裡新添加一個ES執行個體的虛擬機器,這樣我們之前的ES執行個體為:10.253.1.70,現在添加一個新的節點:10.253.1.71.,需要保證這兩個節點之間是可以互相通訊的.

配置config/elasticsearch.yml
10.253.1.70相關配置為:
cluster.name: elasticsearch_ryan
node.name: "cluster-node-1"
10.253.1.71相關配置為:
cluster.name: elasticsearch_ryan
node.name: "cluster-node-1"
其實就是要保證有共同的cluster.name
啟動10.253.1.71的ES服務,然後可以查看下節點叢集的狀態:

curl -XPOST "http://10.253.1.70:9200/_cluster/health"
{
    "cluster_name": "elasticsearch_ryan",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 2,
    "number_of_data_nodes": 2,
    "active_primary_shards": 9,
    "active_shards": 18,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0
}

可以看到現在有2個節點,status 表叢集的狀態,具體狀態含義:
green:所有的主分區(Primary Shard)和副本分區(Replica Shard)都處於活動狀態
yellow:所有的主分區都處於活動狀態,但是並不是所有的副本分區都處於活躍狀態
red:不是所有的主分區都處於活動狀態
這裡順便推薦一個ES分布式叢集管理工具 elasticsearch-head,外掛程式方式安裝就可以了
sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head
安裝後開啟管理介面 http://10.253.1.70:9200/_plugin/head/

 

 
可以看到分布式叢集中節點的詳細資料,還可以執行索引的資訊和查詢的功能,很方便,叢集的狀態也很直觀。可以往mongo裡面繼續添加一些資料來測試下

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.