Фиксим ошибку ElasticSearch - low disk watermark [X%]
Запуская Seed RoR приложения на локальной машине получил неожиданную ошибку следующего вида:
[INFO ][o.e.c.r.a.DiskThresholdMonitor] [txaHD4y] low disk watermark [85%] exceeded on [txaHD4yFTmWbsFt6vUOvmQ][txaHD4y][/usr/local/var/lib/elasticsearch/nodes/0] free: 29.7gb[12.7%], replicas will not be assigned to this node :ok [INFO ][o.e.c.m.MetaDataDeleteIndexService] [txaHD4y] [projects_development_20200317113730591/RWwSRA08Qfutpnszd1rQIQ] deleting index [INFO ][o.e.c.m.MetaDataCreateIndexService] [txaHD4y] [projects_development_20200317114211756] creating index, cause [api], templates [], shards [5]/[1], mappings [project] [INFO ][o.e.c.m.MetaDataMappingService] [txaHD4y] [projects_development_20200317114211756/f8r1oBVFSB2FD8Bwn7CSaQ] update_mapping [project] [INFO ][o.e.c.m.MetaDataMappingService] [txaHD4y] [projects_development_20200317114211756/f8r1oBVFSB2FD8Bwn7CSaQ] update_mapping [project] rake aborted! Elasticsearch::Transport::Transport::Errors::Forbidden: [403] {"error":{"root_cause":[{"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}],"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"},"status":403} /../../../../../gems/elasticsearch-transport-7.4.0/lib/elasticsearch/transport/transport/base.rb:205:in `__raise_transport_error' /../../../../../gems/elasticsearch-transport-7.4.0/lib/elasticsearch/transport/transport/base.rb:333:in `perform_request' /../../../../../gems/elasticsearch-transport-7.4.0/lib/elasticsearch/transport/transport/http/faraday.rb:24:in `perform_request' /../../../../../gems/elasticsearch-transport-7.4.0/lib/elasticsearch/transport/client.rb:152:in `perform_request' /../../../../../gems/elasticsearch-api-7.4.0/lib/elasticsearch/api/namespace/common.rb:25:in `perform_request' /../../../../../gems/elasticsearch-api-7.4.0/lib/elasticsearch/api/actions/indices/update_aliases.rb:46:in `update_aliases' /../../../../../gems/searchkick-4.2.1/lib/searchkick/index.rb:89:in `promote' /../../../../../gems/searchkick-4.2.1/lib/searchkick/index.rb:307:in `reindex_scope' /../../../../../gems/searchkick-4.2.1/lib/searchkick/index.rb:200:in `reindex' /../../../../../gems/searchkick-4.2.1/lib/searchkick/model.rb:60:in `searchkick_reindex' /../../../../test_project/db/seeds.rb:66:in `<top (required)>' /../../../../../gems/activesupport-5.1.3/lib/active_support/dependencies.rb:286:in `load' /../../../../../gems/activesupport-5.1.3/lib/active_support/dependencies.rb:286:in `block in load' /../../../../../gems/activesupport-5.1.3/lib/active_support/dependencies.rb:258:in `load_dependency' /../../../../../gems/activesupport-5.1.3/lib/active_support/dependencies.rb:286:in `load' /../../../../../gems/railties-5.1.3/lib/rails/engine.rb:549:in `load_seed' /../../../../../gems/activerecord-5.1.3/lib/active_record/tasks/database_tasks.rb:270:in `load_seed' /../../../../../gems/activerecord-5.1.3/lib/active_record/railties/databases.rake:184:in `block (2 levels) in <top (required)>' /../../../../../gems/rake-12.3.1/exe/rake:27:in `<top (required)>' /../../../../../bin/ruby_executable_hooks:24:in `eval' /../../../../../bin/ruby_executable_hooks:24:in `<main>' Tasks: TOP => db:seed
Ничего не предвещало беды, но оказалось, что все не совсем плохо. Проблема в отсутствии достаточного количества места на SSD / жестком диске (на кануне было скачано довольно много контента и место почти закончилось).
У меня на macOS Catalina установлен ElasticSearch при помощи Homebrew. ElasticSearch при недостатке пространства на диске переходит в режим чтения. Во время выполнения seed - создавались записи в БД и соответственно триггерилась реиндексация (в моем случае) ElasticSearch.
low disk watermark [85%] exceeded on [..][..[/usr/local/var/lib/elasticsearch/nodes/0] free: 29.7gb[12.7%], replicas will not be assigned to this node
Есть несколько путей решения проблемы:
- Освободить пространство диске (удалить ненужные файлы);
- Отключить порог перехода в режим "Read only";
Я удалил некоторые файлы, но не освободил нужного количества места, поэтому перешел к отключению порога (threshold):
Запускаем ElasticSearch
elasticsearch
В соседней вкладке выполняем следующие две команды:
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_cluster/settings -d '{ "transient": { "cluster.routing.allocation.disk.threshold_enabled": false } }'
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
После этого проблема была решена. DiskThresholdMonitor продолжал выдавать сообщение "low disk watermark [85%] exceeded...", но seed отработал как надо (read & write).