经过阅读源代码 总结了一下官方文件没有说到的更细节一些的步骤:

开始Rebalance的步骤:
1验证集群的状态,所有的server都是NORMAL_SERVER
2.//向cluster发布的cluster.xml, 新加的节点 没有partition信息 旧节点的分区不变,这个cluster叫current cluster
3.  copy一份current cluster,这个拷贝叫transition cluster,for:每个要迁移的分区,将这个分区加入到transition cluster,并发布到每个server上,而且改变每个server的状态。
4.for:每个分区,数据开始迁移,在一个list中 主到主的迁移要优先于 从到相应从(主的按某顺序的下一个节点)的迁移。
5。 for每个分区:上面的工作完成后 crrent cluster=transition cluster
6。若对某个分区的迁移失败,那么改变所有Server的状态,将current cluster发布到所有server。这时current cluster中已经迁移成功的分区是有效的。而迁移失败的分区在迁移的过程中事实上已经接受写数据了,但是由于状态回滚,这些新写的数据在回滚后已经是属于老节点的数据了~ 这时系统恢复到正常状态只能依靠stealer node自己的repair功能,遍历自己的数据发现不属于自己的数据就放到slop库中等待转发.最后将恢复。