OceanBase 数据库通过 RootService 管理租户内各个资源单元间的负载均衡。不同类型的副本需求的资源各不相同,RootService 在执行分区管理操作时需要考虑的因素包括每个资源单元的 CPU、磁盘使用量、内存使用量、IOPS 使用情况。经过负载均衡,最终会使得所有机器的各类型资源占用都处于一种比较均衡的状态,充分利用每台机器的所有资源。
均衡组是负载均衡算法的操作单元,一个均衡组内的元素会均匀散在集群的各台服务器上。OceanBase 数据库有两种重要的均衡组:其一,所有的非分区表组成一个默认的均衡组;其二,一个分区表内部会形成一个或多个均衡组,具体取决于分区策略。
表格是一级分区,分区策略是 Hash、Range、List 分区的分区表,表格内的所有分区是一个均衡组。表格是二级分区,如果第一级分区是 Hash 分区,那么所有的一级分区会组成一个均衡组,如果第一级不是 Hash 分区第二级是 Hash 分区,那么每个一级分区下的二级分区会形成一个单独的均衡组。其他分区策略,则表格下的所有分区会组成一个均衡组。
分区组内的均衡算法是,首先通过个数均衡使得分区在资源单元间个数分布均匀,然后计算各个资源单元的负载,交换负载最高、负载最低的两个资源单元上的分区,既保持个数均衡,又使得负载更加均衡。随着数据持续写入分区,资源单元的负载会动态变化,会持续触发迁移,使得硬盘持续均衡。
另外,OceanBase 数据库通过引入表格组(table group)来尽可能地减少分布式事务。表格组用于聚集经常一起访问的多张表格。例如,有用户基本信息表(user)和用户商品表(user_item),这两张表格都按照用户编号哈希分布,只需要将二者设置为相同的表格组,系统后台就会自动将同一个用户所在的 user 表分区和 user_item 表分区调度到同一台服务器。这样,即使操作某个用户的多张表格,也不会产生跨机事务。这种设计兼具分布式系统的扩展性和关系数据库的易用性和灵活性,符合 DBA 的使用习惯。
主均衡策略解决的整体思路为:在某个均衡组中,根据副本的分布情况,实时挑选主,挑选主的结果为:primary_zone 上资源单元上分布的主的数量均衡。