0%

[Elasticsearch] 解決 FORBIDDEN/12/index read-only / allow delete (api) 的問題

在 Elasticsearch 運行的過程中,很有可能會遇到 FORBIDDEN/12/index read-only / allow delete (api) 的錯誤,發生的原因是 Disk 空間不足,這和 Elasticsearch 中的幾個設定有關:

cluster.routing.allocation.disk.watermark.low: 控制 Disk usage 的 low watermark, 預設是 85%,代表 Elasticsearch 不會配置 shards 給 Disk 使用量高於 85% 的節點。其值可以是百分比,也可以是絕對的數值(例如: 20gb)。此設定可以避免 Elasticsearch 配置 shards 給 Disk 空間不足的節點。此設定對於新創建的 index 的 primary shard 是不影響的,也就是說如果 cluster 中所有節點的 Disk usage 都超過 85%,有新創建的 index 需要進行分配,此時新創建的 primary shard 會正常分配,非主要的 shard 會無法分配而導致 cluster status 為 yellow.

cluster.routing.allocation.disk.watermark.high: 控制 Disk usage 的 high watermark, 預設是 90%,代表 Elasticsearch 會企圖嘗試將 Disk 使用量高於 90% 的節點重新配置 shards。其值和 low watermark 一樣可以是百分比,也可以是絕對的數值(例如: 10gb)。此設定會影響到所有 shards,不論是否已經配置過,都會影響到。

cluster.routing.allocation.disk.watermark.flood_stage: 控制 flood stage watermark. 預設是 95%,代表 Elasticsearch 會強制將有一個或多個 shard 被配置到 Disk 使用量超過 95% 的節點上的所有 index 變成 read-only index block (index.blocks.read_only_allow_delete),這是最後會採取的措施,用來避免節點的 Disk 空間被用盡。當有足夠 Disk 空間時,需要再手動釋放 index block.

所以當發生 FORBIDDEN/12/index read-only / allow delete (api) 錯誤時,代表已經達到 flood stage,解決方式就是整理 Disk 空間、刪除部分資料,當有足夠 Disk 空間後,執行以下指令來釋放 index block:

1
2
3
4
PUT /<your_index>/_settings
{
"index.blocks.read_only_allow_delete": false
}

ps. 在設定時,不能混合百分比和絕對的數值,必須全部都是百分比,或是全部都是絕對數值。

參考資料