diff --git a/src/main/docbkx/upgrading.xml b/src/main/docbkx/upgrading.xml index 546be223709..d5708a403e5 100644 --- a/src/main/docbkx/upgrading.xml +++ b/src/main/docbkx/upgrading.xml @@ -29,6 +29,8 @@ */ --> Upgrading + + You cannot skip major versions upgrading. If you are upgrading from version 0.90.x to 0.94.x, you must first go from 0.90.x to 0.92.x and then go from 0.92.x to 0.94.x. @@ -40,13 +42,243 @@ linkend="configuration" />, in particular the section on Hadoop version.
- HBase version numbers - HBase has not walked a straight line where version numbers are concerned. Since we - came up out of hadoop itself, we originally tracked hadoop versioning. Later we left - hadoop versioning behind because we were moving at a different rate to that of our - parent. If you are into the arcane, checkout our old wiki page on HBase version number and compatibility + HBase has two versioning schemes, pre-1.0 and post-1.0. Both are detailed below. + +
+ Post 1.0 versions + Starting with 1.0.0 release, HBase uses Semantic Versioning for it release versioning. + In summary: +
+ + Given a version number MAJOR.MINOR.PATCH, increment the: + + MAJOR version when you make incompatible API changes, + MINOR version when you add functionality in a backwards-compatible manner, and + PATCH version when you make backwards-compatible bug fixes. + Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. + + +
+
+ +
+ Compatibility Dimensions + In addition to the usual API versioning considerations HBase has other compatibility dimensions that we need to consider. + +
+ Client-Server wire protocol compatibility + + Allows updating client and server out of sync. + We could only allow upgrading the server first. I.e. the server would be backward compatible to an old client, that way new APIs are OK. + Example: A user should be able to use an old client to connect to an upgraded cluster. + +
+
+ Server-Server protocol compatibility + + Servers of different versions can co-exist in the same cluster. + The wire protocol between servers is compatible. + Workers for distributed tasks, such as replication and log splitting, can co-exist in the same cluster. + Dependent protocols (such as using ZK for coordination) will also not be changed. + Example: A user can perform a rolling upgrade. + +
+
+ File format compatibility + + Support file formats backward and forward compatible + Example: File, ZK encoding, directory layout is upgraded automatically as part of an HBase upgrade. User can rollback to the older version and everything will continue to work. + +
+
+ Client API compatibility + + Allow changing or removing existing client APIs. + An API needs to deprecated for a major version before we will change/remove it. + Example: A user using a newly deprecated api does not need to modify application code with hbase api calls until the next major version. + +
+
+ Client Binary compatibility + + Old client code can run unchanged (no recompilation needed) against new jars. + Example: Old compiled client code will work unchanged with the new jars. + +
+
+ Server-Side Limited API compatibility (taken from Hadoop) + + Internal APIs are marked as Stable, Evolving, or Unstable + This implies binary compatibility for coprocessors and plugins (pluggable classes, including replication) as long as these are only using marked interfaces/classes. + Example: Old compiled Coprocessor, Filter, or Plugin code will work unchanged with the new jars. + +
+
+ Dependency Compatibility + + An upgrade of HBase will not require an incompatible upgrade of a dependent project, including the Java runtime. + Example: An upgrade of Hadoop will not invalidate any of the compatibilities guarantees we made. + +
+
+ Operational Compatibility + + Metric changes + Behavioral changes of services + Web page APIs + +
+
+ Summary + + A patch upgrade is a drop-in replacement. Any change that is not Java binary compatible would not be allowed. + A minor upgrade requires no application/client code modification. Ideally it would be a drop-in replacement but client code, coprocessors, filters, etc might have to be recompiled if new jars are used. + A major upgrade allows the HBase community to make breaking changes. + +
+
+ Compatibility Matrix <footnote><para>Note that this indicates what could break, not that it will break. We will/should add specifics in our release notes.</para></footnote> + (Y means we support the compatibility. N means we can break it.) + + Compatibility Matrix + + + + + + + + + Major + Minor + Patch + + + + + Client-Server wire Compatibility + N + Y + Y + + + Server-Server Compatibility + N + Y + Y + + + File Format Compatibility + NRunning an offline upgrade tool without rollback might be needed. We will typically only support migrating data from major version X to major version X+1. + + Y + Y + + + Client API Compatibility + N + Y + Y + + + Client Binary Compatibility + N + N + Y + + + Server-Side Limited API Compatibility + + + + + + Stable + N + Y + Y + + + Evolving + N + N + Y + + + Unstable + N + N + N + + + Dependency Compatibility + N + Y + Y + + + Operational Compatibility + N + N + Y + + + +
+
+ +
+ HBase API surface + HBase has a lot of API points, but for the compatibility matrix above, we differentiate between Client API, Limited Private API, and Private API. HBase uses a version of + Hadoop's Interface classification. HBase's Interface classification classes can be found here. + + InterfaceAudience: captures the intended audience, possible values are Public (for end users and external projects), LimitedPrivate (for other Projects, Coprocessors or other plugin points), and Private (for internal use). + InterfaceStability: describes what types of interface changes are permitted. Possible values are Stable, Evolving, Unstable, and Deprecated. + + + +
+ HBase Client API + HBase Client API consists of all the classes or methods that are marked with InterfaceAudience.Public interface. All main classes in hbase-client and dependent modules have either InterfaceAudience.Public, InterfaceAudience.LimitedPrivate, or InterfaceAudience.Private marker. Not all classes in other modules (hbase-server, etc) have the marker. If a class is not annotated with one of these, it is assumed to be a InterfaceAudience.Private class. +
+ +
+ HBase LimitedPrivate API + LimitedPrivate annotation comes with a set of target consumers for the interfaces. Those consumers are coprocessors, phoenix, replication endpoint implemnetations or similar. At this point, HBase only guarantees source and binary compatibility for these interfaces between patch versions. +
+ +
+ HBase Private API + All classes annotated with InterfaceAudience.Private or all classes that do not have the annotation are for HBase internal use only. The interfaces and method signatures can change at any point in time. If you are relying on a particular interface that is marked Private, you should open a jira to propose changing the interface to be Public or LimitedPrivate, or an interface exposed for this purpose. +
+ +
+
+ +
+ +
+ Pre 1.0 versions + + + Before the semantic versioning scheme pre-1.0, HBase tracked either Hadoop's versions (0.2x) + or 0.9x versions. If you are into the arcane, checkout our old wiki page on HBase - Versioning which tries to connect the HBase version dots. + Versioning which tries to connect the HBase version dots. Below sections cover ONLY the + releases before 1.0.
Odd/Even Versioning or "Development"" Series Releases @@ -60,6 +292,8 @@ issues we've missed ahead of our rolling a production-worthy release. Our first "Development" Series was the 0.89 set that came out ahead of HBase 0.90.0. HBase 0.95 is another "Development" Series that portends HBase 0.96.0. + 0.99.x is the last series in "developer preview" mode before 1.0. Afterwards, + we will be using semantic versioning naming scheme (see above).
Does + xlink:href="http://search-hadoop.com/m/bOOvwHGW981/Does+compatibility+between+versions+also+mean+binary+compatibility%253F&subj=Re+">Does compatibility between versions also mean binary compatibility? discussion on the hbaes dev mailing list.
+ + +
<firstterm>Rolling Upgrades</firstterm> A rolling upgrade is the process by which you update the servers