数据均衡
====

OceanBase 数据库通过 RootService 管理租户内各个资源单元间的负载均衡。不同类型的副本需求的资源各不相同，RootService 在执行分区管理操作时需要考虑的因素包括每个资源单元的 CPU、磁盘使用量、内存使用量、IOPS 使用情况。经过负载均衡，最终会使得所有机器的各类型资源占用都处于一种比较均衡的状态，充分利用每台机器的所有资源。

均衡组是负载均衡算法的操作单元，一个均衡组内的元素会均匀散在集群的各台服务器上。OceanBase 数据库有两种重要的均衡组：其一，所有的非分区表组成一个默认的均衡组；其二，一个分区表内部会形成一个或多个均衡组，具体取决于分区策略。

表格是一级分区，分区策略是 Hash、Range、List 分区的分区表，表格内的所有分区是一个均衡组。表格是二级分区，如果第一级分区是 Hash 分区，那么所有的一级分区会组成一个均衡组，如果第一级不是 Hash 分区第二级是 Hash 分区，那么每个一级分区下的二级分区会形成一个单独的均衡组。其他分区策略，则表格下的所有分区会组成一个均衡组。

分区组内的均衡算法是，首先通过个数均衡使得分区在资源单元间个数分布均匀，然后计算各个资源单元的负载，交换负载最高、负载最低的两个资源单元上的分区，既保持个数均衡，又使得负载更加均衡。随着数据持续写入分区，资源单元的负载会动态变化，会持续触发迁移，使得硬盘持续均衡。

另外，OceanBase 数据库通过引入表格组（table group）来尽可能地减少分布式事务。表格组用于聚集经常一起访问的多张表格。例如，有用户基本信息表（user）和用户商品表（user_item），这两张表格都按照用户编号哈希分布，只需要将二者设置为相同的表格组，系统后台就会自动将同一个用户所在的 user 表分区和 user_item 表分区调度到同一台服务器。这样，即使操作某个用户的多张表格，也不会产生跨机事务。这种设计兼具分布式系统的扩展性和关系数据库的易用性和灵活性，符合 DBA 的使用习惯。

主均衡策略解决的整体思路为：在某个均衡组中，根据副本的分布情况，实时挑选主，挑选主的结果为：primary_zone 上资源单元上分布的主的数量均衡。
