Эта документация предназначена только для версий ES 5.x.
0 сомнений
1. Когда псевдоним индекса соответствует нескольким реальным индексам одновременно, что произойдет, если псевдоним индекса будет использоваться для чтения индекса?
догадка: Запрос будет распределен по всем сегментам всех индексов. Если идентификаторы документов, прочитанные после фильтрации по условиям, не совпадают, будут возвращены документы, соответствующие условиям. Если идентификаторы документов конфликтуют, любой из них будет перезаписан другой, или Исключение возникает напрямую (или ES предоставляет другие настраиваемые решения?).
1 Когда нужно перестраивать индексы?
Для индекса, который имеет определенную структуру и работает в сети, собственный ES не поддерживает изменение атрибутов поля или удаление поля.Если изменение атрибутов поля или удаление поля принудительно, индекс будет структура разрушена, что делает индекс недоступным.
Если у вас есть такая необходимость, часто есть только один способ: перестроить индекс.
2 Перестроить индекс
Перестроить индекс, как следует из названия: перестроить целевой индекс, аналогичный по структуре исходному индексу и отвечающий новым требованиям.
При перестроении индекса часто возникает такая проблема: запущен исходный онлайн-индекс.Если индекс нужно перестроить, как заменить индекс с нулевым временем простоя? То есть процесс переключения исходного индекса и целевого индекса является прозрачным и плавным для пользователя и не приведет к возникновению ситуации, когда услуга недоступна в течение определенного периода времени.
Именно этому посвящена данная статья. API reIndex и переключение псевдонимов помогут вам идеально выполнить плавную миграцию между индексами.
2.1 Создайте новый индекс
Первым шагом в перестроении индекса является создание целевого индекса, аналогичного исходному индексу.Этот процесс относительно прост и не будет здесь повторяться.
2.2 reIndex API
reIndex — это собственный API ES. Он не устанавливает целевой индекс и не копирует информацию о настройках исходного индекса. Количество сегментов и копий целевого индекса по-прежнему необходимо задавать вручную. Что он может делать. для вас, чтобы быстро добавить данные из индекса импортируются в другой индекс. Принцип реализации reIndex не сложен: ES установит reIndex в качестве фоновой задачи, затем использует API-интерфейс прокрутки для пакетного запроса исходных данных и, наконец, повторно использует API-интерфейс для записи в новый индекс.
Здесь есть две проблемы, о которых следует знать:
- Если целью перестроения индекса является удаление поля в исходном индексе (при условии, что это поле A), а в поле A все еще есть данные, целевой индекс reIndex не удалит это поле успешно. Данные по всем полям в исходном индексе будут переиндексированы в целевой индекс, включая поле A, даже если поле A не определено в целевом индексе.
- В процессе переиндексации целевого индекса необходимо остановить трафик записи исходного индекса и постараться обеспечить его выполнение в периоды низкой пиковой нагрузки.. Цель состоит в том, чтобы гарантировать, что исходный индекс не будет изменен во время процесса переиндексации целевого индекса, чтобы обеспечить согласованность данных, иначе несогласованные данные будет трудно найти и исправить. Если нет возможности остановить трафик записи исходного индекса, ситуация будет сложнее, в этот раз вам может понадобиться рассмотреть возможность использования двойной записи (блогеры не сталкивались с такой сложной сценой, поэтому повторяться не буду их). Конечно, если есть способ окончательно обеспечить согласованность данных между исходным индексом и целевым индексом после переиндексации, не останавливая трафик записи, и это не влияет на бизнес, то не имеет значения, будет ли трафик записи исходный индекс остановлен или нет.
Обычно нет хорошего решения проблемы, описанной в первом пункте.В настоящее время есть только два решения, которые я исследовал:
- Если вы хотите удалить поле, вы можете удалить поле напрямую, вы можете просто сделать это без него, и вам не нужно выполнять реконструкцию индекса или миграцию псевдонимов.Это решение удобно, безопасно и быстро. есть только один недостаток, он не совершенен, очень неудобен, но поля, определенные в индексе, бесполезны, что очень неудобно;
- Если вы навязчивый и клянетесь, что должны удалять бесполезные поля в исходном индексе, вы можете попробовать это решение (непроверенное, но я думаю, что оно реализуемо): так как поле удаляется, то индекс полностью обновляется На этом этапе , вы больше не должны читать или записывать это поле. В настоящее время используйте новый код для полного обновления исходного индекса, что сделает значение поля во всех документах в исходном индексе пустым. Наконец, используйте свой целевой индекс (целевой индекс не определяет поля, которые необходимо удалить) для выполнения операции переиндексации, и вы сможете идеально удалить бесполезные поля во время переноса данных.
После описания второго пункта вы можете обнаружить, что в начале проектирования индекса вы должны стараться избегать предоставления пользователям возможности записывать данные непосредственно в индекс. При быстрых изменениях в бизнесе перестроение индекса часто является очень распространенной операцией.Если в начале есть дефекты в дизайне индекса, это принесет огромные проблемы в будущем сопровождении, которое не стоит выигрыша.
Вообще говоря, возможности, предоставляемые ES, в основном представляют собой запросы, а операции записи данных, которыми могут управлять пользователи, обычно ориентированы на базу данных, а не непосредственно на индекс. Кроме того, индексы вообще можно полностью обновить через базу данных (то есть скорость немного медленная), поэтому очень мало сценариев, которые нужно дважды записать в процессе переиндексации индекса.
2.3 Переключение псевдонимов
Применение псевдонимов индексов обеспечивает нулевое время простоя для переключения индексов. При чтении и записи индексов по возможности следует использовать псевдонимы индексов. Псевдоним индекса похож на ярлык или символическую ссылку, которая может указывать на один или несколько индексов.
Когда сервер ES примет запрос клиента, он сначала выполнит поиск псевдонима.Если соответствующий псевдоним не совпадает, будет найдено реальное имя индекса.
При установке псевдонимов индекса следует помнить о нескольких вещах:
- Псевдоним заданного индекса нельзя использовать скластерЛюбое из реальных имен индекса имеет такое же имя, в противном случае настройка не будет выполнена;
- Псевдоним индекса может соответствовать нескольким индексам, но это не рекомендуется, так как если псевдоним отображает несколько индексов одновременно при написании документа, то по умолчанию псевдоним нельзя использовать для записи документа напрямую, т.к. не знает документ, по какому индексу отправлять;
- В некоторых блогах в Интернете говорится, что при использовании Java API для работы с индексом с псевдонимом в ES уже нельзя указывать имя типа, иначе операция завершится ошибкой.Попрактиковавшись, я обнаружил, что это не так, как описано выше, и использование псевдонимов индексов также требует установки имени типа;
- Существует два способа управления псевдонимами: _alias для одной операции и _aliases для выполнения нескольких атомарных операций. Когда мы указываем псевдоним на целевой индекс, нам обычно также необходимо удалить исходную точку псевдонима на старый индекс. Это изменение должно быть атомарным, поэтому _aliases можно использовать для переключения псевдонимов только в том случае, если исходный индекс уже имеет псевдоним индекса.
Что касается второго пункта выше, вы можете использовать атрибут is_write_index для обозначения одного из индексов под псевдонимом в качестве индекса записи.В этом случае вы можете напрямую использовать псевдоним для вызова API записи.
Вот несколько примеров четвертого пункта выше:
POST /_aliases
{
"actions": [
{ "remove": { "index": "my_index_v1", "alias": "my_index" }},
{ "add": { "index": "my_index_v2", "alias": "my_index" }}
]
}