您好,登錄后才能下訂單哦!
在老版本的ES(例如2.3版本)中, index的shard數(shù)量定好后,就不能再修改,除非重建數(shù)據(jù)才能實現(xiàn)。
從ES6.1開始,ES 支持可以在線操作擴(kuò)大shard的數(shù)量(注意:操作期間也需要對index鎖寫)
從ES7.0開始,split時候,不再需要加參數(shù) index.number_of_routing_shards
具體參考官方文檔:
????https://www.elastic.co/guide/en/elasticsearch/reference/7.5/indices-split-index.html
????https://www.elastic.co/guide/en/elasticsearch/reference/6.1/indices-split-index.html
split的過程:
? ? 1、創(chuàng)建一個新的目標(biāo)index,其定義與源index相同,但是具有更多的primary shard。
? ? 2、將segment從源index硬鏈接到目標(biāo)index。(如果文件系統(tǒng)不支持硬鏈接,則將所有segment都復(fù)制到新索引中,這是一個非常耗時的過程。)
? ? 3、創(chuàng)建低級文件后,再次對所有文檔進(jìn)行哈希處理,以刪除屬于不同shard的documents
? ? 4、恢復(fù)目標(biāo)索引,就像它是剛剛重新打開的封閉索引一樣。
為啥ES不支持增量resharding?
? ? 從N個分片到N + 1個分片。增量重新分片確實是許多鍵值存儲支持的功能。僅添加一個新的分片并將新的數(shù)據(jù)推入該新的分片是不可行的:這可能是一個索引瓶頸,并根據(jù)給定的_id來確定文檔所屬的分片,這對于獲取,刪除和更新請求是必需的,會變得很復(fù)雜。這意味著我們需要使用其他哈希方案重新平衡現(xiàn)有數(shù)據(jù)。
? ? 鍵值存儲有效執(zhí)行此操作的最常見方式是使用一致的哈希。當(dāng)分片的數(shù)量從N增加到N + 1時,一致的哈希僅需要重定位鍵的1 / N。但是,Elasticsearch的存儲單位(碎片)是Lucene索引。由于它們以搜索為導(dǎo)向的數(shù)據(jù)結(jié)構(gòu),僅占Lucene索引的很大一部分,即僅占5%的文檔,將其刪除并在另一個分片上建立索引通常比鍵值存儲要高得多的成本。如上節(jié)所述,當(dāng)通過增加乘數(shù)來增加分片數(shù)量時,此成本保持合理:這允許Elasticsearch在本地執(zhí)行拆分,這又允許在索引級別執(zhí)行拆分,而不是為需要重新索引的文檔重新編制索引移動,以及使用硬鏈接進(jìn)行有效的文件復(fù)制。
? ? 對于僅追加數(shù)據(jù),可以通過創(chuàng)建新索引并將新數(shù)據(jù)推送到其中,同時添加一個別名來覆蓋讀取操作的新舊索引,從而獲得更大的靈活性。假設(shè)舊索引和新索引分別具有M和N個分片,與搜索具有M + N個分片的索引相比,這沒有開銷。
索引能進(jìn)行split的前提條件:
? ? 1、目標(biāo)索引不能存在。
? ? 2、源索引必須比目標(biāo)索引具有更少的primary shard。
? ? 3、目標(biāo)索引中主shard的數(shù)量必須是源索引中主shard的數(shù)量的倍數(shù)。
? ? 4、處理拆分過程的節(jié)點必須具有足夠的可用磁盤空間,以容納現(xiàn)有索引的第二個副本。
下面是具體的實驗部分:
tips:實驗機(jī)器有限,索引的replica都設(shè)置為0,生產(chǎn)上至少replica>=1
# 創(chuàng)建一個索引,2個主shard,沒有副本
curl?-s?-X?PUT?"http://1.1.1.1:9200/twitter?pretty"?-H?'Content-Type:?application/json'?-d' { ??"settings":?{ ????"index.number_of_shards":?2, ????"index.number_of_replicas":?0 ??}, ????"aliases":?{ ????"my_search_indices":?{} ??} }'
# 寫入幾條測試數(shù)據(jù)
curl?-s?-X?PUT?"http://1.1.1.1:9200/my_search_indices/_doc/11?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"id":?11, ??"name":"lee", ??"age":"23" }' curl?-s?-X?PUT?"http://1.1.1.1:9200/my_search_indices/_doc/22?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"id":?22, ??"name":"amd", ??"age":"22" }'
# 查詢數(shù)據(jù)
curl?-s?-XGET?"http://1.1.1.1:9200/my_search_indices/_search"?|?jq?.
# 對索引鎖寫,以便下面執(zhí)行split操作
curl?-s?-X?PUT?"http://1.1.1.1:9200/twitter/_settings?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"settings":?{ ????"index.blocks.write":?true ??} }'
# 寫數(shù)據(jù)測試,確保鎖寫生效
curl?-s?-X?PUT?"http://1.1.1.1:9200/twitter/_doc/33?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"id":?33, ??"name":"amd", ??"age":"33" }'
# 取消 twitter 索引的alias
curl?-s?-X?POST?"http://1.1.1.1:9200/_aliases?pretty"?-H?'Content-Type:?application/json'?-d?'{ ????"actions"?:?[ ????????{?"remove"?:?{?"index"?:?"twitter",?"alias"?:?"my_search_indices"?}?} ????] }'
# 開始執(zhí)行 split 切分索引的操作,調(diào)整后索引名稱為new_twitter,且主shard數(shù)量為8
curl?-s?-X?POST?"http://1.1.1.1:9200/twitter/_split/new_twitter?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"settings":?{ ????"index.number_of_shards":?8, ????"index.number_of_replicas":?0 ??} }'
# 對新的index添加alias?
curl?-s?-X?POST?"http://1.1.1.1:9200/_aliases?pretty"?-H?'Content-Type:?application/json'?-d?'{ ????"actions"?:?[ ????????{?"add"?:?{?"index"?:?"new_twitter",?"alias"?:?"my_search_indices"?}?} ????] }'
結(jié)果:
{
? "acknowledged" : true,
? "shards_acknowledged" : true,
? "index" : "new_twitter"
}
補(bǔ)充:
? ? 查看split的進(jìn)度,可以使用 _cat/recovery 這個api, 或者在 cerebro 界面上查看。
# 查看新索引的數(shù)據(jù),能正常查看
curl?-s?-XGET?"http://1.1.1.1:9200/my_search_indices/_search"?|?jq?.
# 對新索引寫數(shù)據(jù)測試,可以看到失敗的
curl?-s?-X?PUT?"1.1.1.1:9200/my_search_indices/_doc/33?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"id":?33, ??"name":"amd", ??"age":"33" }'
# 打開索引的寫功能
curl?-s?-X?PUT?"1.1.1.1:9200/my_search_indices/_settings?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"settings":?{ ????"index.blocks.write":?false? ??} }'
# 再次對新索引寫數(shù)據(jù)測試,可以看到此時,寫入是成功的
curl?-s?-X?PUT?"1.1.1.1:9200/my_search_indices/_doc/33?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"id":?33, ??"name":"amd", ??"age":"33" }' curl?-s?-X?PUT?"1.1.1.1:9200/my_search_indices/_doc/44?pretty"?-H?'Content-Type:?application/json'?-d?'{ ??"id":?44, ??"name":"intel", ??"age":"4" }'
# 此時,老的那個索引還是只讀的,我們確保新索引OK后,就可以考慮關(guān)閉或者刪除老的 twitter索引了。
貼一張 生產(chǎn)環(huán)境執(zhí)行后的index的截圖,可以看到新的index的每個shard體積只有老index的一半,這樣也就分?jǐn)偭薸ndex的壓力:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。