Висячие индексы возникают, когда узел, у которого есть несколько индексов, хранящихся локально, присоединяется к кластеру, и эти локальные индексы не существуют в метаданных кластера. Другими словами, если узел, ранее подключенный к кластеру, подключается к новому кластеру, индексы на этом узле помечаются как висячие индексы.
Когда и почему следует использовать dangling API
Метаданные кластера описывают, как читать данные, хранящиеся на узлах данных. Если все главные узлы потеряют свои метаданные, то все, что хранится на узлах данных в кластере, не сможет быть прочитано. В такой ситуации необходимо создать новый кластер и подключить к нему существующие узлы данных. После подключения всех узлов данных к новому кластеру старые индексы станут висячими индексами. Вы можете использовать API для восстановления данных из этих индексов.
В этой статье мы рассмотрим, как составить список и восстановить висячие индексы.
Как перечислить и восстановить висячие индексы в OpenSearch
Вот как перечислить и восстановить висячие индексы в OpenSearch:
Шаг 1. Запустите API dangling indices и скопируйте index-uuid из ответа
1 | GET /_dangling |
Пример вывода
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | { "index_name" : "<index_name>", "index_uuid" : "D_FDBv2NSZGZzrliLc_4AA", "creation_date_millis" : 1666289487991, "node_ids" : [ "5vKcjNSjTfmXbUIY98oRSw", "-prq1HnZSDmjtHf4fp3skQ", "jl9HozrpQNqYqctvI40ISw", "P_tR9BvITiqz7SfPrrBiAg", "mH6iK9xsSfqo9dBwLNM06A", "gVEFdfF6SNqRfao6te-TMA", "2xeISkW1QfiGJXQ8b9bRtQ", "wxLLkuzgTefY9aHlXRIBNg" ] } |
Шаг 2. Восстановите висячий индекс
1 | POST /_dangling/<index-uuid>?accept_data_loss=true |
Важно обратить внимание на это поле: accept_data_loss (Required, Boolean). Это поле должно быть установлено в true, чтобы импортировать висячий индекс. OpenSearch не может знать, откуда взялись данные висячего индекса, или определить, какие копии шарда являются свежими, а какие - устаревшими. Поэтому он не может гарантировать, что импортированные данные представляют собой последнее состояние индекса на момент его последнего нахождения в кластере.
Шаг 3. (Необязательно) Используйте автоматический сценарий для восстановления всех висячих индексов
В API _dangling невозможно использовать подстановочный знак(*). Если у вас сотни висячих индексов, вы можете использовать следующий bash-скрипт для обнаружения и восстановления висячих индексов.
1 2 3 | curl -XGET -ks "https://localhost:9200/_dangling" -u opensearch:<password> | grep "index-uuid" >> index_uuid.txt list1=$(cat index_uuid.txt) for line in $list1; do echo -e "$line"; curl -XPOST -ks "https://localhost:9200/_dangling/$line?accept_data_loss=true" -u opensearch:<password>; done |
Шаг 4. Проверьте состояние кластера
Некоторые индексы могут быть повреждены. Чтобы проверить индексы, необходимо проверить состояние кластера.
1 | curl -ks https://localhost:9200/_cat/health?v -u opensearch:<password> |
Шаг 5. Если вы видите неназначенные шарды, проверьте API распределения
1 | curl -ks https://localhost:9200/_cluster/allocation/explain -u opensearch:<password> |
Шаг 6. Восстановление поврежденных шардов
Для рассматриваемого индекса было 5 первичных шардов. Один из них, "первичный шард 2", был поврежден. Попробуем выделить именно этот шард индекса с помощью функции allocate_stale_primary.
Сначала мы восстановим индекс с помощью allocate_stale_primary.
Этот API попытается восстановить данные в шарде 2.
1 2 3 4 5 6 7 8 9 10 11 12 13 | curl -ks -XPOST "https://localhost:9200/_cluster/reroute" -u opensearch:<password> -H "Content-Type: application/json" -d' { "commands": [ { "allocate_stale_primary": { "index": "<index_name>", "shard": 2, "node": "<node_name>", "accept_data_loss": true } } ] } |
Как видно из ответа выше, данные в "шарде 2", к сожалению, потеряны. Восстановить их не представляется возможным. Теперь нам нужно запустить API reroute с флагами allocate_empty_primary и accept_data_loss: true.
Теперь попробуем восстановить индекс с помощью allocate_empty_primary.
Этот API выделит шард 2 как пустой. Цель этой операции - частично восстановить данные в индексе. Индекс не может быть использован с отсутствующим шардом.
1 2 3 4 5 6 7 8 9 10 11 12 13 | curl -ks -XPOST "https://localhost:9200/_cluster/reroute" -u opensearch:<password> -H "Content-Type: application/json" -d' { "commands": [ { "allocate_empty_primary": { "index": "<index_name>", "shard": 2, "node": "<node_name>", "accept_data_loss": true } } ] } |
Шаг 7. Проверьте состояние индекса
1 | curl -ks https://localhost:9200/_cat/indices/<index_name>?v -u opensearch:<password> |
Состояние индекса - GREEN. Повторите ту же процедуру для всех неназначенных индексов, после чего можно перейти к шагу 5 и снова проверить объяснение распределения.
Резюме и важные замечания
- В этой статье мы узнали, что такое висячий индекс, как он формируется и как его импортировать.
- Помните, что dangling API не может дать никаких гарантий того, что импортированные данные действительно представляют собой последнее состояние данных, когда индекс еще был частью кластера.
- Перед запуском dangling API убедитесь, что все узлы данных подключены к новому кластеру.