Comments 13
Хорошая статья. Месяц назад тоже мигрировали с 1.7 на 5.3 (~90 млрд документов) и это было нетривиально.
Официальная документация по миграции все же есть: reinrex-from-remote. Эта процедура показывает очень хорошую производительность. Но есть проблема… Проблема в том, что при ошибках реиндексации(в моем случае конфликтах в типах) невозможно скипнуть документ (опция "conflicts": "proceed" не работает).
Поэтому я так же использовал logstash, правда производительность его оказалась не высока(около 5000док./сек). Я разбил daily индекс на N частей, и каждую часть реиндексировал отдельным экземпляром логстеша. Таким образом удалось достаточно быстро мигрировать документы.
По timestamp. Был общий конфиг (erb темплейт) куда подставлял нужные числа. Делил день на N частей. И на каждый индекс/логстеш генерировал свой конфиг. Запускал через SSHKit.
Понятное дело, что в этих таймфреймах разное количество документов, И общая производительность плавала, но мне это было не критично(я мог потратить на реиндексацию больше времени). Было бы критично, сделал бы селект по количеству документов в индексе, и распределил бы их равномерно по всем логстешам.
Да, кстати. Сейчас посмотрел в темплейт. Там еще для каждого экземпляра timeframe делится на N input по количеству свободных ядер
input {
# We read from the "old" cluster
elasticsearch {
hosts => [ "localhost:9200" ]
size => 1000
index => "logstash-2016.08.19"
docinfo => true
query => '{ "query": { "range": { "@timestamp": { "gte": "2016-08-19T16:00.000+00:00", "lte": "2016-08-19T16:59.999+00:00" } } } }'
}
elasticsearch {
hosts => [ "localhost:9200" ]
size => 1000
index => "logstash-2016.08.19"
docinfo => true
query => '{ "query": { "range": { "@timestamp": { "gte": "2016-08-19T17:00.000+00:00", "lte": "2016-08-19T17:59.999+00:00" } } } }'
}
elasticsearch {
hosts => [ "localhost:9200" ]
size => 1000
index => "logstash-2016.08.19"
docinfo => true
query => '{ "query": { "range": { "@timestamp": { "gte": "2016-08-19T18:00.000+00:00", "lte": "2016-08-19T18:59.999+00:00" } } } }'
}
}
output {
elasticsearch {
template => "/mnt/glustersnaps/logstash/config/template/reindex.json"
template_name => "logstash-*"
template_overwrite => true
hosts => ["es1:9200", "es2:9200", "es3:9200", "es4:9200", "es5:9200", "es6:9200"]
index => "%{[@metadata][_index]}"
}
}
ну и сам темплейт для индеков:
{
"template" : "logstash-*",
"version" : 50007,
"order" : 99,
"settings" : {
"index.refresh_interval": -1,
"number_of_replicas": 0,
"number_of_shards": 5,
"index.mapping.ignore_malformed": true,
"index.merge.scheduler.max_thread_count": 1,
"index.routing.allocation.require.box_type": "reindex"
}
}
Извините, что так долго :(
Вынес для себя много полезного.
С нетерпением буду ждать третьей части.
Сохранить данные и веру в человечество: большая миграция кластера ElasticSearch