Супер полные навыки настройки производительности Elasticsearch, ценная коллекция!

Elasticsearch

оригинал::эластичный search.cai/article/620…

Потому что я всегда вижу, как многие студенты говорят, что производительность elasticsearch недостаточно хороша, кластер недостаточно стабилен, и они спрашивают о настройке elasticsearch, но каждый раз говорят о каждой точке в отдельности, причем часто в каждом конкретном случае. ответы.Для повседневного использования и настройки elasticsearch, следующее только мой повседневный опыт.Если есть какие-то упущения, пожалуйста, поправьте меня.

1. Настройка файла конфигурации

elasticsearch.yml

блокировка памяти

bootstrap.memory_lock:trueПозволяет JVM блокировать память и предотвращать выгрузку ОС.

zen.discovery

Elasticsearch по умолчанию настроен на использование одноадресного обнаружения, чтобы предотвратить непреднамеренное присоединение узлов к кластеру. Обнаружение многоадресной рассылки никогда не следует использовать в производственных средах, иначе вы получите узел, случайно присоединившийся к вашей производственной среде просто потому, что он получил плохой сигнал многоадресной рассылки. ES — это распределенная P2P-система, используя протокол gossip, любой запрос кластера может быть отправлен на любой узел в кластере, и тогда ES найдет узел, который необходимо переадресовать, и свяжется с ним. В версии es1.x es включает мультикаст по умолчанию.После запуска es можно быстро добавить тот же экземпляр имени кластера и порта по умолчанию в локалке в большой кластер.После es2.x он будет настроен на одиночный трансляция во избежание проблем с безопасностью и сетевых штормов;

Одноадресная передачаdiscovery.zen.ping.unicast.hosts, рекомендуется прописывать все узлы и порты в кластере.Если к кластеру присоединяется новый экземпляр, то новому экземпляру нужно только записать экземпляр текущего кластера, и он может быть автоматически добавлен в текущий кластер, а затем Конфигурация исходного экземпляра может быть обработана, а новый экземпляр может быть добавлен Кластер, нет необходимости перезапускать исходный экземпляр Конфигурация, связанная с узлом zen:discovery.zen.ping_timeout: В процессе оценки выбора главного узла было обнаружено, что настройка тайм-аута выживания других узлов в основном влияет на время, затрачиваемое на выбор.Параметры вступают в силу только при присоединении или выборе главного узла.discovery.zen.join_timeout: Время ожидания для узла, чтобы присоединиться к кластеру и отправить запрос на присоединение к главному узлу, по умолчанию 3sdiscovery.zen.minimum_master_nodes: Минимальное количество узлов, участвующих в выборе мастера.Когда количество узлов, которые могут быть выбраны в качестве мастера в кластере, меньше минимального числа, кластер не сможет нормально выбирать.

обнаружение неисправностей

Обнаружение неисправности выполняется в двух случаях: во-первых, мастер инициирует эхо-запрос ко всем другим узлам в кластере, чтобы проверить, активен ли узел, во-вторых, каждый узел в кластере инициирует эхо-запрос к мастеру, чтобы определить жив ли мастер.инициировать ли выборы. Для обнаружения неисправностей необходимо настроить следующие параметры с помощью формы:discovery.zen.fd.ping_intervalКак часто узел пингуется, по умолчанию 1с.discovery.zen.fd.ping_timeoutВремя ожидания ответа на пинг, по умолчанию 30 с.В работающем кластере мастер проверяет все узлы, а узлы проверяют, нормальный ли мастер.discovery.zen.fd.ping_retriesСколько сбоев/тайм-аутов ping приводит к тому, что узел считается неисправным, по умолчанию 3.

woohoo.elastic.co/expensive/en/bad…

Количество очередей

Не рекомендуется слепо увеличивать количество es-очередей. Если очередь заблокирована из-за внезапного увеличения данных, увеличение размера очереди может использовать память для кэширования данных. Если постоянные данные заблокированы в очереди, увеличьте размер очереди. в дополнение к добавлению Большое использование памяти не улучшает скорость записи данных, но может увеличить количество данных, которые могут быть потеряны в памяти, когда es не работает. В каких случаях следует увеличить размер очереди? GET /_cat/thread_pool, наблюдайте за очередью и отказом, возвращаемым в API, если есть отказ в очереди или непрерывная очередь, вы можете настроить размер очереди соответствующим образом.

woohoo.elastic.co/expensive/en/bad…

использование памяти

Установите параметры индексов, связанные с предохранителем памяти, и отрегулируйте их в соответствии с реальной ситуацией, чтобы предотвратить OOM, вызванный чрезмерным давлением записи или запроса.indices.breaker.total.limit: 50%, прерыватель на уровне кластера, по умолчанию 70% кучи jvm;indices.breaker.request.limit: 10%, лимит выключателя на один запрос, по умолчанию 60% кучи jvm;indices.breaker.fielddata.limit: 10%, предел прерывателя данных поля, по умолчанию 60% кучи jvm.

woohoo.elastic.co/expensive/en/bad…

Отрегулируйте кеш, занимаемый запросом, в соответствии с реальной ситуацией, чтобы кеш запроса не занимал слишком много памяти JVM.Параметры являются статическими и должны быть настроены на каждом узле данных. index.queries.cache.size: 5%, управляет размером памяти кэша фильтра, по умолчанию 10%. Принимает процентное значение, 5% или точное значение, например 512 МБ.

woohoo.elastic.co/expensive/en/bad…

создать осколок

Если размер кластера большой, вы можете предотвратить сканирование метаданных всех сегментов в кластере при создании нового сегмента, что повышает скорость выделения сегментов.cluster.routing.allocation.disk.include_relocations: false, по умолчанию имеет значение true.

woohoo.elastic.co/expensive/en/bad…

2. Настройка на системном уровне

jdk-версия

Текущая выбранная версия JDK в соответствии с официальным предложением;

конфигурация памяти jdk

Во-первых, установите для -Xms и -Xmx одинаковое значение, чтобы избежать выделения памяти во время работы.В то же время, если системная память меньше 64G, рекомендуется установить ее чуть меньше половины машинной памяти, и остальное зарезервировано для системы. При этом рекомендуется, чтобы куча jvm не превышала 32G (удельное значение разных версий jdk будет немного отличаться), иначе jvm приведет к трате памяти из-за сжатия указателя памяти, подробнее см.:

woohoo.elastic.co/дорогой/талантливый/плохой…

раздел подкачки

Отключите раздел подкачки, чтобы предотвратить падение производительности из-за подкачки памяти (в некоторых случаях лучше сдохнуть, чем тормозить)swapoff -a

дескриптор файла

Lucene использует много файлов. В то же время Elasticsearch также использует множество сокетов для связи между узлами и HTTP-клиентами, для каждого из которых требуется достаточно файловых дескрипторов.По умолчанию Linux запускает один процесс по умолчанию с открытыми 1024 файловыми дескрипторами, что явно недостаточно. , поэтому вам нужно увеличить количество файловых дескрипторов ulimit -n 65536

woohoo.elastic.co/expensive/en/bad…

mmap

Elasticsearch использует сочетание NioF (примечание: неблокирующая файловая система) и MMapF (примечание: файловая система с отображением памяти) для различных файлов. Убедитесь, что вы настроили максимальное количество сопоставлений, чтобы для mmapped-файлов было доступно достаточно виртуальной памяти. Это можно установить временно: sysctl -wvm.max_map_count=262144или вы можете/etc/sysctl.confпутем измененияvm.max_map_countУстановите его навсегда.

woohoo.elastic.co/дорогой/талантливый/плохой…

диск

Если вы используете твердотельные накопители, убедитесь, что системный планировщик ввода-вывода настроен правильно. Когда вы записываете данные на диск, планировщик ввода-вывода решает, когда на самом деле отправлять данные на диск. Планировщик в большинстве дистрибутивов nix по умолчанию называется cfq (полностью справедливая очередь). Но он оптимизирован для вращающихся носителей: природа механического жесткого диска означает, что более эффективно записывать данные на жесткий диск в зависимости от его физического расположения. Это неэффективно для SSD, хотя механические жесткие диски здесь не задействованы. Однако следует использовать крайний срок или noop. Планировщик крайних сроков оптимизирован на основе задержки записи, а noop — это простая очередь FIFO.echo noop > /sys/block/sd/queue/scheduler

дисковое крепление

mount -o noatime,data=writeback,barrier=0,nobh /dev/sd* /esdata*Среди них noatime, запрещает запись временных меток доступа; data=writeback, не записывает журнал; барьер=0, поскольку журнал закрыт, поэтому закрывает барьер синхронно; nobh закрывает buffer_head, чтобы ядро ​​не влияло на ввод-вывод данных

Дополнительные сведения о дисках

Используйте RAID 0. Чередующийся RAID увеличит дисковый ввод-вывод за счет очевидного сбоя при отказе одного жесткого диска, не используйте зеркалирование или RAID с контролем четности, поскольку реплики уже предоставляют эту функциональность. Кроме того, используйте несколько жестких дисков и разрешите Elasticsearch распределять данные по ним с помощью нескольких конфигураций каталога path.data. Не используйте удаленно подключенное хранилище, такое как NFS или SMB/CIFS. Эта введенная задержка полностью контрпродуктивна для производительности.

3. Настройка использования elasticsearch

Когда нет очевидной проблемы с настройкой самого elasticsearch, обнаруживается, что использование es по-прежнему очень медленное. В настоящее время нам нужно определить проблему самого es. Сначала мы выполним первую команду для поиска эта проблема:

hot_threads

GET /_nodes/hot_threads&interval=30s

Захватите горячие потоки, занимающие ресурсы на узле в течение 30 с, и проверьте, является ли потребление соответствующих ресурсов нормальным, проверив поток TOP, который занимает больше всего ресурсов. , но если поток слияния занимает много ресурсов, вам следует подумать, вызвано ли это созданием индекса или слишком маленьким интервалом очистки диска, а также слишком маленьким размером пакетной записи.

woohoo.elastic.co/expensive/en/bad…

pending_tasks

GET /_cluster/pending_tasks

Некоторые задачи могут выполняться только главным узлом, например создание нового индекса или перемещение осколков в кластере.Поскольку в кластере может быть только один главный узел, только этот главный узел может обрабатывать изменения метаданных на уровне кластера. В 99,9999% случаев это не проблема, очередь на изменение метаданных остается практически нулевой. В некоторых редких кластерах метаданные изменяются быстрее, чем мастер может обработать, что приводит к накоплению ожидающих операций в очереди. В это время вы можете использовать API pending_tasks для анализа того, какие операции в настоящее время блокируют очередь es.Например, когда кластер ненормальный, в восстановлении будет большое количество шардов.Если кластер создает большое количество новых полей будет выполняться большое количество операций put_mappings, поэтому в обычных условиях динамическое сопоставление необходимо отключить.

woohoo.elastic.co/expensive/en/bad…

полевое хранение

В настоящее время es в основном имеет три типа: doc_values, fielddata и storefield. В большинстве случаев нет необходимости хранить все три типа. Его можно настроить в соответствии с фактической сценой: doc_values, хранилище столбцов, в настоящее время наиболее часто используется , Вы можете открыть doc_values ​​для хранения (и сохранить только поле ключевого слова) для экономии памяти.Конечно, включение doc_values ​​окажет определенное влияние на производительность запросов, но эта потеря производительности относительно невелика и стоит того;

Полевые данные создаются и управляются на 100% в памяти и находятся в куче памяти JVM, поэтому их можно использовать для быстрых запросов, но это также означает, что они по своей сути не масштабируемы, есть много крайних случаев, которых следует остерегаться, если есть нет требований к анализу поля, вы можете закрыть данные поля;

storefield в основном используется для поля _source.По умолчанию, когда данные записываются в es, es будет хранить данные документа как поле _source.При запросе вы можете быстро получить исходную структуру документа через поле _source.Если есть нет обновлений, переиндексации и других требований, вы можете отключить поле _source;

_all, в версиях ES до 6.x по умолчанию записываемые поля объединяются в большую строку, а поле сегментируется по словам для поддержки полнотекстового поиска всего документа.Когда известно имя поля документа , Рекомендуется закрыть это поле, чтобы сэкономить место для хранения и избежать полнотекстового поиска без ключа поля;

нормы: Скоринг выполняется при поиске, лог-сценарии вообще не требуют скоринга, и его рекомендуется закрыть;

tranlog

После Elasticsearch 2.0, чтобы гарантировать, что никакие данные не будут потеряны, каждый раз, когда завершается индексация, массовое удаление, удаление и обновление, транслог необходимо обновлять на диск, а на запрос возвращается 200 OK. Хотя это изменение повышает безопасность данных, оно также немного снижает производительность. Если вас не волнует эта возможность и вам все же нужна производительность в первую очередь, вы можете установить следующие параметры в шаблоне индекса:

{
    "index.translog.durability": "async"
}

index.translog.sync_interval: для некоторых кластеров большой емкости, где проблема случайной потери нескольких секунд данных не является серьезной, более выгодно использовать асинхронную fsync. Например, записанные данные кэшируются в памяти, а затем fsync выполняется каждые 5 секунд, по умолчанию 5 секунд. Значения менее 100 мс не допускаются. index.translog.flush_threshold_size: в translog хранятся все операции, которые не были безопасно сохранены в Lucene. Хотя эти операции доступны для чтения, требуется переиндексация, если они должны быть закрыты и должны возобновиться. Этот параметр управляет максимальным общим размером этих операций, чтобы предотвратить чрезмерное время восстановления. После достижения установленного максимального размера произойдет обновление, создающее новую точку фиксации Lucene, которая по умолчанию равна 512 МБ.

refresh_interval

Частота выполнения операции обновления, которая сделает последние изменения индекса видимыми для поиска. Значение по умолчанию – 1 с. Чтобы отключить обновление, можно установить -1. Для сценариев с высокими требованиями к скорости записи можно соответствующим образом увеличить соответствующая продолжительность и уменьшение Генерация дискового ввода-вывода и сегмента;

Отключить динамическое сопоставление

Недостатки динамического отображения:

  1. В результате метаданные кластера постоянно меняются, что приводит к нестабильности кластера;
  2. Это может привести к тому, что тип данных будет несовместим с фактическим типом;
  3. Для некоторых аномальных полей или полей класса сканирования отображение также часто модифицируется, что приводит к неконтролируемому бизнесу.

Необязательные значения и значения конфигурации динамического сопоставления следующие: true: поддерживает динамическое расширение, когда новые данные имеют новые атрибуты поля, соответствующее сопоставление добавляется автоматически, и данные успешно записываются; false: динамическое расширение не поддерживается. поддерживается, и новые данные имеют новое Когда атрибут поля используется, он игнорируется напрямую, и данные записываются успешно.строгий: динамическое расширение не поддерживается.Когда новые данные имеют новое поле, сообщается об ошибке, и запись данных не удалась.

пакетная запись

Пакетные запросы, очевидно, значительно увеличат скорость записи, и эту скорость можно измерить количественно. Официальная рекомендация состоит в том, что количество физических байтов данных в каждом пакете 5-15 МБ является хорошей отправной точкой. Обратите внимание, что размер физических байтов здесь упоминается. Количество документов не является хорошей метрикой для размера пакета. Например, если вы одновременно индексируете 1000 документов в пакетном режиме, имейте в виду следующие факты: 1000 документов размером 1 КБ в сумме составляют 1 МБ. 1000 документов размером 100 КБ в сумме составляют 100 МБ. Это совсем другой размер партии. Пакетные запросы необходимо загружать в память на узле-координаторе, поэтому физический размер пакетного запроса гораздо важнее количества документов. Начните тестирование размеров пакетных запросов с 5–15 МБ и постепенно увеличивайте это число, пока не увидите улучшения производительности. Затем начните увеличивать параллелизм ваших пакетных операций записи (многопоточность и т. д.). Контролируйте свои узлы с помощью таких инструментов, как iostat , top и ps, чтобы увидеть, когда ресурсы ограничены. Если вы начинаете получать EsRejectedExecutionException , ваш кластер не может продолжать работу: по крайней мере один ресурс является узким местом. Либо уменьшите количество параллелизма, либо обеспечьте более ограниченные ресурсы (например, переключение с механических дисков на твердотельные накопители), либо добавьте больше узлов.

Индексы и осколки

Индекс и осколок es будут иметь соответствующие метаданные, и поскольку метаданные es хранятся на главном узле, а обновление метаданных заключается в том, чтобы повесить кластер для синхронизации со всеми узлами, когда создается новое поле es или новый индекс. В это время , будут получены метаданные кластера, а метаданные будут изменены и синхронизированы.В это время будет затронута реакция кластера.Поэтому нужно обратить внимание на количество индексов и осколков кластера.Предложения следующие: 1. Используйте API сжатия и переноса, которые относительно подходят для создания 2. В соответствии с величиной данных и соответствующими требованиями к производительности выберите имя создаваемого индекса, например: создание индекса по месяцам: test-ГГГГММ, создание индекса по дням: test-ГГГГММДД 3. Управляйте размером одного фрагмента, при нормальных обстоятельствах для сценариев журналов рекомендуется, чтобы размер одного фрагмента не превышал 50 ГБ, а для бизнес-сценариев в Интернете рекомендуется, чтобы размер одного сегмента не превышал 20 ГБ;

segment merge

Слияние сегментов требует больших вычислительных ресурсов и потребляет много дискового ввода-вывода. Слияния периодически выполняются в фоновом режиме, поскольку их выполнение может занять много времени, особенно для больших сегментов. Обычно это не проблема, потому что вероятность крупномасштабного слияния сегментов очень мала. Если вы обнаружите, что слияние требует много ресурсов, вы можете установить:index.merge.scheduler.max_thread_count: 1В частности, механические диски плохо поддерживают одновременный ввод-вывод, поэтому нам необходимо уменьшить количество потоков, одновременно обращающихся к диску на индекс. Этот параметр позволяет max_thread_count + 2 потокам одновременно выполнять дисковые операции, то есть параметр 1 разрешает три потока. Для SSD вы можете игнорировать этот параметр, по умолчанию используется Math.min(3, Runtime.getRuntime(). availableProcessors() / 2) , который отлично работает для SSD. Во время низких пиковых нагрузок используйте force_merge для принудительного объединения сегментов, сокращения количества сегментов и уменьшения потребления памяти, закрывайте холодные индексы и открывайте их снова, когда они нужны бизнесу.Если индексы не использовались, их можно регулярно удалять или создавать резервные копии. к кластеру хауп;

автоматически сгенерированный _id

Когда конец записи использует определенный идентификатор для записи данных в es, es проверит, существует ли такой же идентификатор под соответствующим индексом.Эта операция будет потреблять все больше и больше по мере увеличения количества документов, поэтому, если нет бизнеса. большой спрос, рекомендуется использовать идентификатор, автоматически сгенерированный es, чтобы ускорить скорость записи.

routing

Для сценариев бизнес-запросов с большим объемом данных сторона ES обычно создает несколько сегментов и распределяет сегменты по нескольким экземплярам в кластере, чтобы распределить нагрузку.Обычно запрос проходит через все сегменты, а затем выполняет запрос после получения результатов. объединены, они возвращаются на сторону запроса. В настоящее время настройка маршрутизации при записи позволяет избежать обхода всего сегмента для каждого запроса, а также указать соответствующий ключ маршрутизации при запросе. В этом случае es будет запрашивать только соответствующий сегмент, что может значительно сократить слияние. и планирование полных осколков.

использовать псевдоним

При создании индексов, предоставляющих услуги, не забывайте использовать псевдонимы для предоставления услуг вместо прямого раскрытия имени индекса, чтобы избежать последующих перерывов в работе из-за изменений в бизнесе или данных индекса, требующих переиндексации.

Избегайте широких столов

Определение слишком большого количества полей в индексе — это ситуация, которая может привести к взрыву карты, что может привести к ошибкам нехватки памяти и трудновосстановимым ситуациям, эта проблема может быть более распространенной, чем ожидалось,index.mapping.total_fields.limit, значение по умолчанию – 1000.

Избегайте разреженных индексов

Поскольку после того, как индекс будет разреженным, дельта-значение соответствующего соседнего идентификатора документа будет очень большим.Lucene выполняет сжатие дельта-кодирования на основе идентификатора документа, что снижает степень сжатия, что приводит к увеличению индексного файла. время ключевое слово и тип массива es принимают структуру doc_values, Каждый документ будет занимать определенное количество места, даже если поле пусто, поэтому разреженная индексация увеличит размер диска и снизит эффективность запросов и записи.

Обмен учебными материалами

12 комплектовОсновные технические материалы Microservices, Spring Boot, Spring Cloud, это часть каталога данных:

  • Аутентификация и авторизация Spring Security

  • Борьба с проектом Spring Boot (фоновая сервисная архитектура и архитектура эксплуатации и обслуживания малых и средних интернет-компаний)

  • Борьба с проектом Spring Boot (проект управления корпоративными правами))

  • Борьба с проектом микросервисной архитектуры Spring Cloud (решение для распределенных транзакций)

  • ...

Фоновый ответ публичного аккаунтаarch028Получить информацию::