วิธีย้ายข้อมูล elasticsearch จากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่ง


98

ฉันจะย้ายข้อมูล Elasticsearch จากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งได้อย่างไร

ฉันมีเซิร์ฟเวอร์A ที่รัน Elasticsearch 1.1.1บนโหนดโลคัลหนึ่งที่มีดัชนีหลายตัว ฉันต้องการคัดลอกข้อมูลนั้นไปยังเซิร์ฟเวอร์B ที่เรียกใช้ Elasticsearch 1.3.4

ขั้นตอนจนถึงตอนนี้

  1. ปิด ES ทั้งเซิร์ฟเวอร์และ
  2. scp ข้อมูลทั้งหมดไปยัง dir ข้อมูลที่ถูกต้องบนเซิร์ฟเวอร์ใหม่ (ดูเหมือนว่าข้อมูลจะอยู่ที่ / var / lib / elasticsearch / บนกล่องเดเบียนของฉัน)
  3. เปลี่ยนสิทธิ์และความเป็นเจ้าของเป็น elasticsearch: elasticsearch
  4. เริ่มต้นเซิร์ฟเวอร์ ES ใหม่

เมื่อฉันดูคลัสเตอร์ด้วยปลั๊กอิน ES head ไม่มีดัชนีปรากฏขึ้น

ดูเหมือนว่าข้อมูลจะไม่ถูกโหลด ฉันพลาดอะไรไปรึเปล่า?


2
โดยข้อมูลถ้าคุณหมายถึงดัชนีคุณสามารถย้ายโฟลเดอร์ดัชนีภายในโฟลเดอร์ elasticsearch / data / <clustername> / nodes / <node id> ไปยังตำแหน่งที่เกี่ยวข้องใหม่ได้ นี่คือโครงสร้างไดเร็กทอรี elasticsearch บน Windows ไม่แน่ใจว่าจะเหมือนกันกับ Debian หรือไม่ แต่แนวคิดก็คือคุณสามารถย้ายไดเร็กทอรีดัชนีจากคลัสเตอร์หนึ่งไปยังอีกคลัสเตอร์ได้โดยตรงโดยถือว่าความเข้ากันได้ไม่เสีย
bittusarkar

1
แน่ใจหรือว่า ES 1.1.1 และ ES 1.3.4 ใช้ลูซีนเวอร์ชันเดียวกัน ซึ่งอาจทำให้เกิดปัญหาความเข้ากันได้ นอกจากนี้ยังไม่มีการรับประกันว่าข้อมูลเมตาของ ES จะเหมือนกัน ฉันขอแนะนำให้ทำสำเนาโดยใช้โปรแกรม คัดลอกสคีมาดัชนีก่อนแล้วจึงนำเข้าข้อมูล
Zouzias

คำตอบ:


129

คำตอบที่เลือกทำให้ฟังดูซับซ้อนกว่าที่เป็นอยู่เล็กน้อยสิ่งต่อไปนี้คือสิ่งที่คุณต้องการ (ติดตั้ง npm ก่อนในระบบของคุณ)

npm install -g elasticdump
elasticdump --input=http://mysrc.com:9200/my_index --output=http://mydest.com:9200/my_index --type=mapping
elasticdump --input=http://mysrc.com:9200/my_index --output=http://mydest.com:9200/my_index --type=data

คุณสามารถข้ามคำสั่ง elasticdump แรกสำหรับสำเนาที่ตามมาได้หากการแม็ปยังคงคงที่

ฉันเพิ่งทำการย้ายข้อมูลจาก AWS ไปยัง Qbox.io โดยไม่มีปัญหาใด ๆ

ดูรายละเอียดเพิ่มเติมได้ที่:

https://www.npmjs.com/package/elasticdump

หน้าช่วยเหลือ (ณ เดือนกุมภาพันธ์ 2016) รวมไว้เพื่อความสมบูรณ์:

elasticdump: Import and export tools for elasticsearch

Usage: elasticdump --input SOURCE --output DESTINATION [OPTIONS]

--input
                    Source location (required)
--input-index
                    Source index and type
                    (default: all, example: index/type)
--output
                    Destination location (required)
--output-index
                    Destination index and type
                    (default: all, example: index/type)
--limit
                    How many objects to move in bulk per operation
                    limit is approximate for file streams
                    (default: 100)
--debug
                    Display the elasticsearch commands being used
                    (default: false)
--type
                    What are we exporting?
                    (default: data, options: [data, mapping])
--delete
                    Delete documents one-by-one from the input as they are
                    moved.  Will not delete the source index
                    (default: false)
--searchBody
                    Preform a partial extract based on search results
                    (when ES is the input,
                    (default: '{"query": { "match_all": {} } }'))
--sourceOnly
                    Output only the json contained within the document _source
                    Normal: {"_index":"","_type":"","_id":"", "_source":{SOURCE}}
                    sourceOnly: {SOURCE}
                    (default: false)
--all
                    Load/store documents from ALL indexes
                    (default: false)
--bulk
                    Leverage elasticsearch Bulk API when writing documents
                    (default: false)
--ignore-errors
                    Will continue the read/write loop on write error
                    (default: false)
--scrollTime
                    Time the nodes will hold the requested search in order.
                    (default: 10m)
--maxSockets
                    How many simultaneous HTTP requests can we process make?
                    (default:
                      5 [node <= v0.10.x] /
                      Infinity [node >= v0.11.x] )
--bulk-mode
                    The mode can be index, delete or update.
                    'index': Add or replace documents on the destination index.
                    'delete': Delete documents on destination index.
                    'update': Use 'doc_as_upsert' option with bulk update API to do partial update.
                    (default: index)
--bulk-use-output-index-name
                    Force use of destination index name (the actual output URL)
                    as destination while bulk writing to ES. Allows
                    leveraging Bulk API copying data inside the same
                    elasticsearch instance.
                    (default: false)
--timeout
                    Integer containing the number of milliseconds to wait for
                    a request to respond before aborting the request. Passed
                    directly to the request library. If used in bulk writing,
                    it will result in the entire batch not being written.
                    Mostly used when you don't care too much if you lose some
                    data when importing but rather have speed.
--skip
                    Integer containing the number of rows you wish to skip
                    ahead from the input transport.  When importing a large
                    index, things can go wrong, be it connectivity, crashes,
                    someone forgetting to `screen`, etc.  This allows you
                    to start the dump again from the last known line written
                    (as logged by the `offset` in the output).  Please be
                    advised that since no sorting is specified when the
                    dump is initially created, there's no real way to
                    guarantee that the skipped rows have already been
                    written/parsed.  This is more of an option for when
                    you want to get most data as possible in the index
                    without concern for losing some rows in the process,
                    similar to the `timeout` option.
--inputTransport
                    Provide a custom js file to us as the input transport
--outputTransport
                    Provide a custom js file to us as the output transport
--toLog
                    When using a custom outputTransport, should log lines
                    be appended to the output stream?
                    (default: true, except for `$`)
--help
                    This page

Examples:

# Copy an index from production to staging with mappings:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=mapping
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=data

# Backup index data to a file:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=/data/my_index_mapping.json \
  --type=mapping
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=/data/my_index.json \
  --type=data

# Backup and index to a gzip using stdout:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=$ \
  | gzip > /data/my_index.json.gz

# Backup ALL indices, then use Bulk API to populate another ES cluster:
elasticdump \
  --all=true \
  --input=http://production-a.es.com:9200/ \
  --output=/data/production.json
elasticdump \
  --bulk=true \
  --input=/data/production.json \
  --output=http://production-b.es.com:9200/

# Backup the results of a query to a file
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=query.json \
  --searchBody '{"query":{"term":{"username": "admin"}}}'

------------------------------------------------------------------------------
Learn more @ https://github.com/taskrabbit/elasticsearch-dump`enter code here`

ฉันลองแล้ว แต่ได้รับข้อความ "Error Emitted => connect ECONNREFUSED" ทุกครั้ง
Vagabond

4
จะใช้การตรวจสอบสิทธิ์พื้นฐานได้อย่างไร
Mohd Shahid

ระวังยังไม่รองรับ Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni

@OrtomalaLokni ดูเหมือนว่ารองรับ 5.x อยู่ใน: github.com/taskrabbit/elasticsearch-dump/pull/268
Beau

ฉันได้ตั้งค่าการตรวจสอบความถูกต้องสำหรับ elasticsearch คุณช่วยบอกวิธีส่งชื่อผู้ใช้และรหัสผ่านในคำสั่งพร้อมกับตำแหน่งอินพุตและเอาต์พุตได้ไหม
Gr8 Adakron

42

ใช้ElasticDump

1) ยำติดตั้ง epel-release

2) ยำติดตั้ง nodejs

3) ยำติดตั้ง npm

4) npm ติดตั้ง elasticdump

5) cd node_modules / elasticdump / bin

6)

./elasticdump \

  --input=http://192.168.1.1:9200/original \

  --output=http://192.168.1.2:9200/newCopy \

  --type=data

นี่คือเวลาที่ข้อมูลต้องถูกส่งต่อจากตำแหน่งหนึ่งไปยังอีกที่หนึ่ง แต่อยู่บนเซิร์ฟเวอร์เดียวกัน จะเป็นอย่างไรหากต้องโอนข้อมูลไปยังตำแหน่งเซิร์ฟเวอร์ที่แตกต่างกันสองตำแหน่งโดยมีที่อยู่ IP ที่แตกต่างกันสองรายการ
Vagabond

2
@tramp เป็น 2 ที่อยู่ IP ที่แตกต่างกัน
de Raad

1
ระวังยังไม่รองรับ Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni

2
ดูเหมือนว่า Elasticsearch 5 ได้รับการสนับสนุนแล้วgithub.com/taskrabbit/elasticsearch-dump/pull/268
hayduke

22

คุณสามารถใช้คุณสมบัติsnapshot / restore ที่มีอยู่ใน Elasticsearch สำหรับสิ่งนี้ เมื่อคุณตั้งค่าที่เก็บ snapshot ตามระบบไฟล์แล้วคุณสามารถย้ายไปมาระหว่างคลัสเตอร์และกู้คืนในคลัสเตอร์อื่น


1
ตรวจสอบลิงค์นี้สำหรับข้อมูลเพิ่มเติม: qbox.io/blog/elasticsearch-data-snapshots-restore-tutorial
WaughWaugh

6

ฉันลองใช้ ubuntu เพื่อย้ายข้อมูลจาก ELK 2.4.3 เป็น ELK 5.1.1

ต่อไปนี้เป็นขั้นตอน

$ sudo apt-get update

$ sudo apt-get install -y python-software-properties python g++ make

$ sudo add-apt-repository ppa:chris-lea/node.js

$ sudo apt-get update

$ sudo apt-get install npm

$ sudo apt-get install nodejs

$ npm install colors

$ npm install nomnom

$ npm install elasticdump

ในโฮมไดเร็กทอรี goto

$ cd node_modules/elasticdump/

ดำเนินการคำสั่ง

หากคุณต้องการ http auth ขั้นพื้นฐานคุณสามารถใช้งานได้ดังนี้:

--input=http://name:password@localhost:9200/my_index

คัดลอกดัชนีจากการผลิต:

$ ./bin/elasticdump --input="http://Source:9200/Sourceindex" --output="http://username:password@Destination:9200/Destination_index"  --type=data

ดีจัง. เพียงตรวจสอบให้แน่ใจว่าได้รันsudo apt-get install -y software-properties-commonก่อน add-apt-repository
Sahas

หวังว่ามันจะสมควรได้รับ +1
Akshay Patil

5

นอกจากนี้ยังมี_reindexตัวเลือก

จากเอกสารประกอบ:

ด้วย Elasticsearch reindex API ซึ่งมีให้ใช้งานในเวอร์ชัน 5.x ขึ้นไปคุณสามารถเชื่อมต่อการปรับใช้ Elasticsearch Service ใหม่จากระยะไกลกับคลัสเตอร์ Elasticsearch เก่าของคุณ ซึ่งจะดึงข้อมูลจากคลัสเตอร์เก่าของคุณและจัดทำดัชนีไปยังคลัสเตอร์ใหม่ของคุณ การจัดทำดัชนีใหม่โดยพื้นฐานแล้วจะสร้างดัชนีใหม่ตั้งแต่ต้นและอาจต้องใช้ทรัพยากรมากขึ้นในการรัน

POST _reindex
{
  "source": {
    "remote": {
      "host": "https://REMOTE_ELASTICSEARCH_ENDPOINT:PORT",
      "username": "USER",
      "password": "PASSWORD"
    },
    "index": "INDEX_NAME",
    "query": {
      "match_all": {}
    }
  },
  "dest": {
    "index": "INDEX_NAME"
  }
}

4

หากคุณสามารถเพิ่มเซิร์ฟเวอร์ที่สองลงในคลัสเตอร์คุณสามารถทำได้:

  1. เพิ่มเซิร์ฟเวอร์ B เข้ากับคลัสเตอร์ด้วยเซิร์ฟเวอร์ A
  2. เพิ่มจำนวนแบบจำลองสำหรับดัชนี
  3. ES จะคัดลอกดัชนีไปยังเซิร์ฟเวอร์ B โดยอัตโนมัติ
  4. ปิดเซิร์ฟเวอร์ A
  5. ลดจำนวนแบบจำลองสำหรับดัชนี

สิ่งนี้จะใช้ได้เฉพาะเมื่อจำนวนการแทนที่เท่ากับจำนวนโหนด


3
ฉันเชื่อว่าสิ่งนี้จะใช้ไม่ได้เมื่อเวอร์ชันต่างกัน (ตามที่ในคำถามของ OP)
WoJ

แน่นอน ตอนนี้ฉันกำลังดำเนินการย้ายข้อมูลไปยัง ESv5 จาก ESv1.7 ตัวเลือกของฉันจะใช้ไม่ได้เนื่องจากมีการเปลี่ยนแปลงหลายอย่างในการแมป
AndreyP

3

หากใครพบปัญหาเดียวกันเมื่อพยายามทิ้งจาก elasticsearch <2.0 ถึง> 2.0 คุณต้องทำ:

elasticdump --input=http://localhost:9200/$SRC_IND --output=http://$TARGET_IP:9200/$TGT_IND --type=analyzer
elasticdump --input=http://localhost:9200/$SRC_IND --output=http://$TARGET_IP:9200/$TGT_IND --type=mapping
elasticdump --input=http://localhost:9200/$SRC_IND --output=http://$TARGET_IP:9200/$TGT_IND --type=data --transform "delete doc.__source['_id']"

1

ฉันประสบความสำเร็จเสมอเพียงแค่คัดลอกไดเรกทอรี / โฟลเดอร์ดัชนีไปยังเซิร์ฟเวอร์ใหม่และเริ่มต้นใหม่ คุณจะพบรหัสดัชนีโดยการทำGET /_cat/indicesและโฟลเดอร์ที่ตรงกับรหัสนี้อยู่ในdata\nodes\0\indices(โดยปกติจะอยู่ในโฟลเดอร์ elasticsearch ของคุณเว้นแต่คุณจะย้ายไป)


1

เราสามารถใช้elasticdumpหรือmultielasticdumpเพื่อสำรองข้อมูลและเรียกคืนเราสามารถย้ายข้อมูลจากเซิร์ฟเวอร์ / คลัสเตอร์หนึ่งไปยังเซิร์ฟเวอร์ / คลัสเตอร์อื่น

กรุณาหาคำตอบที่รายละเอียดซึ่งผมได้ให้ ที่นี่


0

หากคุณก็ต้องถ่ายโอนข้อมูลจากเซิร์ฟเวอร์ ElasticSearch หนึ่งไปยังอีกที่คุณยังสามารถใช้ElasticSearch เอกสารการถ่ายโอน

ขั้นตอน:

  1. เปิดไดเร็กทอรีในเทอร์มินัลของคุณและเรียกใช้
    $ npm install elasticsearch-document-transfer.
  2. สร้างไฟล์ config.js
  3. เพิ่มรายละเอียดการเชื่อมต่อของเซิร์ฟเวอร์ elasticsearch ทั้งสองใน config.js
  4. ตั้งค่าที่เหมาะสมใน options.js
  5. รันในเทอร์มินัล
    $ node index.js

0

คุณสามารถถ่ายภาพรวมของสถานะทั้งหมดของคลัสเตอร์ของคุณ (รวมถึงดัชนีข้อมูลทั้งหมด) และกู้คืน (โดยใช้ API การคืนค่า) ในคลัสเตอร์หรือเซิร์ฟเวอร์ใหม่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.