Pull to refresh

Comments 13

Читается как детективный роман, спасибо автору за изложение :)
Надеюсь, что развязка в финале не разочарует :)

Хорошая статья. Месяц назад тоже мигрировали с 1.7 на 5.3 (~90 млрд документов) и это было нетривиально.
Официальная документация по миграции все же есть: reinrex-from-remote. Эта процедура показывает очень хорошую производительность. Но есть проблема… Проблема в том, что при ошибках реиндексации(в моем случае конфликтах в типах) невозможно скипнуть документ (опция "conflicts": "proceed" не работает).
Поэтому я так же использовал logstash, правда производительность его оказалась не высока(около 5000док./сек). Я разбил daily индекс на N частей, и каждую часть реиндексировал отдельным экземпляром логстеша. Таким образом удалось достаточно быстро мигрировать документы.

Помнится над тюнингом logstash я просидел целый день. В итоге он разгонялся в пике до 23-25 тысяч записей в секунду (на каждый запущенный экземпляр), но под него был выделен целый сервер.
А кстати интересно — по какому принципу делили и как logstash понимал с какой частью ему работать?

По 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"
  }
}
Первые две статьи — отличные. Жду с наибольшим интересом третью — про мониторинг. Как раз предстоит поднимать/настраивать систему логгирования.
Отличная статья, большое спасибо!
Вынес для себя много полезного.
С нетерпением буду ждать третьей части.
Sign up to leave a comment.