[譯] Elasticsearch 滾動升級

code4j發表於2019-03-04

Elasticsearch 滾動升級

滾動升級允許 Elasticsearch 叢集在業務不中斷的情況下更新一個節點。叢集中不支援同時執行多個版本,因為分片不會從新版本分配到舊版本的節點上。

從這個列表table中檢查當前版本的ES是否支援滾動升級。

滾動升級步驟如下:

第一步: 滾動升級步驟如下:

當你關閉一個節點之後,分片分配程式會嘗試立即將分片從當前節點複製到叢集上的其他節點,導致浪費了大量的 I/O 操作。要想避免這個問題可以通過在關閉節點前禁用這個程式

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "none"
  }
}
複製程式碼

第二步:停止不必要的索引,並執行同步重新整理(這一步可選)

你可以在升級期間愉快的進行索引操作,當然,如果你使用如下命令,停止不必要的索引,並執行同步重新整理synced-flush請求,分片恢復速度會更快:

POST /_flush/synced
複製程式碼

同步重新整理是錦上添花的操作。如果出現索引掛起的現象操作就會失敗,為了安全起見有必要多試幾次。

第三步:單個節點停機並升級

升級前關閉一個節點。

注意:當使用 zip 或 tar 包升級,預設情況下 Elasticsearch home 目錄下的 config,data,log,plugins 等目錄都會被覆蓋。
最好解壓到不同的目錄,這樣升級期間就不會刪除原來的目錄了。自定義的目錄可以通過 path.conf 和 path.data 來設定
RPM 或 DEB 包會把目錄放到 合適的位置

使用 rpm/deb ) 安裝包升級:

  • 使用 rpmdpkg 安裝新包,所有的目錄都會被放到合理的位置,配置檔案不會被覆蓋。

使用zip或tar包解壓安裝:

  • 解壓安裝包,確保不要覆蓋 configdata 目錄。
  • 從舊的安裝目錄拷貝 conf 目錄到新安裝目錄,或者使用 --path.conf 選項到外部的config目錄
  • 從舊的安裝目錄拷貝 data 目錄到新的安裝目錄,或修改 config/elasticsearch.yml 中的 path.data 設定 data 目錄為原來的目錄。

第四步:啟動升級過的節點

啟動升級後的節點並確認加入到叢集中,可以通過日誌或下面的命令來確認:

GET _cat/nodes
複製程式碼

第五步:重新開啟分片再平衡

一旦節點重新加入叢集,解禁分片分配程式再平衡:

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "all"
  }
}
複製程式碼

第六步:等待節點恢復正常

等待叢集分片平衡結束後,再升級下一個節點。這一過程可以使用_cat/health命令檢查:

GET _cat/health
複製程式碼

等到 status 這一列由 yellow 變成 green,Green 表示主分片和副本都分配完了。

重點:滾動升級過程中,高版本上的主分片不會把副本分配到低版本的節點,因為高版本的資料格式老版本不認。
如果高版本的主分片沒法分配副本,換句話說如果叢集中只剩下了一個高版本節點,那麼節點就保持未分配的狀態,叢集健康會保持 yellow
這種情況下,檢查下有沒有初始化或分片分配在執行。
一旦另一個節點升級結束後,分片將會被分配,然後叢集狀態會恢復到 green

沒有使用同步重新整理的分片恢復時間會慢一點。分片的狀態可以通過_cat/recovery請求監控:

GET _cat/recovery
複製程式碼

如果你在這之前停止索引操作,那麼在節點恢復完成之後重啟也是安全的。

第七步:重複上述步驟

當叢集穩定並且節點恢復後,對剩下的節點重複上述過程。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章