От 10 секунд до 2 секунд! Настройка производительности ElasticSearch

база данных Elasticsearch
От 10 секунд до 2 секунд! Настройка производительности ElasticSearch

Всем привет, я второй брат законсервированного яйца.

«ELK» — это сокращение от ElasticSearch, Logstash и Kibana. В настоящее время стек технологий ELK все больше используется в области разработки данных в интернет-индустрии.Студенты, которые занимались сбором данных, разработкой данных и хранением данных, считают, что эта аббревиатура не является незнакомой, и ElasticSearch (далее ES) занимает стек ELK, занимает опорную позицию.

Некоторое время назад я лично участвовал в настройке ES кластера.Сегодня я поделюсь с вами методами настройки, которые я изучил и использовал.Если есть какие-то ошибки, прошу меня простить и поправить.

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

Настройка на системном уровне в основном касается настройки памяти и избегания подкачки памяти.

Память кучи, установленная по умолчанию после установки ES, составляет 1 Гб, что явно недостаточно, тогда будет вопрос: сколько памяти нам нужно установить для ES?

На самом деле это зависит от объема памяти узлов нашего кластера и от того, хотим ли мы развернуть другие службы на узлах сервера.

Если память относительно большая, например 64G и выше, и мы не развертываем другие сервисы на ES-кластере, то я предлагаю установить ES-память на 31G-32G, потому что существует проблема узкого места в производительности 32G. скажем прямо, даже если дать Если память ES кластера больше 32G, то его производительность не обязательно будет лучше, или даже хуже, чем производительность при установке 31G-32G.

Взяв в качестве примера кластер, который я настроил, память серверного узла, который я настроил, составляет 64 ГБ, а другие службы в основном не работают на серверном узле, поэтому я установил размер памяти кластера ES на 31 ГБ. производительность кластера.

При настройке памяти кластера ES другим моментом является обеспечение того, чтобы минимальное значение (Xms) и максимальное значение (Xmx) памяти кучи были одинаковыми, чтобы программа не могла изменить размер памяти кучи во время выполнения. , который является процессом, который потребляет много системных ресурсов.

Другой момент, чтобы избежать подкачки памяти, вы можете заблокировать память в файле конфигурации, чтобы избежать подкачки памяти (вы также можете отключить подкачку памяти на уровне операционной системы). Соответствующие параметры:bootstrap.mlockall: true

Шардинг и реплики

Шардинг (шард): ЭС — это распределенная поисковая система, индекс обычно разбивается на разные части, часть данных, распределенных по разным узлам, — это шард. ES автоматически управляет сегментами и организует их, а также перебалансирует распределение данных сегментов, когда это необходимо, поэтому пользователям практически не нужно беспокоиться о деталях сегментирования. Количество осколков по умолчанию при создании индекса равно 5, и его нельзя изменить после создания.

Реплика: ES создает копию по умолчанию, что означает, что на основе 5 основных сегментов каждый основной сегмент имеет соответствующий сегмент реплики. Дополнительные реплики имеют свои плюсы и минусы.Некоторые реплики могут иметь более сильные возможности восстановления после сбоя, но они также занимают дисковое пространство, кратное соответствующим репликам.

Когда мы создаем индекс, сколько сегментов и реплик мы должны создать?

Что касается количества реплик, то лучше определить количество реплик, которое может быть определено в зависимости от количества узлов нашего кластера и нашего пространства для хранения.У нас много серверов кластера и достаточно места для хранения.Мы можем установить больше реплик, обычно 1-3 реплики.Если кластерных серверов относительно немного и места для хранения не так уж и свободно, можно установить только одну копию для обеспечения аварийного восстановления (количество копий может регулироваться динамически).

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

Что касается размера количества шардов, то в отрасли согласны с тем, что количество шардов связано с памятью, считается, что 1 Гб динамической памяти соответствует 20-25 шардам, а размер одного шарда не должен превышать 50 Гб. конфигурация способствует работоспособности кластера. Но лично я считаю такой способ настройки слишком жестким, в процессе настройки ES кластера я устанавливаю соответствующие шарды по размеру общего объема данных, чтобы размер каждого шарда не превышал 50G (примерно в 40G ), но по сравнению с предыдущим количеством осколков эффект не очевиден. После этого я попытался увеличить количество осколков и обнаружил, что после увеличения количества осколков скорость запросов значительно улучшилась, а объем данных каждого осколка контролировался на уровне около 10G.

Запрос большого количества маленьких сегментов ускоряет обработку данных каждым сегментом. Значит ли это, что чем больше сегментов, тем быстрее наш запрос и выше производительность ES? На самом деле нет, потому что в процессе запроса происходит процесс слияния осколков.Если количество осколков продолжает увеличиваться, время слияния будет увеличиваться, и поскольку все больше задач необходимо ставить в очередь и обрабатывать по порядку, больше мелких осколков не обязательно быстрее, чем запрос меньшего количества больших осколков. Наличие множества небольших сегментов также снижает пропускную способность запросов при наличии нескольких одновременных запросов.

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

Настройка параметров

Ниже я представлю настройку некоторых ключевых параметров ES.

Есть много сценариев, сколько процессорного времени занимает наш кластер ES и как это настроить. Высокая загрузка процессора может быть вызвана записью или запросом, как это проверить?

может пройти первымGET _nodes/{node}/hot_threadsПроверьте стек потоков, чтобы увидеть, какой поток занимает больше всего ЦП, если это такelasticsearch[{node}][search][T#10]Это вызвано запросом, если онelasticsearch[{node}][bulk][T#1]Это вызвано записью данных. В моей реальной настройке скорость использования процессора очень высока.Если это не SSD, рекомендуется использоватьindex.merge.scheduler.max_thread_count: 1 Максимальное количество потоков для слияния индексов установлено равным 1, что позволяет эффективно регулировать производительность записи. Из-за одновременной записи на носитель производительность записи не улучшится, а только уменьшится из-за адресации.

Есть также несколько важных параметров, которые могут быть установлены учащимися в соответствии с их собственными условиями кластера и условиями данных.

index.refresh_interval: Этот параметр означает, что данные можно искать в секундах после записи, по умолчанию 1 с. Каждое обновление индекса будет генерировать новый сегмент lucene, что приведет к частому слиянию. Если бизнес-требования не так высоки в отношении производительности в реальном времени, вы можете увеличить этот параметр. Фактическая настройка говорит мне, что этот параметр действительно мощный. , загрузка процессора резко упала.

indices.memory.index_buffer_size: Если мы собираемся выполнять очень тяжелые операции записи с большим количеством параллельных операций, то лучше поставитьindices.memory.index_buffer_sizeсделать его больше,index bufferРазмер шарда общий для всех шардов, обычно рекомендуется (см. блог Даниэля) для каждого шарда давать максимум 512 Мб, потому что независимо от того, насколько велика производительность, улучшения производительности не происходит. ES будет использовать этот параметр в качестве индексного буфера, разделяемого каждым шардом, и те сегменты, которые особенно активны, будут больше использовать этот буфер. Значение по умолчанию для этого параметра — 10 %, то есть 10 % кучи jvm.

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

"index.translog": {
            "sync_interval": "120s",     --sync间隔调高
            "durability": "async",       -– 异步更新
            "flush_threshold_size":"1g"  --log文件大小
        }

Этот параметр означает включение асинхронной записи на диск и установку временного интервала и размера записи, что помогает повысить производительность записи.

Также есть некоторые настройки параметров таймаута:

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

другое предложение

Есть также некоторые предложения по поэтапной оптимизации.

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

Избегайте разреженного индексирования: после разреженного индекса файл индекса будет увеличиваться. Ключевое слово и тип массива ES принимают структуру doc_values.Даже если поле пустое, каждый документ будет занимать определенное количество места.Поэтому разреженное индексирование увеличит размер диска и снизит эффективность запросов и записи.

мой тюнинг

Давайте поговорим о моей настройке: Моя настройка в основном заключается в перестроении индекса и изменении количества осколков существующего индекса. После непрерывного тестирования я нашел оптимальное количество осколков. Время перестроения индекса велико. , во время этого период, запись ES была соответствующим образом скорректирована, чтобы уменьшить использование процессора. Прилагаю свои параметры настройки.

index.merge.scheduler.max_thread_count:1 # 索引 merge 最大线程数
indices.memory.index_buffer_size:30%	 # 内存
index.translog.durability:async # 这个可以异步写硬盘,增大写的速度
index.translog.sync_interval:120s #translog 间隔时间
discovery.zen.ping_timeout:120s # 心跳超时时间
discovery.zen.fd.ping_interval:120s	 # 节点检测时间
discovery.zen.fd.ping_timeout:120s	 #ping 超时时间
discovery.zen.fd.ping_retries:6	 # 心跳重试次数
thread_pool.bulk.size:20 # 写入线程个数 由于我们查询线程都是在代码里设定好的,我这里只调节了写入的线程数
thread_pool.bulk.queue_size:1000 # 写入线程队列大小
index.refresh_interval:300s #index 刷新间隔

О перестроении индексов

Перед перестроением индекса сначала обдумайте необходимость перестроения индекса, поскольку перестроение индекса занимает очень много времени. API переиндексации ES не будет пытаться установить целевой индекс и не будет копировать настройки исходного индекса, поэтому мы должны установить целевой индекс перед запуском операции _reindex, включая настройку маппинга (mapping), шардинга, реплик и т.д.

Первым шагом является создание нового индекса, подобного обычному индексу. Когда объем данных велик, необходимо установить интервал обновления, аrefresh_intervalsУстановите значение -1, то есть не обновляйте, число реплик number_of_replicas установлено равным 0 (поскольку количество реплик можно динамически регулировать, что помогает повысить скорость).

{
	"settings": {

		"number_of_shards": "50",
		"number_of_replicas": "0",
		"index": {
			"refresh_interval": "-1"
		}
	}
	"mappings": {
    }
}

Вторым шагом является вызов интерфейса переиндексации, рекомендуется добавитьwait_for_completion=falseУсловие параметра, поэтому переиндексация будет напрямую возвращать идентификатор задачи.

POST _reindex?wait_for_completion=false

{
  "source": {
    "index": "old_index",   //原有索引
    "size": 5000            //一个批次处理的数据量
  },
  "dest": {
    "index": "new_index",   //目标索引
  }
}

Третий шаг — ждать. в состоянии пройтиGET _tasks?detailed=true&actions=*reindexчтобы запросить ход восстановления. Если вы хотите отменить задачу, позвоните_tasks/node_id:task_id/_cancel.

Четвертый шаг — удалить старый индекс, чтобы освободить место на диске. Для получения более подробной информации ознакомьтесь с API переиндексации на официальном сайте ES.

Тогда некоторые студенты могут спросить, если я сейчас пишу ЭП в реальном времени, что мне делать? В это время, когда мы хотим перестроить индекс, добавляем в параметры временную метку последнего перестроения индекса.Грубо говоря, например, наши данные 100G.В это время мы перестраиваем индекс, но эти 100G увеличивается, то Когда мы перестраиваем индекс, нам нужно записать временную метку перестроения индекса. Цель записи временной метки состоит в том, что в следующий раз, когда мы перестроим индекс и запустим задачу, нам не нужно перестраивать все это. Нам нужно только перестроиться после этой метки времени.Объем данных старого индекса в основном такой же, а направление потока данных переключается на имя нового индекса.

POST /_reindex
{
    "conflicts": "proceed",          //意思是冲突以旧索引为准,直接跳过冲突,否则会抛出异常,停止task
    "source": {
        "index": "old_index"         //旧索引
        "query": {
            "constant_score" : {
                "filter" : {
                    "range" : {
                        "data_update_time" : {
                            "gte" : 123456789   //reindex开始时刻前的毫秒时间戳
                            }
                        }
                    }
                }
            }
        },
    "dest": {
        "index": "new_index",       //新索引
        "version_type": "external"  //以旧索引的数据为准
        }
}

Вышеизложенное является кратким изложением моей настройки ES. Я надеюсь, что это может помочь студентам, которые запутались в производительности ES. Спасибо. - Я консервированное яйцо, и я кормлю себя мешком соли.


Текст / Консервированное яйцо второго брата

«Я всегда думал, что пока я веду себя сдержанно, никто не узнает, что я на самом деле писатель»

редактировать /флуоресценция

Эта статья авторизована и опубликована автором Chuangyu Front-end, а авторские права принадлежат автору, созданному Chuangyu Front-end. Пожалуйста, укажите источник для перепечатки этой статьи. Ссылка на статью:известно Sec-Fed.com/2019-01-09-…

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

Спасибо за чтение.