복붙노트

[MONGODB] 어떻게 MongoDB를 함께 Elasticsearch를 사용 하는가?

MONGODB

어떻게 MongoDB를 함께 Elasticsearch를 사용 하는가?

나는 많은 블로그와 MongoDB의에서 인덱스 컬렉션에 MongoDB를위한 Elasticsearch를 구성하는 방법에 대한 사이트를 통해 갈하지만 그들 중 누구도 간단하지 않았다.

나에게이 포함되어야 elasticsearch를 설치하는 단계 프로세스에 의해 단계를 설명하십시오 :

그래서 따라 도움을 기쁘게, express.js와 Node.js를 사용하고 있습니다.

해결법

  1. ==============================

    1.이 답변은 MongoDB를, Elasticsearch 및 AngularJS와 함께 기능 검색 구성 요소를 건물이 튜토리얼을 따라하도록 설정 얻을 충분합니다.

    이 답변은 MongoDB를, Elasticsearch 및 AngularJS와 함께 기능 검색 구성 요소를 건물이 튜토리얼을 따라하도록 설정 얻을 충분합니다.

    당신은 API의 데이터로 측면 검색을 사용하고자하는 경우 다음 Matthiasn의 새 관찰 리포 당신이보고 할 수 있습니다 무언가이다.

    그래서 여기입니다 방법을 설정할 수 있습니다 NodeJS에 사용되는 인덱스 MongoDB를 단일 노드 Elasticsearch "클러스터", 신선한 EC2 우분투 14.04 인스턴스 익스프레스 응용 프로그램.

    반드시 모든 최신 정보를 확인하십시오.

    sudo apt-get update
    

    NodeJS를 설치합니다.

    sudo apt-get install nodejs
    sudo apt-get install npm
    

    MongoDB를 설치 -이 단계는 MongoDB를 워드 프로세서에서 바로입니다. 당신이 편안있어 어떤 버전을 선택합니다. 이 문제없이 최신 버전 MongoDB를-강 지원을 것 같다 때문에 v2.4.9을 고수하고있다.

    MongoDB를 공개 GPG 키를 가져옵니다.

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
    

    당신의 소스 목록을 업데이트합니다.

    echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
    

    10gen 패키지를 가져옵니다.

    sudo apt-get install mongodb-10gen
    

    가장 최근을하지 않으려면 다음 버전을 선택합니다. 당신이 V2.6에서 7 또는 8 기계 숙박 멀리 창에 환경을 설정하는 경우 그들은 서비스로 실행하는 몇 가지 버그를 해결할 때까지.

    apt-get install mongodb-10gen=2.4.9
    

    업데이트 할 때 방지하여 MongoDB를 설치의 버전은 승진된다.

    echo "mongodb-10gen hold" | sudo dpkg --set-selections
    

    MongoDB의 서비스를 시작합니다.

    sudo service mongodb start
    

    데이터베이스 파일의 기본값은 / var / lib 디렉토리 / 몽고와에 / 몽고 var에 / 로그 / 로그 파일.

    몽고 쉘을 통해 데이터베이스를 만들고 그것으로 일부 더미 데이터를 밀어 넣습니다.

    mongo YOUR_DATABASE_NAME
    db.createCollection(YOUR_COLLECTION_NAME)
    for (var i = 1; i <= 25; i++) db.YOUR_COLLECTION_NAME.insert( { x : i } )
    

    이제 복제 세트에 독립 MongoDB를 변환합니다.

    먼저 종료 과정.

    mongo YOUR_DATABASE_NAME
    use admin
    db.shutdownServer()
    

    우리는 mongod 프로세스를 다시 시작할 때 우리는 명령 행 인수에서 "--replSet RS0"옵션에 전달하지 않도록 이제 우리는 서비스로 MongoDB를 실행하고 있습니다. 대신, 우리는 mongod.conf 파일에 넣어.

    vi /etc/mongod.conf
    

    당신의 DB 및 로그 경로에 대한 하도, 다음 줄을 추가합니다.

    replSet=rs0
    dbpath=YOUR_PATH_TO_DATA/DB
    logpath=YOUR_PATH_TO_LOG/MONGO.LOG
    

    이제 복제 세트를 초기화 다시 몽고 쉘을 엽니 다.

    mongo DATABASE_NAME
    config = { "_id" : "rs0", "members" : [ { "_id" : 0, "host" : "127.0.0.1:27017" } ] }
    rs.initiate(config)
    rs.slaveOk() // allows read operations to run on secondary members.
    

    이제 Elasticsearch를 설치합니다. 난 그냥이 도움이 요점을 다음과 같은거야.

    자바가 설치되어 있는지 확인합니다.

    sudo apt-get install openjdk-7-jre-headless -y
    

    지금 몽고 - 강 플러그인 버그가 V1.2.1에 고정됩니다 때까지에 대한 v1.1.x와 스틱.

    wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.1.1.deb
    sudo dpkg -i elasticsearch-1.1.1.deb
    
    curl -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
    sudo mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
    sudo rm -Rf *servicewrapper*
    sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
    sudo ln -s `readlink -f /usr/local/share/elasticsearch/bin/service/elasticsearch` /usr/local/bin/rcelasticsearch
    

    확인 /etc/elasticsearch/elasticsearch.yml를 만드 만 지금은 하나의 노드에서 개발하는 경우 옵션이 활성화 다음과 같은 설정이 있습니다 :

    cluster.name: "MY_CLUSTER_NAME"
    node.local: true
    

    Elasticsearch 서비스를 시작합니다.

    sudo service elasticsearch start
    

    그것의 작동을 확인합니다.

    curl http://localhost:9200
    

    당신은 다음과 같은 대단해 좋은 참조하십시오.

    {
      "status" : 200,
      "name" : "Chi Demon",
      "version" : {
        "number" : "1.1.2",
        "build_hash" : "e511f7b28b77c4d99175905fac65bffbf4c80cf7",
        "build_timestamp" : "2014-05-22T12:27:39Z",
        "build_snapshot" : false,
        "lucene_version" : "4.7"
      },
      "tagline" : "You Know, for Search"
    }
    

    이 MongoDB를 함께 재생할 수 있도록 지금 Elasticsearch 플러그인을 설치합니다.

    bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/1.6.0
    bin/plugin --install elasticsearch/elasticsearch-mapper-attachments/1.6.0
    

    이 두 플러그인이 필요하지 않습니다하지만 쿼리를 테스트 및 인덱스에 대한 변경 사항을 시각화들이있는 거 좋아.

    bin/plugin --install mobz/elasticsearch-head
    bin/plugin --install lukas-vlcek/bigdesk
    

    다시 시작 Elasticsearch.

    sudo service elasticsearch restart
    

    마지막으로 인덱스 MongoDB를에서 컬렉션.

    curl -XPUT localhost:9200/_river/DATABASE_NAME/_meta -d '{
      "type": "mongodb",
      "mongodb": {
        "servers": [
          { "host": "127.0.0.1", "port": 27017 }
        ],
        "db": "DATABASE_NAME",
        "collection": "ACTUAL_COLLECTION_NAME",
        "options": { "secondary_read_preference": true },
        "gridfs": false
      },
      "index": {
        "name": "ARBITRARY INDEX NAME",
        "type": "ARBITRARY TYPE NAME"
      }
    }'
    

    색인이 Elasticsearch에 있는지 확인

    curl -XGET http://localhost:9200/_aliases
    

    클러스터 상태를 확인합니다.

    curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
    

    그것은 몇 가지 할당되지 않은 파편 아마 노란색입니다. 우리는 우리가 작업 할 것을 Elasticsearch에게 있습니다.

    curl -XPUT 'localhost:9200/_settings' -d '{ "index" : { "number_of_replicas" : 0 } }'
    

    다시 클러스터 상태를 확인합니다. 이제 녹색이어야합니다.

    curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
    

    이동 놀이.

  2. ==============================

    2.당신의 작업이 최대 확장시 문제를 제시 할 수 강을 사용. 강 때 무거운 작업에서 메모리의 톤을 사용합니다. 나는 당신의 자신의 elasticsearch 모델을 구현하는 것이 좋습니다, 또는 당신은 당신이 그 권리 또는 본질적으로 당신을 위해이 작업을 수행 사용 mongoosastic로 elasticsearch 모델을 구축 할 수 몽구스를 사용하는 경우.

    당신의 작업이 최대 확장시 문제를 제시 할 수 강을 사용. 강 때 무거운 작업에서 메모리의 톤을 사용합니다. 나는 당신의 자신의 elasticsearch 모델을 구현하는 것이 좋습니다, 또는 당신은 당신이 그 권리 또는 본질적으로 당신을 위해이 작업을 수행 사용 mongoosastic로 elasticsearch 모델을 구축 할 수 몽구스를 사용하는 경우.

    당신이 MongoDB를의 2.4.x에서 지점 및 ElasticSearch의 0.90.x.를 사용하여 붙어있을거야 MongoDB를 강에 또 다른 단점은 당신은 당신이 정말 좋은 기능이 많이 놓치고있는 것을 찾아 시작합니다, 그리고 MongoDB를 강 프로젝트는 안정을 유지하는만큼 빠르게 사용 가능한 제품을 생산하지 않습니다. 즉 MongoDB를 강 확실히 내가 함께 생산에 가고 싶어요 것이 아닙니다 말했다. 그것은 그것의 가치보다 더 많은 문제를 제기합니다. 그것은 무작위로는 메모리를 많이 소모합니다, 부하 쓰기 떨어질 것이다, 그 뚜껑에 아무런 설정이 없습니다. 또한, 강은 MongoDB의에서 oplogs를 읽고, 실시간으로 업데이트하지 않습니다, 이것은 내 경험만큼 최대 5 분 동안 업데이트를 지연시킬 수 있습니다.

    그 주간 발생하는 일이 ElasticSearch와 잘못 때문에 우리는 최근 우리의 프로젝트의 큰 부분을 다시 작성했다. 우리는 심지어 멀리 또한 강에서 멀리 이동하기 위해 최선 점에 동의 데브 옵스 컨설턴트를 고용하기로 갔다.

    최신 정보: Elasticsearch - MongoDB의 강은 이제 ES v1.4.0을하고 MongoDB를 v2.6.x. 지원 이 플러그인 동기화하여 MongoDB의 oplogs을 읽으려고합니다 그러나, 당신은 여전히 ​​가능성이 무거운 삽입 / 업데이트 작업에 성능 문제로 실행하겠습니다. 이 잠금 때문에 작업이 많이 있습니다 (또는 오히려 래치) 잠금 해제를하는 경우, 당신은 당신의 elasticsearch 서버에서 매우 높은 메모리 사용량을 알 수 있습니다. 당신은 큰 작업을 필요 계획이라면, 강 좋은 옵션이 아닙니다. ElasticSearch의 개발자들은 여전히 ​​언어의 클라이언트 라이브러리를 사용하여 API와 직접 통신보다는 강을 사용하여 자신의 인덱스를 관리하는 것이 좋습니다. 이건 정말 강의의 목적이 아니다. 트위터 강은 강이 사용되는 방법의 좋은 예입니다. 그것의 외부 소스에서 소스 데이터에 본질적으로 좋은 방법,하지만 높은 트래픽 또는 내부 사용을위한 매우 신뢰할 수 없습니다.

    또한이 ElasticSearch기구가 유지되지로서 그 MongoDB의 강이 버전에서 뒤 떨어질 고려, 자사의 타사에 의해 유지했다. 개발 V1.0의 출시 이후 오랜 시간 동안 v0.90 지점에 부착되고, V1.0에 대한 버전이 출시되었을 때 그것은 elasticsearch 발표 1.3.0까지 안정되지 않았습니다. MongoDB의 버전도 뒤 떨어진다. 당신이가는 길에 많은 매우 기대 기능, 무거운 개발 중에 특히 ElasticSearch와 각의 이후 버전으로 이동하고자 할 때 당신은 꽉 자리에 자신을 찾을 수 있습니다. 우리는 지속적으로 우리의 제품의 그것의 핵심 부분으로 우리의 검색 기능을 개선에 크게 의존으로 최신 ElasticSearch에 최대 머무는 것은 매우 중요했다.

    당신이 직접 할 경우 모두 모두 당신은 가능성이 더 나은 제품을 얻을 수 있습니다. 그 어려운 없습니다. 그것의 또 다른 데이터베이스 코드에서 관리하고, 쉽게 리팩토링없이 기존 모델에서 삭제 될 수 있습니다.

  3. ==============================

    3.나는 몽고 커넥터가 유용하다고. 그것은 몽고 연구소 (MongoDB를 주식 회사) 형태이며 Elasticsearch 2.x를 함께 지금 사용할 수 있습니다

    나는 몽고 커넥터가 유용하다고. 그것은 몽고 연구소 (MongoDB를 주식 회사) 형태이며 Elasticsearch 2.x를 함께 지금 사용할 수 있습니다

    탄성 2.x는 문서 관리자 : https://github.com/mongodb-labs/elastic2-doc-manager

    몽고 커넥터는 SOLR, Elasticsearch 또는 다른 MongoDB의 클러스터와 하나 개 이상의 타겟 시스템에 MongoDB의 클러스터에서의 파이프 라인을 생성한다. 그런 다음 대상에 MongoDB의 데이터를 동기화 실시간으로하여 MongoDB의 운영과 유지는 MongoDB를의 oplog 테일. 이것은 파이썬 2.6, 2.7 및 3.3 이상에서 테스트되었습니다. 자세한 문서는 위키 볼 수 있습니다.

    https://github.com/mongodb-labs/mongo-connector https://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch

  4. ==============================

    4.당신은 거의 실시간으로 동기화 및 일반 솔루션을 갖고 싶어하면 강은 좋은 솔루션입니다.

    당신은 거의 실시간으로 동기화 및 일반 솔루션을 갖고 싶어하면 강은 좋은 솔루션입니다.

    이미 MongoDB의 데이터를 가지고처럼 아주 쉽게 Elasticsearch에 다시 발송하려면 "원 샷"당신은 Node.js를 https://github.com/itemsapi/elasticbulk 내 패키지를 시도 할 수 있습니다.

    당신이 스트림 (즉 MongoDB를, PostgreSQL을, MySQL은, JSON 파일 등)을 지원하고 무엇을 모든 데이터를 가져올 수 있도록 Node.js를 스트림을 사용하고

    Elasticsearch에 MongoDB를위한 예 :

    패키지를 설치합니다 :

    npm install elasticbulk
    npm install mongoose
    npm install bluebird
    

    스크립트 즉 script.js 만들기 :

    const elasticbulk = require('elasticbulk');
    const mongoose = require('mongoose');
    const Promise = require('bluebird');
    mongoose.connect('mongodb://localhost/your_database_name', {
      useMongoClient: true
    });
    
    mongoose.Promise = Promise;
    
    var Page = mongoose.model('Page', new mongoose.Schema({
      title: String,
      categories: Array
    }), 'your_collection_name');
    
    // stream query 
    var stream = Page.find({
    }, {title: 1, _id: 0, categories: 1}).limit(1500000).skip(0).batchSize(500).stream();
    
    elasticbulk.import(stream, {
      index: 'my_index_name',
      type: 'my_type_name',
      host: 'localhost:9200',
    })
    .then(function(res) {
      console.log('Importing finished');
    })
    

    데이터를 배송 :

    node script.js
    

    그것은 매우 빠른 아니지만 그것은 기록 (스트림 덕분에) 수백만 일하고있다.

  5. ==============================

    5.여기에 MongoDB를 3.0에서이 작업을 수행하는 방법에 대해 설명합니다. 나는이 좋은 블로그를 사용

    여기에 MongoDB를 3.0에서이 작업을 수행하는 방법에 대해 설명합니다. 나는이 좋은 블로그를 사용

  6. ==============================

    6.몽고 커넥터는 이제 죽은 보이므로, 우리 회사는 Elasticsearch에 출력 몽고 변화 스트림을 사용하기위한 도구를 구축하기로 결정했다.

    몽고 커넥터는 이제 죽은 보이므로, 우리 회사는 Elasticsearch에 출력 몽고 변화 스트림을 사용하기위한 도구를 구축하기로 결정했다.

    우리의 초기 결과는 유망한 보인다. 당신은 https://github.com/everyone-counts/mongo-stream에서 그것을 확인할 수 있습니다. 우리는 개발 초기 단계에 아직도, 제안 또는 기여를 환영합니다.

  7. ==============================

    7.여기에 내가 Elasticsearch에 MongoDB의 데이터를 마이그레이션하는 또 다른 좋은 옵션을 발견했다. 그 동기화 데몬 갈은 실시간으로 elasticsearch하는 MongoDB를. 그것 Monstache. 그것의 가능한 장소 : Monstache

    여기에 내가 Elasticsearch에 MongoDB의 데이터를 마이그레이션하는 또 다른 좋은 옵션을 발견했다. 그 동기화 데몬 갈은 실시간으로 elasticsearch하는 MongoDB를. 그것 Monstache. 그것의 가능한 장소 : Monstache

    구성을 사용하는 초기 단계 아래.

    1 단계:

    C:\Program Files\MongoDB\Server\4.0\bin>mongod --smallfiles --oplogSize 50 --replSet test
    

    2 단계 :

    C:\Program Files\MongoDB\Server\4.0\bin>mongo
    
    C:\Program Files\MongoDB\Server\4.0\bin>mongo
    MongoDB shell version v4.0.2
    connecting to: mongodb://127.0.0.1:27017
    MongoDB server version: 4.0.2
    Server has startup warnings:
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server.
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
    2019-01-18T16:56:44.931+0530 I CONTROL  [initandlisten]
    MongoDB Enterprise test:PRIMARY>
    

    3 단계 : 복제를 확인합니다.

    MongoDB Enterprise test:PRIMARY> rs.status();
    {
            "set" : "test",
            "date" : ISODate("2019-01-18T11:39:00.380Z"),
            "myState" : 1,
            "term" : NumberLong(2),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "heartbeatIntervalMillis" : NumberLong(2000),
            "optimes" : {
                    "lastCommittedOpTime" : {
                            "ts" : Timestamp(1547811537, 1),
                            "t" : NumberLong(2)
                    },
                    "readConcernMajorityOpTime" : {
                            "ts" : Timestamp(1547811537, 1),
                            "t" : NumberLong(2)
                    },
                    "appliedOpTime" : {
                            "ts" : Timestamp(1547811537, 1),
                            "t" : NumberLong(2)
                    },
                    "durableOpTime" : {
                            "ts" : Timestamp(1547811537, 1),
                            "t" : NumberLong(2)
                    }
            },
            "lastStableCheckpointTimestamp" : Timestamp(1547811517, 1),
            "members" : [
                    {
                            "_id" : 0,
                            "name" : "localhost:27017",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 736,
                            "optime" : {
                                    "ts" : Timestamp(1547811537, 1),
                                    "t" : NumberLong(2)
                            },
                            "optimeDate" : ISODate("2019-01-18T11:38:57Z"),
                            "syncingTo" : "",
                            "syncSourceHost" : "",
                            "syncSourceId" : -1,
                            "infoMessage" : "",
                            "electionTime" : Timestamp(1547810805, 1),
                            "electionDate" : ISODate("2019-01-18T11:26:45Z"),
                            "configVersion" : 1,
                            "self" : true,
                            "lastHeartbeatMessage" : ""
                    }
            ],
            "ok" : 1,
            "operationTime" : Timestamp(1547811537, 1),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1547811537, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            }
    }
    MongoDB Enterprise test:PRIMARY>
    

    4 단계.     다운로드 "https://github.com/rwynn/monstache/releases".     하고 다운로드 압축을 해제하면 플랫폼에 대한 폴더의 경로를 포함하도록 PATH 변수를 조정합니다.     GO는 cmd를 "monstache -v"를 입력합니다     # 4.13.1     Monstache는 구성에 대한 TOML 형식을 사용합니다. 마이그레이션 이름 config.toml의 파일 구성

    5 단계.

    내 config.toml ->

    mongo-url = "mongodb://127.0.0.1:27017/?replicaSet=test"
    elasticsearch-urls = ["http://localhost:9200"]
    
    direct-read-namespaces = [ "admin.users" ]
    
    gzip = true
    stats = true
    index-stats = true
    
    elasticsearch-max-conns = 4
    elasticsearch-max-seconds = 5
    elasticsearch-max-bytes = 8000000 
    
    dropped-collections = false
    dropped-databases = false
    
    resume = true
    resume-write-unsafe = true
    resume-name = "default"
    index-files = false
    file-highlighting = false
    verbose = true
    exit-after-direct-reads = false
    
    index-as-update=true
    index-oplog-time=true
    

    6 단계.

    D:\15-1-19>monstache -f config.toml
    

  8. from https://stackoverflow.com/questions/23846971/how-to-use-elasticsearch-with-mongodb by cc-by-sa and MIT license