報錯起因:
同步數據到es中發生異常,日志報錯寫入索引異常,報錯情況如下
org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];
ElasticSearch進入“只讀”模式,只允許刪除,ES說明文檔中有寫明,當ES數據所在目錄磁盤空間使用率超過90%后,ES將修改為只讀狀態,所以初步判斷是磁盤空間不足導致es自動關閉了索引的寫功能,只能進行讀取或者刪除。
但是服務器排查 df -h
產生原因
根據多方查詢資料可能造成原因如下
1. 內存不足
JVMMemoryPressure 超過92%並持續30分鍾時,ES觸發保護機制,並且阻止寫入操作,以防止集群達到紅色狀態,啟用寫保護后,寫入操作將失敗,並且拋出 ClusterBlockException ,無法創建新索引,並且拋出 IndexCreateBlockException ,當五分鍾內恢復不到88%以下時,將禁用寫保護。
2. 磁盤空間不足
es的默認磁盤水位警戒線是85%,一旦磁盤使用率超過85%,es不會再為該節點分配分片,es還有一個磁盤水位警戒線是90%,超過后,將嘗試將分片重定位到其他節點
解決方案
-
磁盤擴容
-
刪除無用索引
-
將舊索引的副本數調小
-
增加數據節點
-
手動將 index.blocks.read_only_allow_delete 改成false
我es服務器是內存不足造成得 ,所有索引狀態都是 index.blocks.read_only_allow_delete true
此屬性為true時,ES索引只允許讀和刪數據,不允許增和改數據
-
查看指定索引的設置信息
curl -XGET http://127.0.0.1:9200/index_*/_settings?pretty
當索引不能增和改時,通過此命令,可以看到read_only_allow_delete為true
- 把read_only_allow_delete設置為false
curl -XPUT -H "Content-Type: application/json" http://127.0.0.1:9200/index_*/_settings -d '{"index.blocks.read_only_allow_delete": null}'