HBase 版本號和兼容性


HBase 有兩種版本控制方案,分別是:pre-1.0 和 post-1.0。在本節內容中將作出詳細的說明。

HBase post-1.0

從 1.0.0 版本開始,HBase 正在致力於 Semantic Versioning 的發佈版本。綜上所述:

對於給定的版本號 MAJOR.MINOR.PATCH,增加如下內容:

  • MAJOR 版本,當你進行不兼容的 API 更改時
  • MINOR 版本,當您以向後兼容的方式添加功能時
  • PATCH 版本,當您進行向後兼容的錯誤修復時
  • 預發佈和構建元數據的其他標籤可作為MAJOR.MINOR.PATCH格式的擴展。

兼容性維度:

除了通常的 API 版本考慮之外,HBase 還有其他需要考慮的兼容性維度。

Client-Server 線協議兼容性:

  • 允許不同步更新客戶端和服務器。
  • 我們只能允許先升級服務器。也就是說,服務器將向後兼容舊客戶端,這樣新的 API 就可以使用。
  • 示例:用戶應該能夠使用舊客戶端連接到升級的群集。

Server-Server 協議兼容性:

  • 不同版本的服務器可以共存於同一個群集中。
  • 服務器之間的有線協議是兼容的。
  • 分佈式任務的工作人員(如複製和日誌拆分)可以共存於同一個群集中。
  • 相關協議(如使用ZK進行協調)也不會改變。
  • 示例:用戶可以執行滾動升級。

文件格式兼容性:

  • 支持文件格式向前和向後兼容
  • 示例:文件、ZK 編碼、目錄佈局自動升級為 HBase 升級的一部分。用戶可以降級到舊版本,並且一切都將繼續工作。

客戶端 API 兼容性:

  • 允許更改或刪除現有的客戶端 API。
  • 在我們更改/刪除主要版本之前,API 需要被棄用。
  • 修補程序(patch)版本中提供的 API 將在所有後續修補程序版本中提供。但是,可能會添加新的 API,這些 API 在以前的修補程序版本中將不可用。
  • 修補程序版本中引入的新 API 只能以源代碼兼容的方式添加:即實現公共 API 的代碼將繼續編譯。示例:使用新廢用的 API 的用戶不需要使用 HBase API 調用修改應用程序代碼,直到下一個主要版本。

客戶端二進制兼容性:

  • 寫入給定修補程序版本中提供的 API 的客戶端代碼可以運行不變(不需要重新編譯),以抵補新的 jar 後續補丁版本。
  • 寫入給定修補程序版本中提供的 API 的客戶端代碼可能無法針對早期修補程序版本中的舊 jar 運行。示例:舊編譯的客戶端代碼將在 jar 中保持不變。
  • 如果客戶端實現 HBase 接口,則可能需要重新編譯升級到較新的次要(minor)版本。

服務器端有限的 API 兼容性(取自 Hadoop):

  • 內部API被標記為“穩定(Stable)”,“正在發展(Evolving)”或“不穩定(Unstable)”。
  • 這意味著協處理器和插件(可插入類,包括複製)的二進制兼容性,只要這些只使用標記的接口/類。
  • 例如:舊編譯的協處理器,過濾器或插件代碼將在新 jar 中保持不變。

相關性兼容性:

  • HBase 的升級不需要依賴項目的兼容升級,包括運行 Java 時。
  • 示例:Hadoop 的升級不會使我們所做的任何兼容性保證失效。

操作兼容性:

  • 度量標準的更改
  • 服務的行為變化
  • 通過 /jmx/ 端點公開的 JMX API

概要

  • 修補程序(patch)升級是一種直接替代方案。任何不是 Java 二進制和源代碼兼容的更改都將不被允許。在修補程序版本中降級版本可能不兼容。
  • 次要(minor)升級不需要修改應用程序/客戶端代碼。理想情況下,這將是一個直接替換,但如果使用新的 jar,則客戶端代碼,協處理器,過濾器等可能必須重新編譯。
  • 主要(major)升級允許 HBase 做出重大改變。

以下是兼容性矩陣列表:

HBase 版本號和兼容性

HBase 有很多 API 要點,但對於上面的兼容性矩陣,我們區分了Client API(客戶端 API),Limited Private API(有限的私有 API)和 Private API(私有 API)。

  • InterfaceAudience(javadocs):捕捉預期的受眾,可能的值包括:
    • Public:對於最終用戶和外部項目是安全的;
    • LimitedPrivate:用於我們期望可插入的內部組件,如協處理器;
    • Private:嚴格用於 HBase 自身內部定義為 IA 的類中,Private 可以用作聲明 IA.LimitedPrivate 接口的參數或返回值。將IA.Private對象視為不透明;不要嘗試直接訪問其方法或字段。
  • InterfaceStability(javadocs):描述允許接口更改的類型。可能的值包括:
    • Stable:接口是固定的,預計不會改變;
    • Evolving:界面可能會在未來的minor 版本中改變;
    • Unstable:界面可能隨時更改

請記住 HBase 項目中 InterfaceAudience 註釋和 InterfaceStability 註釋之間的以下相互作用:

  • IA.Public 類本質上是穩定的,並堅持我們有關升級類型(主要,次要或修補程序)的穩定性保證。
  • IA.LimitedPrivate 類應始終使用給定的 InterfaceStability 值的其中一個進行註釋。如果他們不是,你應該假定他們是 IS.Unstable。
  • IA.Private 類應該被認為是隱含不穩定的,不能保證發佈之間的穩定性。

HBase 客戶端 API

HBase 客戶端 API 由所有標記有 InterfaceAudience.Public 接口的類或方法組成。hbase-client 和依賴模塊中的所有主類都有InterfaceAudience.Public,InterfaceAudience.LimitedPrivate或InterfaceAudience.Private標記。並非所有其他模塊(hbase-server等)中的類都有標記。如果一個類沒有使用上述中的一個註釋,則它被認為是一個InterfaceAudience.Private類。

HBase Limited Private API

LimitedPrivate 註釋為接口附帶了一組目標使用者。這些使用者是協處理器,phoenix,複製端點實現等。此時,HBase 只能保證修補程序版本之間的這些接口的源和二進制兼容性。

HBase Private API

所有使用InterfaceAudience.Private註釋的類或沒有註釋的所有類僅在HBase內部使用。接口和方法簽名可以隨時改變。如果您依賴於標記為Private的特定界面,則應打開jira以建議將界面更改為Public或LimitedPrivate,或者為此目的公開的接口。

HBase Pre 1.0

HBase Pre-1.0 版本都是 EOM:對於新的安裝,請勿部署:0.94.y、0.96.y 或 0.98.y,應該部署穩定的版本。

在語義版本化方案 pre-1.0 之前,HBase 追隨 Hadoop 的 0.2x 或 0.9x 版本。

二進制兼容性:

當我們說兩個 HBase 版本是兼容的時,我們的意思是這些版本是線(wire)和二進制兼容的。兼容的HBase版本意味著客戶可以與兼容但不同版本的服務器通話。這也意味著你可以換出一個版本的 jar,並用另一個兼容版本的 jar 替換它們,所有的 jar 都可以工作。除非另有說明,否則 HBase 主要的版本都是二進制兼容的。您可以安全地在二進制兼容版本之間進行滾動升級。

滾動升級

滾動升級是您一次更新服務器群集中的服務器的過程。如果它們是二進制或線路兼容的,則可以跨 HBase 版本進行滾動升級。粗略地說,滾動升級是正常地停止每臺服務器,更新軟件,然後重新啟動。您可以為集群中的每個服務器執行此操作。通常先升級 Master,然後再升級 RegionServers。

例如,下面的 HBase 是 symlinked 實際的 HBase 安裝。在升級之前,在群集上運行滾動重啟之前,我們將 symlink 更改為指向新的 HBase 軟件版本,然後運行:

HBase 版本號和兼容性

滾動重新啟動腳本將首先正常停止並重新啟動主服務器,然後依次重新啟動每個 RegionServer。由於 symlink 被更改,所以重新啟動時,服務器將使用新的HBase 版本。隨著滾動升級的進行,檢查日誌中是否有錯誤。

在兼容二進制/Wire的版本之間進行滾動升級:

除非另有說明,否則 HBase 指向的版本是二進制兼容的。您可以在 HBase 主要版本之間進行滾動升級。例如,您可以通過在集群中進行滾動升級,使用0.94.6二進制文件替換0.94.5二進制文件,從而從 0.94.5 轉到 0.94.6。

在次要(minor)版本中,我們調用的版本是有線/協議兼容的,在這種情況下,也可以執行滾動升級。例如,在從 0.98.x 升級到 HBase 1.0.0 時,我們聲明可以在 hbase-0.98.x 和 hbase-1.0.0 之間進行滾動升級。


分享到:


相關文章: