Невозможно увеличить количество первичных шардов существующего индекса, поэтому для увеличения количества первичных шардов индекс необходимо создать заново. В таких ситуациях обычно используются два метода: API _reindex и API _split.
API _split часто является более быстрым методом, чем API _reindex. Индексирование должно быть остановлено перед обеими операциями, иначе количество документов в исходном_индексе и целевом_индексе будет отличаться.
Также не забывайте, что все эти операции можно легко выполнить с помощью оператора AutoOps.
Метод 1 - использование API _split
API split используется для создания нового индекса с нужным количеством первичных шардов путем копирования настроек и сопоставления существующего индекса. Желаемое количество первичных шардов может быть задано во время создания. Перед применением API разделения необходимо проверить следующие параметры:
Исходный индекс должен быть доступен только для чтения. Это означает, что процесс индексирования должен быть остановлен.
Количество первичных шардов в целевом индексе должно быть кратно количеству первичных шардов в исходном индексе. Например, если в исходном индексе 5 первичных шардов, то в целевом индексе первичных шардов может быть 10,15,20 и так далее.
Если необходимо изменить только номер первичного шарда, предпочтительнее использовать API split, так как он намного быстрее API Reindex.
Реализация API разделения
Создайте тестовый индекс:
1 2 3 4 | POST test_split_source/_doc { "test": "test" } |
Для разделения исходный индекс должен быть доступен только для чтения:
1 2 3 4 | PUT test_split_source/_settings { "index.blocks.write": true } |
Настройки и сопоставления будут автоматически скопированы из исходного индекса:
1 2 3 4 5 6 | POST /test_split_source/_split/test_split_target { "settings": { "index.number_of_shards": 3 } } |
Вы можете проверить прогресс с помощью:
1 | GET _cat/recovery/test_split_target?v&h=index,shard,time,stage,files_percent,files_total |
Поскольку настройки и сопоставления копируются из исходных индексов, целевой индекс доступен только для чтения. Давайте включим операцию записи для целевого индекса:
1 2 3 4 | PUT test_split_target/_settings { "index.blocks.write": null } |
Проверьте исходный и целевой индекс docs.count перед удалением исходного индекса:
1 | GET _cat/indices/test_split*?v&h=index,pri,rep,docs.count |
Имя индекса и имя псевдонима не могут быть одинаковыми. Необходимо удалить исходный индекс и добавить имя исходного индекса в качестве псевдонима к целевому индексу:
1 2 | DELETE test_split_source PUT /test_split_target/_alias/test_split_source |
Добавив псевдоним test_split_source в индекс test_split_target, вы должны протестировать его с помощью:
1 2 3 4 5 | GET test_split_source POST test_split_source/_doc { "test": "test" } |
Метод 2 - использование API _reindex
При создании нового индекса с помощью Reindex API можно задать любое количество первичных шардов. После создания нового индекса с заданным количеством первичных шардов все данные в исходном индексе могут быть переиндексированы в этот новый индекс.
В дополнение к функциям API разделения, данными можно манипулировать с помощью конвейера ingest_pipeline в AP переиндекса. С помощью конвейера ingest только указанные поля, соответствующие фильтру, будут проиндексированы в целевом индексе с помощью запроса. Содержимое данных можно изменить с помощью несложного сценария, а несколько индексов можно объединить в один индекс.
Реализация API reindex
Создайте тестовый индекс:
1 2 3 4 | POST test_reindex_source/_doc { "test": "test" } |
Скопируйте настройки и сопоставления из исходного индекса:
1 | GET test_reindex_source |
Создайте целевой индекс с настройками, сопоставлениями и нужным количеством шардов:
1 2 3 4 5 6 7 8 9 | PUT test_reindex_target { "mappings" : {}, "settings": { "number_of_shards": 10, "number_of_replicas": 0, "refresh_interval": -1 } } |
Установка параметров number_of_replicas: 0 и refresh_interval: -1 увеличит скорость переиндексации.
Запустите процесс переиндексации. Установка параметров requests_per_second=-1 и slices=auto настроит скорость переиндексации.
1 2 3 4 5 6 7 8 9 | POST _reindex?requests_per_second=-1&slices=auto&wait_for_completion=false { "source": { "index": "test_reindex_source" }, "dest": { "index": "test_reindex_target" } } |
Вы увидите идентификатор задачи при запуске API reindex. Скопируйте его и проверьте с помощью API _tasks:
1 | GET _tasks/<task_id> |
Обновите настройки после завершения переиндексации:
1 2 3 4 5 | PUT test_reindex_target/_settings { "number_of_replicas": 1, "refresh_interval": "1s" } |
Проверьте исходный и целевой индекс docs.count перед удалением исходного индекса, они должны быть одинаковыми:
1 | GET _cat/indices/test_reindex_*?v&h=index,pri,rep,docs.count |
Имя индекса и имя псевдонима не могут быть одинаковыми. Удалите исходный индекс и добавьте имя исходного индекса в качестве псевдонима к целевому индексу:
1 2 | DELETE test_reindex_source PUT /test_reindex_target/_alias/test_reindex_source |
После добавления псевдонима test_split_source к индексу test_split_target протестируйте его с помощью:
1 | GET test_reindex_source |
Заключение
Если вы хотите увеличить количество первичных шардов в существующем индексе, вам нужно заново создать настройки и отображения для нового индекса. Для этого существует 2 основных метода: API переиндексации и API разделения. Перед использованием любого из этих методов активное индексирование должно быть остановлено.