如果做網(wǎng)站推廣深圳網(wǎng)站開發(fā)技術(shù)
Elasticsearch?是一種強大的搜索和分析引擎,被廣泛用于各種應(yīng)用中,以其強大的全文搜索能力而著稱。
不過,在日常管理 Elasticsearch 時,我們經(jīng)常需要對索引進行保護,以防止數(shù)據(jù)被意外修改或刪除,特別是在進行系統(tǒng)維護或者需要優(yōu)化資源使用時。
Elasticsearch提供了一種名為“索引阻塞(Index blocks)”的功能,讓我們能夠限制對某個索引的操作類型。
Elasticsearch的索引阻塞功能在早期版本中就已存在,用于管理對索引的訪問和操作。隨著 Elasticsearch 版本的更新,該功能也在不斷得到改進和擴展。
參見官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-blocks.html
大白話——"索引阻塞"就是給我們的索引加把鎖,防止別人隨意修改。
1、索引阻塞的種類
Elasticsearch中的索引阻塞可以根據(jù)需要,限制對索引的讀取、寫入或元數(shù)據(jù)操作。
所謂的元數(shù)據(jù),可以理解為索引的基本信息和設(shè)置,比如索引包含哪些字段,這些字段是什么類型的等等。
這些阻塞可以通過動態(tài)索引設(shè)置添加或移除,也可以通過專門的API來添加,這樣做的好處是能確保在添加寫入阻塞后,所有索引的分片都正確地應(yīng)用了阻塞,比如確保在添加寫入阻塞后,所有正在進行的寫入操作都已完成。
以下是一些動態(tài)索引設(shè)置,用于確定索引上存在的阻塞類型:
index.blocks.read_only:設(shè)置為 true 使索引及索引元數(shù)據(jù)只讀,設(shè)置為false則允許寫入和元數(shù)據(jù)更改。
index.blocks.read_only_allow_delete:類似于index.blocks.read_only,但也允許刪除索引以釋放更多資源。
index.blocks.read:設(shè)置為 true 以禁用對索引的讀取操作。
index.blocks.write:設(shè)置為 true 以禁用對索引的數(shù)據(jù)寫入操作。與read_only不同,這個設(shè)置不影響元數(shù)據(jù)。例如,你可以調(diào)整帶有寫入阻塞的索引的設(shè)置,但不能調(diào)整帶有read_only阻塞的索引的設(shè)置。
index.blocks.metadata:設(shè)置為true以禁用索引元數(shù)據(jù)的讀寫操作。
設(shè)置名稱 | 描述 |
---|---|
index.blocks.read_only | 設(shè)置為true 使索引及索引元數(shù)據(jù)只讀,設(shè)置為false 則允許寫入和元數(shù)據(jù)更改。 |
index.blocks.read_only_allow_delete | 類似于index.blocks.write ,但也允許刪除索引以釋放更多資源。磁盤基礎(chǔ)的分片分配器可能會自動添加和移除這個阻塞。 |
index.blocks.read | 設(shè)置為true 以禁用對索引的讀取操作。 |
index.blocks.write | 設(shè)置為true 以禁用對索引的數(shù)據(jù)寫入操作。與read_only 不同,這個設(shè)置不影響元數(shù)據(jù)。例如,你可以調(diào)整帶有寫入阻塞的索引的設(shè)置,但不能調(diào)整帶有read_only 阻塞的索引的設(shè)置。 |
index.blocks.metadata | 設(shè)置為true 以禁用索引元數(shù)據(jù)的讀寫操作。 |
解釋一下:index.blocks.read_only 和 index.blocks.write 區(qū)別?
如下設(shè)置了禁止寫入,但是可以修改索引的設(shè)置,比如:副本數(shù)的調(diào)整,這個是允許的。
PUT?test-001/_settings
{"blocks.write":?true
}PUT?test-001/_settings
{"number_of_replicas":?2
}
但是換成這樣:
PUT?test-002
PUT?test-002/_settings
{"blocks.read_only":?true
}PUT?test-002/_settings
{"number_of_replicas":?2
}
如上的 read_only 設(shè)置后,如果再進行修改索引設(shè)置的設(shè)置就會報錯。
{"error":?{"root_cause":?[{"type":?"cluster_block_exception","reason":?"index?[test-002]?blocked?by:?[FORBIDDEN/5/index?read-only?(api)];"}],"type":?"cluster_block_exception","reason":?"index?[test-002]?blocked?by:?[FORBIDDEN/5/index?read-only?(api)];"},"status":?403
}
簡而言之,index.blocks.write 允許你保護索引內(nèi)容的穩(wěn)定性,同時仍然可以調(diào)整索引的配置來應(yīng)對不同的需求或進行優(yōu)化。而 index.blocks.read_only 則是一種更為嚴格的保護,確保索引在某段時間內(nèi)完全不被更改。
2、什么時候使用阻塞?
場景1:進行系統(tǒng)維護場景。
比如,當你需要升級系統(tǒng)或者做一些關(guān)鍵的維護工作時,可能不希望在這期間有任何索引結(jié)構(gòu)的變化。
通過阻止別人修改索引的元數(shù)據(jù),確保索引的設(shè)置保持不變,維護索引設(shè)置的穩(wěn)定性。
場景2:保護數(shù)據(jù)不被隨意更改場景。
舉例:如果咱們的業(yè)務(wù)數(shù)據(jù)是非常關(guān)鍵的,比如已經(jīng)歸檔的日志或者歷史記錄,這些數(shù)據(jù)通常是不允許被更改的。
防止關(guān)鍵數(shù)據(jù)被隨意更改或刪除,確保數(shù)據(jù)的完整性和準確性。
場景3:優(yōu)化資源使用的場景。
舉例:有時候某個索引可能占用了太多資源,你可能暫時不想讓它繼續(xù)增長。
通過控制索引的讀寫操作,幫助管理系統(tǒng)資源,避免因為資源過度使用而導(dǎo)致系統(tǒng)變慢或崩潰。
場景4:遵守安全規(guī)則場景。
舉例:對于一些敏感數(shù)據(jù),可能要求嚴格的訪問控制,不希望隨便被讀取或更改。
對于需要嚴格控制的敏感數(shù)據(jù),通過設(shè)置阻塞來限制數(shù)據(jù)的訪問和修改,保障數(shù)據(jù)安全。
3、添加索引阻塞API
使用范例參考:
PUT?/<index>/_block/<block>
<index>:(可選,字符串)逗號分隔的索引名列表或通配符表達式,用于限制請求。
<block>:(必需,字符串)要添加到索引的阻塞類型。
舉例,如下 API 用于給索引添加一個阻塞寫入。
PUT?/my-index-000001/_block/write
設(shè)置禁止寫入后,如果再寫入就會報錯。
"reason":?"index?[my-index-000001]?blocked?by:?[FORBIDDEN/8/index?write?(api)];"

通過執(zhí)行 PUT /my-index-000001/_block/write命令,我們可以向名為my-index-000001的索引添加一個寫入阻塞。成功執(zhí)行此命令后,任何試圖寫入該索引的操作都將被阻止,直到該阻塞被顯式移除。
除此之外,最常用的一個鎖叫做 blocks.metadata。當我們把這個設(shè)置開啟(設(shè)置為true)后,別人就不能修改索引的元數(shù)據(jù)了。
舉個例子,如果你在管理一個多租戶的SaaS應(yīng)用,每個租戶都有自己獨特的索引設(shè)置和映射。你肯定不希望有一天突然有人改變了這些設(shè)置,導(dǎo)致系統(tǒng)運行不正常。這時候,就可以使用 blocks.metadata 這個鎖來防止索引的元數(shù)據(jù)被修改。
PUT?testPUT?test/_settings
{"blocks.metadata":?true
}
如下的所有操作都會報錯:
GET??test
GET??test/_settings
GET??test/_mappingPUT?test/_doc/1
{"title":?"1111"
}
但是,如下檢索是可以正常進行的。
GET?test/_search
{"query":?{"match_all":?{}}
}
4、解除設(shè)置 API
要解除已經(jīng)設(shè)置的索引阻塞,可以將相應(yīng)的阻塞設(shè)置修改為false或使用 null來移除特定的阻塞。例如,要移除索引的 read_only阻塞,可以使用以下命令:
PUT?/<index>/_settings?
{?"index.blocks.read_only":?false?}
請注意,在進行此操作之前,確保已經(jīng)解決了導(dǎo)致設(shè)置阻塞的原因,如磁盤空間不足等。
5、小結(jié)
Elasticsearch的索引阻塞功能為數(shù)據(jù)提供了一層額外的保護,確保數(shù)據(jù)能夠按照預(yù)期安全、正確地被處理和訪問。
這套功能在系統(tǒng)維護、數(shù)據(jù)保護、資源優(yōu)化和安全增強等方面特別有用。
通過熟悉Elasticsearch提供的各種索引阻塞設(shè)置,可以有效管理對索引的訪問,保障數(shù)據(jù)完整性,高效利用資源,并加強數(shù)據(jù)的安全性。正確使用這些強大的工具需要深入理解它們的作用和應(yīng)用場景。
6、參考
https://kulekci.medium.com/elasticsearch-index-blocks-a-deep-dive-into-data-protection-b2ecc4b780c8
7 年+積累、 Elastic 創(chuàng)始人Shay Banon 等 15 位專家推薦的 Elasticsearch 8.X新書已上線
更短時間更快習(xí)得更多干貨!
和全球?近2000+?Elastic 愛好者一起精進!
elastic6.cn——ElasticStack進階助手
比同事?lián)屜纫徊綄W(xué)習(xí)進階干貨!