Dzieje się tak, gdy Elasticsearch uważa, że na dysku jest mało miejsca, więc przechodzi w tryb tylko do odczytu.
Domyślnie decyzja Elasticsearch opiera się na odsetku wolnego miejsca na dysku, więc na dużych dyskach może się to zdarzyć, nawet jeśli masz wiele gigabajtów wolnego miejsca.
Znak wodny etapu zalewania wynosi domyślnie 95%, więc na dysku 1 TB potrzebujesz co najmniej 50 GB wolnego miejsca lub Elasticsearch przełączy się w tryb tylko do odczytu.
Dokumenty dotyczące znaku wodnego etapu zalewania można znaleźć pod adresem https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html .
Właściwe rozwiązanie zależy od kontekstu - na przykład środowisko produkcyjne czy programistyczne.
Rozwiązanie 1: zwolnij miejsce na dysku
Zwolnienie wystarczającej ilości miejsca na dysku, aby więcej niż 5% dysku było wolne, rozwiąże ten problem. Elasticsearch nie wyjdzie automatycznie z trybu tylko do odczytu, gdy wystarczająca ilość dysku będzie wolna, musisz zrobić coś takiego, aby odblokować indeksy:
$ curl -XPUT -H "Content-Type: application/json" https://[YOUR_ELASTICSEARCH_ENDPOINT]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
Rozwiązanie 2: Zmień ustawienie znaku wodnego etapu zalewania
Zmień "cluster.routing.allocation.disk.watermark.flood_stage"
ustawienie na coś innego. Może być ustawiony na niższy procent lub wartość bezwzględną. Oto przykład, jak zmienić ustawienie z poziomu dokumentów :
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "100gb",
"cluster.routing.allocation.disk.watermark.high": "50gb",
"cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
"cluster.info.update.interval": "1m"
}
}
Ponownie, po wykonaniu tej czynności, będziesz musiał użyć powyższego polecenia curl, aby odblokować indeksy, ale potem nie powinny one ponownie przechodzić w tryb tylko do odczytu.