Elasticsearch7.1中文文檔-第三章-升級Elasticsearch

Elasticsearch一般可使用Rolling升級進行升級,所以升級不會中斷服務。 哪些版本支持滾動升級:html

  • 小版本之間
  • 從5.6-6.8
  • 從6.8-7.1.1

Elasticsearch能夠讀取在前一個主要版本中建立的索引。若是在5中建立了索引。在升級到7.1.1以前,您必須從新索引或刪除它們。若是存在不兼容的索引,則Elasticsearch節點將沒法啓動。即便它們是由6.x集羣建立的,5.x或更早索引的快照也沒法還原到7.x羣集。 有關升級舊索引的信息,請參閱從新索引升級node

升級到新版本的Elasticsearch時,須要升級Elastic Stack中的每一個產品。 有關更多信息,請參閱「Elastic Stack安裝和升級指南」。shell

從6.7或者更早的版本直接升級到7.1.1,你必須關閉集羣,安裝7.1.1,而且重啓。有關更多信息,請參閱徹底羣集從新啓動升級json

預升級

升級Elasticsearch以前:api

  1. 檢查棄用日誌,查看是否使用了任何棄用特性,並相應地更新代碼。默認狀況下,當日志級別設置爲WARN時,會記錄棄用警告。
  2. 查看重大更改,對7.1.1的代碼和配置進行任何須要的更改。
  3. 若是您使用自定義插件,請確保兼容版本可用。
  4. 在升級生產羣集以前,最好在開發環境中測試升級。
  5. 備份您的數據! 您必須擁有數據快照才能回滾到早期版本。

滾動升級

滾動升級容許Elasticsearch集羣一次升級一個節點,所以升級不會中斷服務。 不支持在升級期間在同一羣集中運行多個版本的Elasticsearch,由於沒法將分片已升級的節點複製到運行舊版本的節點。安全

滾動升級支持:網絡

  • 小版本之間
  • 從5.6-6.8
  • 從6.8-7.1.1

從6.7或更早版本直接升級到7.1.1須要從新啓動完整羣集app

要執行從6.8到7.1.1的滾動升級:curl

  1. 禁用分片分配機器學習

    當你關閉一個節點,在開始將該節點上的分片複製到集羣中的其餘節點以前,分配進程會等待index.unassigned.node_left.delayed_timeout(默認狀況下爲1分鐘),這可能涉及大量I / O。因爲節點很快將從新啓動,所以無需執行此I/O操做,您能夠經過在關閉節點以前禁用副本分配:

    curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.enable": "primaries" } } '
    複製代碼
  2. 中止不必的索引而且執行同步刷新。 (可選的)

    在升級過程當中能夠繼續索引,若是中止不必的索引而且執行同步刷新,那麼分片會恢復的快的多。

    curl -X POST "localhost:9200/_flush/synced"
    複製代碼

    當你執行同步刷新,檢查響應確保結果是成功的。因爲掛起索引操做而失敗的同步刷新操做被列在響應主體中,儘管請求自己仍然返回200 OK狀態。若是出現故障,從新發出請求。

  3. 暫時中止與活動機器學習做業和datafeeds相關的任務。(可選)

    若是你在6.x以前建立了機器學習索引,你必須從新索引

    若是你在6.x中版本中建立了機器學習索引,你能夠:

    • 讓您的機器學習任務在升級期間運行。當您關閉一個機器學習節點時,它的做業將自動轉移到另外一個節點並恢復模型狀態。此選項容許任務在升級期間繼續運行,但會增長集羣的負載。

    • 暫時中止與計算機學習做業和datafeeds相關的任務,並使用設置的升級模式API禁止打開新任務:

      curl -X POST "localhost:9200/_ml/set_upgrade_mode?enabled=true"
      複製代碼

      當你禁用了升級模式,使用自動保存的最後一個模型狀態恢復做業。此選項避免了在升級期間管理活動做業的開銷,而且比顯式地中止datafeed和關閉做業要快。

    • 中止全部的做業和datafeeds。此選項在關閉時保存模型狀態。 在升級後從新打開做業時,它們使用徹底相同的模型。 可是,保存最新模型狀態比使用升級模式須要更長時間,尤爲是當您有大量工做或具備大型模型狀態的做業時。

  4. 關閉一個節點

    • 若是你使用systemd運行Elasticsearch能夠這樣來關閉:

      sudo systemctl stop elasticsearch.service
      複製代碼
    • 若是你使用SysV init運行Elasticsearch能夠這樣來關閉:

      sudo -i service elasticsearch stop
      複製代碼
    • 若是你使用守護進程運行Elasticsearch能夠這樣來關閉:

      kill $(cat pid)
      複製代碼
  5. 升級已關閉的節點

    使用Depain或者RPM包升級:

    • 使用rpm或者dbpg安裝一個新的包,全部文件都安裝在操做系統的適當位置,而且不會覆蓋Elasticsearch配置文件。

    使用zip文件或者tar文件升級:

    • 解壓到一個目錄,若是您不使用外部配置和數據目錄,這是很是關鍵的。

    • 設置ES_PATH_CONF環境變量以指定外部config目錄和jvm.options文件的位置。若是不使用外部config目錄,請將舊配置複製到新安裝目錄。

    • config/elasticsearch.yml中設置path.data。指向外部data目錄。若是不使用外部data目錄,請將舊data目錄複製到新安裝。

      若是使用監視特性,則在升級Elasticsearch時重用數據目錄。monitor使用存儲在data目錄中的持久UUID標識唯一的Elasticsearch節點。

    • 設置config/elasticsearch.yml中的path.logs。指向要存儲logs的位置。若是不指定此設置,日誌將存儲在解壓存檔到的目錄中。

    當您解壓縮zip或tar包時,elasticsearch-n.n.n目錄包含Elasticsearchconfg,logs,dataplugin目錄。

    咱們建議將這些目錄移出Elasticsearch目錄,以便在升級Elasticsearch時不會刪除它們。 要指定新位置,請使用ES_PATH_CONF環境變量以及path.datapath.logs設置。 有關更多信息,請參閱重要的Elasticsearch配置。

    Debian和RPM軟件包將這些目錄放在每一個操做系統的適當位置。 在生產中,咱們建議使用deb或rpm軟件包進行安裝。

  6. 升級插件

    使用elasticsearch-plugin腳本安裝每一個已安裝插件的升級版本。 升級節點時,必須升級全部插件。

  7. 若是使用Elasticsearch安全功能來定義域,請驗證您的域設置是不是最新的。 域設置的格式在7.0版中已更改,特別是域類型的位置已更改。 請參閱域設置

  8. 開始升級你的節點

    啓動新升級的節點,經過檢查日誌文件或提交_cat / nodes請求來確認它是否加入羣集:

    curl -X GET "localhost:9200/_cat/nodes"
    複製代碼
  9. 啓用分片分配

    節點加入羣集後,刪除cluster.routing.allocation.enable設置以啓用分片分配並開始使用節點:

    curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
    {
      "persistent": {
        "cluster.routing.allocation.enable": null
      }
    }
    '
    複製代碼
  10. 等待節點恢復

    請等待集羣分片分配完成,再升級下一個節點,你能夠經過_cat/health請求來檢查進度:

    curl -X GET "localhost:9200/_cat/health?v"
    
    複製代碼

    等待status從黃色切換爲綠色。 綠色標識已經分配完成。

    在滾動升級期間,新版本的主分片不能分配給舊版本節點。新版本的數據格式和舊版本的數據格式可能不兼容。

    若是沒法將複製碎片分配給另外一個節點(集羣中只有一個升級的節點),則複製碎片將保持未分配,狀態保持黃色。

    在這種狀況下,您能夠在沒有初始化或重定位分片時繼續(檢查init和relo列)。

    一旦升級了另外一個節點,就能夠分配副本而且狀態將變爲綠色。

    未同步刷新的碎片可能須要更長時間才能恢復。 您能夠經過提交_cat / recovery請求來監視各個分片的恢復狀態:

    curl -X GET "localhost:9200/_cat/recovery"
    
    複製代碼

    若是您中止索引,能夠在恢復完成後當即恢復索引。

  11. 重複

    當節點已恢復且羣集穩定後,請對須要更新的每一個節點重複這些步驟。

  12. 重啓機器學習工做

    若是您暫時中止與計算機學習做業關聯的任務,請使用set upgrade mode API將它們恢復爲活動狀態:

    curl -X POST "localhost:9200/_ml/set_upgrade_mode?enabled=false"
    
    複製代碼

    若是您在升級以前關閉了全部機器學習做業,那麼打開這些做業並從Kibana或使用打開的做業啓動datafeeds並啓動datafeeds api。

    在滾動升級期間,羣集繼續正常運行。 可是,任何新功能都將被禁用或以向後兼容模式運行,直到羣集中的全部節點都升級爲止。 升級完成且全部節點都運行新版本後,新功能便可運行。 一旦發生這種狀況,就沒法返回以向後兼容模式運行。 運行先前主要版本的節點將不被容許加入徹底更新的羣集。

    若是在升級過程當中網絡出現故障,將全部剩餘的舊節點與羣集隔離,則必須使舊節點脫機並升級它們以使其可以加入羣集。

    在升級期間,若是一半或者一半以上的主資格節點不可用,則羣集將變爲不可用,這意味着升級再也不是滾動升級。若是發生這種狀況,您應升級並從新啓動全部已中止符合主節點資格的節點,再次造成羣集,就像執行徹底羣集從新啓動升級同樣。可能還須要升級全部剩餘的舊節點,在從新造成後加入羣集。

    一樣,若是運行僅包含一個主節點的測試/開發環境,則應最後升級主節點。從新啓動單個主節點會強制重組羣集。新羣集最初只有升級後的主節點,重組後,舊節點加入集羣時會被拒絕。已升級的節點將成功從新加入集羣。

完整集羣升級

要從版本6.0-6.7直接升級到Elasticsearch 7.1.1,必須關閉羣集中的全部節點,將每一個節點升級到7.1.1,而後從新啓動羣集。

若是運行的是6.0以前的版本,則將其升級到6.8並從新索引舊索引,或者從遠程調出一個新的7.1.1集羣並從新索引。

要執行完整集羣升級到7.1.1,參考下面的步驟:

  1. 禁用分片分配

    當你關閉一個節點,在開始將該節點上的分片複製到集羣中的其餘節點以前,分配進程會等待index.unassigned.node_left.delayed_timeout(默認狀況下爲1分鐘),這可能涉及大量I / O。因爲節點很快將從新啓動,所以無需執行此I/O操做,您能夠經過在關閉節點以前禁用副本分配:

    curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.enable": "primaries" } } '
    
    複製代碼
  2. 中止不必的索引而且執行同步刷新。

    在升級過程當中能夠繼續索引,若是中止不必的索引而且執行同步刷新,那麼分片會恢復的快的多。

    curl -X POST "localhost:9200/_flush/synced"
    
    複製代碼

    當你執行同步刷新,檢查響應確保結果是成功的。因爲掛起索引操做而失敗的同步刷新操做被列在響應主體中,儘管請求自己仍然返回200 OK狀態。若是出現故障,從新發出請求。

  3. 暫時中止與活動機器學習做業和datafeeds相關的任務。

    若是你在6.x以前建立了機器學習索引,你必須從新索引

    若是你在6.x中版本中建立了機器學習索引,你能夠:

    • 讓您的機器學習任務在升級期間運行。當您關閉一個機器學習節點時,它的做業將自動轉移到另外一個節點並恢復模型狀態。此選項容許任務在升級期間繼續運行,但會增長集羣的負載。

    • 暫時中止與計算機學習做業和datafeeds相關的任務,並使用設置的升級模式API禁止打開新任務:

      curl -X POST "localhost:9200/_ml/set_upgrade_mode?enabled=true"
      
      複製代碼

      當你禁用了升級模式,使用自動保存的最後一個模型狀態恢復做業。此選項避免了在升級期間管理活動做業的開銷,而且比顯式地中止datafeed和關閉做業要快。

    • 中止全部的做業和datafeeds。此選項在關閉時保存模型狀態。 在升級後從新打開做業時,它們使用徹底相同的模型。 可是,保存最新模型狀態比使用升級模式須要更長時間,尤爲是當您有大量工做或具備大型模型狀態的做業時。

  4. 關閉全部節點

  • 若是你使用systemd運行Elasticsearch能夠這樣來關閉:

    sudo systemctl stop elasticsearch.service
    
    複製代碼
  • 若是你使用SysV init運行Elasticsearch能夠這樣來關閉:

    sudo -i service elasticsearch stop
    
    複製代碼
  • 若是你使用守護進程運行Elasticsearch能夠這樣來關閉:

    kill $(cat pid)
    
    複製代碼
  1. 升級全部節點

若是你的版本是6.2或以前版本,而且安裝了X-pack插件(6.2以前的是X-pack是以插件形式存在),請在升級以前運行bin / elasticsearch-plugin remove x-pack以刪除X-Pack插件。 X-Pack功能如今包含在默認發行版中,再也不單獨安裝。 若是(6.2或以前)升級以前沒卸載X-Pack插件,則升級後節點將沒法啓動。 您須要降級,刪除插件,而後從新應用升級。

使用Depain或者RPM包升級:

  • 使用rpm或者dbpg安裝一個新的包,全部文件都安裝在操做系統的適當位置,而且不會覆蓋Elasticsearch配置文件。

    使用zip文件或者tar文件升級:

  • 解壓到一個目錄,若是您不使用外部配置和數據目錄,這是很是關鍵的。

  • 設置ES_PATH_CONF環境變量以指定外部config目錄和jvm.options文件的位置。若是不使用外部config目錄,請將舊配置複製到新安裝目錄。

  • config/elasticsearch.yml中設置path.data。指向外部data目錄。若是不使用外部data目錄,請將舊data目錄複製到新安裝。

    若是使用監視特性,則在升級Elasticsearch時重用數據目錄。monitor使用存儲在data目錄中的持久UUID標識唯一的Elasticsearch節點。

  • 設置config/elasticsearch.yml中的path.logs。指向要存儲logs的位置。若是不指定此設置,日誌將存儲在解壓存檔到的目錄中。

當您解壓縮zip或tar包時,elasticsearch-n.n.n目錄包含Elasticsearchconfg,logs,dataplugin目錄。

咱們建議將這些目錄移出Elasticsearch目錄,以便在升級Elasticsearch時不會刪除它們。 要指定新位置,請使用ES_PATH_CONF環境變量以及path.datapath.logs設置。 有關更多信息,請參閱重要的Elasticsearch配置。

Debian和RPM軟件包將這些目錄放在每一個操做系統的適當位置。 在生產中,咱們建議使用deb或rpm軟件包進行安裝。

  1. 升級插件

使用elasticsearch-plugin腳本安裝每一個已安裝插件的升級版本。 升級節點時,必須升級全部插件。

  1. 若是使用Elasticsearch安全功能來定義域,請驗證您的域設置是不是最新的。 域設置的格式在7.0版中已更改,特別是域類型的位置已更改。 請參閱域設置

  2. 啓動每一個升級完成的節點

    若是您有專用的主節點,請先啓動它們,等待它們造成集羣並選擇一個主節點,而後再處理數據節點。您能夠經過查看日誌來檢查進度。

    若是從6.x羣集升級,則必須經過設置cluster.initial_master_nodes設置來配置羣集引導。

    只要有足夠的符合主節點的節點相互發現,它們就會造成一個集羣並選出一個主節點。 此時,您可使用_cat / health_cat / nodes來監視加入集羣的節點:

    curl -X GET "localhost:9200/_cat/health"
    curl -X GET "localhost:9200/_cat/nodes"
    
    複製代碼
  3. 等待全部節點加入集羣並報告狀態爲黃色

    當節點加入集羣時,它開始恢復本地存儲的全部主分片。_cat/health 最初報告狀態爲紅色,表示沒有分配全部主分片。

    一旦一個節點恢復了它的本地分片,集羣狀態就切換到黃色,這代表全部主分片都已恢復,但並無分配全部複製分片。這是預期的,由於您尚未從新啓用分配。全部節點狀態都變爲黃色時,再開始副本的分配,主節點的副本容許被分配到已經具備副本的節點中。

  4. 啓用分配

    當全部節點都已加入羣集並恢復其主分片時,請經過將cluster.routing.allocation.enable恢復爲其默認值來從新啓用分配:

    curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
    {
      "persistent": {
        "cluster.routing.allocation.enable": null
      }
    }
    '
    
    複製代碼

    一旦從新啓用分配,集羣就開始向數據節點分配副本分片。此時,恢復索引和搜索是安全的,可是若是您可以等到成功分配了全部主分片和副本分片,而且全部節點的狀態都是綠色的,那麼您的集羣將恢復得更快。

    你能夠經過_cat/health_cat/recoveryAPI來檢查進度:

    curl -X GET "localhost:9200/_cat/health"
    curl -X GET "localhost:9200/_cat/recovery"
    
    複製代碼
  5. 重啓機器學習工做

    若是您暫時中止與計算機學習做業關聯的任務,請使用set upgrade mode API將它們恢復爲活動狀態:

    curl -X POST "localhost:9200/_ml/set_upgrade_mode?enabled=false"
    
    複製代碼

    若是您在升級以前關閉了全部機器學習做業,那麼打開這些做業並從Kibana或使用打開的做業啓動datafeeds並啓動datafeeds api。

升級前從新索引

Elasticsearch能夠讀取在前一個主要版本中建立的索引。若是在5中建立了索引。在升級到7.1.1以前,您必須從新索引或刪除它們。若是存在不相容的索引,則Elasticsearch節點將沒法啓動。 即便它們是由6.x羣集建立的,5.x或更早索引的快照也沒法還原到7.x羣集。

這個限制也適用於Kibana和X-Pack特性使用的內部索引。所以,在使用7.1.1中的Kibana和X-Pack特性以前,必須確保內部索引具備兼容的索引結構。

有兩種方法能夠重建舊索引:

  • 升級前在老版本上重建索引。
  • 建立一個新的7.1.1集羣並從遠程從新索引。這可以從新索引駐留在運行任何版本的Elasticsearch的集羣上的索引。(兼容性強)

重建索引

您可使用Kibana 6.7中的升級助手自動把5.x的索引轉發到7.1.1。

手動重建索引:

  1. 建立具備7.x兼容映射的索引。

  2. refresh_interval設置爲-1,將number_of_replicas設置爲0以進行有效的重建索引。

  3. 使用reindex API將5.x索引中的文檔複製到新索引中。 在從新索引期間,可使用腳本對文檔數據和元數據執行任何須要的修改。

  4. refresh_intervalnumber_of_replicas重置爲舊索引中使用的值。

  5. 等待索引狀態改變爲綠色。

  6. 在單個更新別名請求中:

    • 刪除舊索引。
    • 將具備舊索引名的別名添加到新索引中。
    • 把舊索引上已存在的別名添加到新索引。

    若是使用機器學習功能而且機器學習索引是在6.x以前建立的,則必須暫時中止與機器學習做業和datafeed相關的任務,防止在從新索引期間打開新做業。 使用set upgrade mode API或中止全部datafeed並關閉全部計算機學習做業。

    若是您使用Elasticsearch安全功能,則在從新索引.security *內部索引以前,最好在文件域中建立臨時超級用戶賬戶。

    1. 在單個節點上,將臨時超級用戶賬戶添加到文件域。 例如,運行elasticsearch-users useradd命令:
    bin/elasticsearch-users useradd <user_name> \
    -p <password> -r superuser
    
    複製代碼
    1. 從新索引.security *索引時使用這些憑據。 也就是說,使用它們登陸Kibana並運行升級助手或調用reindex API。 您可使用常規管理憑據從新索引其餘內部索引。
    2. 從文件域中刪除臨時超級用戶賬戶。 例如,運行elasticsearch-users userdel命令:
    bin/elasticsearch-users userdel <user_name>
    
    複製代碼

    有關更多信息,請參閱配置文件域

從遠程集羣重建索引

您可使用來自遠程的reindex將索引從舊集羣遷移到7.1.1集羣。 這使您能夠從6.7以前的集羣遷移到7.1.1而不會中斷服務。

Elasticsearch提供向後兼容性支持,支持將先前主要版本的索引升級到當前主要版本。 跳過主要版本意味着您必須本身解決任何向後兼容性問題。

若是使用機器學習特性,而且要從6.5或更早的集羣遷移索引,則做業和數據流配置信息不會存儲在索引中。您必須在新的集羣中從新建立機器學習做業。若是要從6.6或更高版本的集羣遷移,最好暫時中止與機器學習做業和數據存儲相關的任務,以防止微小時差從新索引的不一樣機器學習索引之間的不一致性。使用set upgrade mode API或中止全部數據存儲並關閉全部機器學習做業。

遷移索引:

  1. 設置新的7.1.1集羣,並將現有集羣添加到elasticsearch.yml中的reindex.remote.whitelist

    reindex.remote.whitelist: oldhost:9200
    
    複製代碼

    新的集羣沒必要開始徹底擴展。當您遷移索引並將負載轉移到新集羣時,您能夠向新集羣添加節點,並從舊集羣刪除節點。

  2. 對於須要遷移到新集羣的索引:

    • 建立索引適當的映射和設置。 將refresh_interval設置爲-1並將number_of_replicas設置爲0以便更快地重建索引。

    • 使用reindexAPI將遠程索引中的文檔提取到新的7.1.1索引中:

      curl -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
      {
        "source": {
          "remote": {
            "host": "http://oldhost:9200",
            "username": "user",
            "password": "pass"
          },
          "index": "source",
          "query": {
            "match": {
              "test": "data"
            }
          }
        },
        "dest": {
          "index": "dest"
        }
      }
      '
      
      複製代碼

      若是經過將wait_for_completion設置爲false在後臺運行重建索引做業,則reindex請求將返回一個task_id(任務id,用來查看任務完成進度),您可使用該taskAPI監視reindex做業的進度:GET _tasks / TASK_ID

    • reindex做業完成後,將refresh_intervalnumber_of_replicas設置爲所需的值(默認設置爲30s和1)。

    • 一旦重建索引完成而且新索引的狀態是綠色,舊能夠刪掉舊索引了。

相關文章
相關標籤/搜索