<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<!--#include virtual="../includes/_header.htm" -->
<h2 class="anchor-heading">
      <a class="anchor-link" id="migration" href="#migration"></a>
<a href="#migration">Migrating from 0.7.x to 0.8
    </a></h2>

0.8 is our first (and hopefully last) release with a non-backwards-compatible wire protocol, ZooKeeper     layout, and on-disk data format. This was a chance for us to clean up a lot of cruft and start fresh. This means performing a no-downtime upgrade is more painful than normal&mdash;you cannot just swap in the new code in-place.

<h3 class="anchor-heading">
      <a class="anchor-link" id="migration_steps" href="#migration_steps"></a>
<a href="#migration_steps">Migration Steps
    </a></h3>

<ol>
    <li>Setup a new cluster running 0.8.
    <li>Use the 0.7 to 0.8 <a href="tools.html">migration tool</a> to mirror data from the 0.7 cluster into the 0.8 cluster.
    <li>When the 0.8 cluster is fully caught up, redeploy all data <i>consumers</i> running the 0.8 client and reading from the 0.8 cluster.
    <li>Finally migrate all 0.7 producers to 0.8 client publishing data to the 0.8 cluster.
    <li>Decommission the 0.7 cluster.
    <li>Drink.
</ol>

<!--#include virtual="../includes/_footer.htm" -->
