Преамбула
ElasticsearchЯвляется распределенной системой анализа поиска в реальном времени. Teambition использует Elastisearch в качестве поисковой системы для предоставления пользователям поисковых услуг, когда мы решаем хранить какие-то данные, нам нужно использоватьPUT /teambition
Для создания индекса необходимо полностью определить структуру данных при создании индекса, при этом нельзя изменить настройки индекса и многие фиксированные конфигурации. Когда нужно изменить структуру данных, нужно перестроить индекс, поэтому команда Elastic предоставляет множество вспомогательных инструментов, помогающих разработчикам перестроить индекс.
Решите, нужна ли вам реконструкция?
Перестроение довольно болезненно.Если нет хорошего фундамента, обслуживание может быть прервано.Когда объем данных очень большой, время восстановления перестроения может быть очень долгим, и даже в процессе перестроения могут возникать ошибки и т.д. Поэтому старайтесь избегать перестроения индекса, если в этом нет необходимости. Причина, по которой Teambition перестраивает индекс, опущена, потому что это не имеет большого значения.
Используйте правильные инструменты
Kibana — лучший партнер для Elasticsearch.Начиная с ES 5.0 мощные функции Kibana могут заменить почти все плагины ES 1.x и ES 2.x старой эпохи. Главное, что они все еще свободны!
предпосылки
Работающая служба должна использовать псевдоним для доступа к индексу по той простой причине, что служба поиска в конечном итоге будет использовать перестроенный индекс, а исходный индекс будет удален. Если ваша служба напрямую использует имя индекса, создайте псевдоним перед перестройкой и обновлением службы.
POST /_aliases
{
"actions": [
{
"add": {
"index": "teambition", // 原有索引
"alias": "teambition_latest" // 服务的别名
}
}
]
}
Предпосылка 2
Не забудьте проверить ElasticsearchDisk Usage
, если этого недостаточно, пожалуйста, сначала подайте заявку на достаточное количество места.
Создать новый индекс
Создайте новый индекс так же, как обычный индекс. Здесь стоит упомянуть, что при большом количестве данных необходимо установить интервал обновления, а данные, записанные в этот период, нельзя искать, тем самым повышая скорость реконструкции:refresh_intervals = -1, number_of_replicas = 0
. Практика говорит мне, что это, вероятно, улучшится100% ~ 400%
улучшение.
PUT /teambition_20180328
{
"settings": {...},
"mapping": {...}
}
Значение смещения (offset) для записи данных синхронизации
Teambition использует Kafka для импорта данных из MongoDB в Elasticsearch.Если Kafka недоступен, он также может читать данные oplog и записывать в Elasticsearch. Независимо от того, какой метод синхронизации данных используется, необходимо записать смещение синхронизируемых данных. Перестроение индекса может занять очень много времени. В это время процесс синхронизации все еще обновляет данные до старого индекса. В это время перестроение индекса не может обновить новые данные. Нечего сказать о методах, описанных здесь, Teambition используетkafka-adminСмещение записей API.
начать перестраивать индекс
Данные можно скопировать в новый индекс с помощью API переиндексации, предоставленного командой Elasticsearch. Вот несколько путей на выбор:
- При простом изменении структуры данных сопоставления вы можете просто использовать API переиндексации. Например: удалить поля, обновить методы сегментации слов поля и т. д.
- Когда вам нужно написать новое поле, новое поле вычисляется из старого поля, вы можете использовать
script
параметр. Например, вычисление суммы поля части данных. В скрипте много подводных камней, при сбое скрипта переиндексация не работает после долгого запуска, даже если данные восстановлены, переиндексацию нужно запускать заново. - Когда она содержит очень сложную логику, напишите программу сами.
Вызовите интерфейс переиндексации, интерфейс вернется после завершения переиндексации, а время ожидания возврата интерфейса составляет только30秒
, если время переиндексации слишком велико, рекомендуется добавитьwait_for_completion=false
условия параметров, чтобы переиндексация возвращалась напрямуюtaskId
POST _reindex?wait_for_completion=false
{
"source": {
"index": "teambition"
},
"dest": {
"index": "teambition_20180328"
},
"script": {...}
}
перестроение индекса
Восстановление индекса занимает много времени, поэтому сделайте перерыв на кофе (остановитесь, чтобы поиграть, немного поспать и отправиться в путешествие).
без настройкиrefresh_intervals
иnumber_of_replicas
, скорость переиндексации составляет 500~1000 doc/sec и может быть ниже, если включен скрипт. После настройки она может достигать 4000~8000 документов/сек. Teambition 70M Documents занимает около 4 часов.
можно использоватьGET _tasks/{taskID}
Вы можете увидеть процесс реконструкции, который включает в себя такую информацию, как время и количество оставшихся документов.
Если вы нашли ошибку, вы можете использоватьPUT _tasks/{taskID}/cancel
Интерфейс отказывается от задачи и начинает все заново.
восстановить данные синхронизации
После перестроения индекса не забудьтеsetting
вообще вnumber_of_replicas
иrefresh_intervals
Установите исходное значение.
Процесс запуска нового индекса синхронизации (синхронизация со смещения записи)
Создать новый псевдоним
Необходимо привязать новый установленный индекс и одновременно отвязать старый индекс.Утверждение выглядит следующим образом:
POST _aliases
{
"actions": [{"add": {
"index": "teambition_20180328",
"alias": "teambition_latest"
}}, {"remove": {
"index": "teambition",
"alias": "teambition_latest"
}}]
}
удалить индекс
Удалите старый индекс, чтобы освободить место на диске, остановите первоначальный процесс синхронизации.
DELETE teambition
Суммировать
Модификация индекса действительно трудоемкая и кропотливая работа, особенно если что-то пойдет не так, и человеку в целом плохо. Поэтому при создании индекса постарайтесь подумать, сможет ли он удовлетворить потребности.Конечно, все знают, что это практически невозможно, ведь есть злые продакт-менеджеры.
Здесь есть еще один очень важный контент, который подробно не описан, это процесс синхронизации.Как упоминалось ранее, процесс синхронизации представляет собой программу, которая синхронизирует данные MongoDB с ES.Эта программа также должна иметь возможность приостанавливать синхронизацию, повторять синхронизацию и другие возможности.