IT

MongoDB에서 Elastic Search를 사용하는 방법

itgroup 2023. 2. 14. 20:10
반응형

MongoDB에서 Elastic Search를 사용하는 방법

Elastic Search for MongoDB를 구성하여 MongoDB 컬렉션을 MongoDB로 색인화하는 것에 대해 많은 블로그와 사이트를 살펴보았지만, 어느 것도 간단하지 않았습니다.

다음과 같은 Elastic Search 설치 프로세스를 단계별로 설명해 주십시오.

  • 배열
  • 브라우저에서 실행하다

express.js와 함께 Node.js를 사용하고 있으니, 잘 부탁드립니다.

이 답변은 MongoDB, Elasticsearch 및 Angular를 사용하여 기능 검색 구성 요소 구축에 대한 이 튜토리얼을 따르도록 설정하기에 충분합니다.JS.

API의 데이터를 사용하여 패싯 검색을 사용하고자 한다면 Matthiasn의 BirdWatch Repo를 참고하십시오.

예를 들어 단일 노드 Elasticsearch "클러스터"를 설정하여 새로운 EC2 Ubuntu 14.04 인스턴스의 NodeJS Express 앱에서 사용할 수 있도록 MongoDB를 인덱싱할 수 있습니다.

모든 것이 최신인지 확인합니다.

sudo apt-get update

NodeJS 를 인스톨 합니다.

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

MongoDB 설치 - 이 절차는 MongoDB 문서에서 직접 수행합니다.원하는 버전을 선택하십시오.MongoDB-River가 문제없이 지원하는 최신 버전이기 때문에 v2.4.9를 고수합니다.

MongoDB 공용 GPG 키를 Import합니다.

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

최신 버전을 원하지 않으면 해당 버전을 선택하십시오.윈도우즈 7 또는 8 시스템에서 환경을 설정하는 경우 v2.6을 서비스로 실행할 때 버그가 해결될 때까지 v2.6에서 멀리 떨어져 있어야 합니다.

apt-get install mongodb-10gen=2.4.9

업데이트 시 MongoDB 설치 버전이 업로드되지 않도록 합니다.

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

MongoDB 서비스를 시작합니다.

sudo service mongodb start

데이터베이스 파일은 기본적으로 /var/lib/mongo이고 로그 파일은 /var/log/mongo입니다.

mongo 쉘을 통해 데이터베이스를 만들고 더미 데이터를 푸시합니다.

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()

현재 MongoDB를 서비스로 실행하고 있기 때문에 mongod 프로세스를 재시작할 때 명령줄 인수의 "--replSet rs0" 옵션을 전달하지 않습니다.대신 mongod.conf 파일에 저장했습니다.

vi /etc/mongod.conf

다음 행을 추가하여 DB 및 로그 경로를 지정합니다.

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

이제 복제 세트를 초기화하기 위해 mongo 쉘을 다시 엽니다.

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.

이제 Elastic Search를 설치합니다.그냥 도움이 되는 Gist를 따라가는 거야.

Java 가 인스톨 되어 있는 것을 확인합니다.

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

V1.2.1에서 Mongo-River 플러그인 버그가 수정될 때까지 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

Elastic Search 서비스를 시작합니다.

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"
}

이제 Elastic Search 플러그인을 설치하여 MongoDB에서 재생할 수 있습니다.

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

Elastic Search를 재시작합니다.

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"
  }
}'

인덱스가 Elastic Search에 있는지 확인합니다.

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

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

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

아마 노란색에 파편이 있을 거야Elastic Search에게 우리가 뭘 하고 싶은지 말해야 해.

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

클러스터 상태를 다시 확인하십시오.이제 초록색이 될 거예요.

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

가서 놀아라.

하천을 사용하면 작업이 확장될 때 문제가 발생할 수 있습니다.River는 많은 양의 메모리를 사용합니다.독자적인 탄성 검색 모델을 실장하는 것을 추천합니다.또, mongoose 를 사용하고 있는 경우는, 탄성 검색 모델을 거기에 직접 짜넣거나, mongoesastic 를 사용할 수도 있습니다.이것에 의해, 본질적으로 도움이 됩니다.

Mongodb River의 또 다른 단점은 Mongodb 2.4.x 브런치와 Elastic Search 0.90.x를 사용하는 것입니다.Mongodb River 프로젝트는 많은 훌륭한 기능들을 놓치고 있다는 것을 알게 될 것입니다.또한 Mongodb River 프로젝트는 안정감을 유지할 수 있을 만큼 빠르게 사용할 수 있는 제품을 생산하지 못합니다.Mongodb River는 내가 제작에 투입할 수 있는 것이 아니라고 하는군요.가치보다 더 많은 문제를 제기하고 있습니다.부하가 높은 상태에서는 기입이 랜덤으로 드롭 되어 대량의 메모리가 소비되어 상한 설정을 할 수 없습니다.또한, River는 실시간으로 업데이트되지 않고 mongodb에서 oplog를 읽어내며, 제 경험상 5분 정도 업데이트가 지연될 수 있습니다.

Elastic Search에서 매주 문제가 발생하여 프로젝트의 상당 부분을 다시 작성해야 했습니다.심지어 Dev Ops 컨설턴트를 고용하기까지 했는데, 그는 River에서 벗어나는 것이 최선이라는 데 동의했습니다.

업데이트: Elasticsearch-mongodb-river는 ES v1.4.0 및 mongodb v2.6.x를 지원하게 되었습니다.그러나 이 플러그인은 mongodb의 oplogs를 읽어 동기화하기 위해 시도하기 때문에 삽입/업데이트 작업이 많을 때 성능 문제가 발생할 수 있습니다.잠금(또는 래치)이 해제된 후 작업이 많이 수행되는 경우, Elastic Search 서버에서 메모리 사용량이 매우 높다는 것을 알 수 있습니다.대규모 수술을 할 계획이라면 강은 좋은 선택이 아니다.ElasticSearch 개발자는 여전히 river를 사용하는 대신 해당 언어의 클라이언트 라이브러리를 사용하여 API와 직접 통신하여 자체 인덱스를 관리할 것을 권장합니다.이것은 사실 강의 목적이 아닙니다.Twitter-river는 강이 어떻게 사용되어야 하는지에 대한 좋은 예이다.기본적으로는 외부 소스에서 데이터를 소싱하는 훌륭한 방법이지만, 높은 트래픽이나 내부 사용에는 그다지 신뢰성이 없습니다.

또한 mongodb-river는 서드파티에 의해 유지되는 ElasticSearch Organization에 의해 유지되지 않기 때문에 버전이 뒤처진다는 점도 고려해야 합니다.v1.0 출시 이후 오랫동안 v0.90 브랜치에 대한 개발이 중단되었으며, v1.0용 버전이 출시되었을 때 Elastic Search가 v1.3.0을 출시할 때까지 안정적이지 않았습니다.Mongodb 버전도 뒤처집니다.각 버전의 최신 버전으로 전환해야 하는 경우, 특히 많은 기능이 개발되고 있는 Elastic Search를 사용하면 더욱 곤란한 상황에 처할 수 있습니다.최신 Elastic Search를 계속 사용하는 것은 매우 중요하며, 이는 검색 기능이 당사 제품의 핵심 부분이기 때문에 지속적으로 개선되어야 하기 때문입니다.

대체로 당신이 직접 하면 더 좋은 제품을 얻을 수 있을 것이다.그렇게 어렵지 않아요.코드로 관리할 수 있는 또 다른 데이터베이스일 뿐이며, 대규모 리팩터링 없이 기존 모델에 쉽게 드롭할 수 있습니다.

River는 실시간에 가까운 동기화 및 일반적인 솔루션을 원하는 경우 좋은 솔루션입니다.

이미 MongoDB에 데이터가 있고 "원샷"처럼 Elastic Search로 쉽게 보내고 싶다면 Node.js https://github.com/itemsapi/elasticbulk에서 패키지를 사용해 보십시오.

Node.js 스트림을 사용하여 스트림을 지원하는 모든 것(MongoDB, Postgre 등)에서 데이터를 Import할 수 있습니다.SQL, MySQL, JSON 파일 등)

MongoDB에서 Elastic Search로의 예:

패키지 설치:

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

매우 빠르지는 않지만 (스트림 덕분에) 수백만 개의 레코드에 대응하고 있습니다.

여기서 MongoDB 데이터를 Elastic Search로 이행할 수 있는 다른 좋은 옵션을 찾았습니다.실시간으로 mongodb를 Elastic Search에 동기화하는 Go 데몬입니다.몬스타체다.구입처: 몬스타체

설정 및 사용하기 위한 초기 setp 아래.

순서 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 변수를 조정하여 플랫폼 폴더 경로를 포함합니다.cmd로 이동하여 입력"monstache -v"# 4.13.1 몬스타체.config.tomlconfig.toml이라는 합니다.

스텝 5

my 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

몬스타시 실행 중...

Elastic Search에서 마이그레이션된 데이터 확인

Mongo에서 레코드 추가

몬스타시 이벤트를 캡처하여 데이터를 탄력적 검색으로 마이그레이션

나는 mongo-connector가 유용하다는 것을 알았다.Mongo Labs(MongoDB Inc.)에서 Elastic Search 2.x에서 사용할 수 있습니다.

Elastic 2.x Doc Manager : https://github.com/mongodb-labs/elastic2-doc-manager

mongo-connector는 MongoDB 클러스터에서 Solr, Elasticsearch 또는 다른 MongoDB 클러스터와 같은 하나 이상의 대상 시스템으로의 파이프라인을 만듭니다.MongoDB의 데이터를 타깃에 동기화한 후 MongoDB의 oplog를 추적하여 실시간으로 MongoDB의 조작에 대응합니다.Python 2.6, 2.7 및 3.3+로 테스트되었습니다.자세한 내용은 Wiki에서 확인할 수 있습니다.

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

mongodb 3.0에서 이 작업을 수행하는 방법은 다음과 같습니다.는 이 멋진 블로그를 이용했다.

  1. mongodb를 설치합니다.
  2. 데이터 디렉토리 작성:
$ mkdir RANDOM_PATH/node1
$ mkdir RANDOM_PATH/node2> 
$ mkdir RANDOM_PATH/node3
  1. Mongod 인스턴스 시작
$ mongod --replSet test --port 27021 --dbpath node1
$ mongod --replSet test --port 27022 --dbpath node2
$ mongod --replSet test --port 27023 --dbpath node3
  1. 복제 세트 구성:
$ mongo
config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]};    
rs.initiate(config);
  1. Elastic Search 설치 중:
a. Download and unzip the [latest Elasticsearch][2] distribution

b. Run bin/elasticsearch to start the es server.

c. Run curl -XGET http://localhost:9200/ to confirm it is working.
  1. MongoDB River 설치 및 구성:

$ bin/bin --install com.github.comwilly98.comsearch/comsearch-river-mongodb

$ bin/mapper --install elastic search/selective-search-mapper-requ

  1. "강" 및 인덱스 만들기:

-XPUT 'http://localhost:8080/_river/mongodb/_meta' -d '유형: "mongodb", "mongodb": {"db": "mydb", "collection": "foo" }, "index": "name", "type": "random" } } }

  1. 브라우저에서 테스트:

    http://localhost: 9200/_search?q=home

mongo-connector가 고장났기 때문에 우리 회사는 Mongo를 사용하여 스트림을 Elasticsearch로 출력하기 위한 툴을 구축하기로 했습니다.

우리의 초기 결과는 유망해 보인다.https://github.com/electionsexperts/mongo-stream에서 확인하실 수 있습니다.아직 개발 초기 단계이므로 제안이나 기부를 환영합니다.

언급URL : https://stackoverflow.com/questions/23846971/how-to-use-elasticsearch-with-mongodb

반응형