蚂蚁 OceanBase负载均衡设计和实践

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 本文整理自蚂蚁集团DBA徐力嘉,在深入浅出OceanBase第四期的分享。

蚂蚁 OceanBase负载均衡设计和实践


摘要:本文整理自蚂蚁集团DBA徐力嘉,在深入浅出OceanBase第四期的分享。


本篇内容主要分为六个部分:

1.数据库的负载均衡

2.OceanBase内置的两种负载均衡

3.OceanBase负载均衡相关参数

4.OceanBase外置负载均衡能力设计

5.从应用架构看负载均衡

6.用户问答

 

一、数据库的负载均衡

image.png

目前,数据库主要分为三种。即传统集中式架构数据库、分布式数据库中间件、原生分布式数据库。


其中,原生SQL引擎,支持分布式查询和事务,灵活的部署模式、高可用和负载均衡能力。

image.png

如上图所示,OB是一个多租户架构,在OceanBase数据库中,使用资源配置(unit_config)、资源池(Resource Pool)和资源单元(Unit)等三个概念,对各租户的可用资源进行管理。


OceanBase是分布式关系型数据库,采用shared-nothing架构,用户数据以分区(Partition)方式进行分片分布在多台机器上。Partition以分区为单位组织用户数据,分区在不同机器上的数据拷贝称为副本(Replica)。


同一分区的多个副本使用Paxos一致性协议保证副本的强一致,每个分区和它的副本构成一个独立的Paxos组。

 

二、OceanBase内置的两种负载均衡

image.png

上图是一个多租户多unit的案例,其中,集群CLUSTER有三个zone。每个zone NOB Server,这种部署简称N-N-NOB Server皆为30C 200G 4Tdocker


OB是多租户的数据库系统,一个集群内可包含多个相互独立的租户,每个租户提供独立数据库服务布局n-n-n。租户A总资源60C 120G,租户B总资源120C 600G,租户C总资源45C 180G

image.png

资源单元对应CPU、内存、存储空间、IOPS这几个物理资源。任何一个资源单元一定会放置在一个资源足够容纳它的OB Server上,一个租户在同一个OB Server上最多有一个资源单元。


OB Server服务器下线前,其上的资源单元必须迁移到其他OB Server上,如果集群内其他OB Server不足以容纳会导致下线无法成功。


资源池由具有相同资源配置Unit Config的若干个资源单元组成。一个资源池只能属于一个租户,一个租户可以拥有一或多个资源池,这些资源池的集合描述了这个租户所能使用的所物理资源。


RootService包括资源管理、负载均衡和Schema管理。其中,资源管理包括Region/Zone/OBServer/Resource Pool/Unit等元信息的管理,比如:上下线OBServer、改变Tenant资源规格等。


负载均衡决定Unit/Partition在多个机器间的分布均衡,机器上主分区个数。

在容灾场景下通过自动复制/迁移补充缺失的Replica

Schema管理负责处理DDL请求并生成新Schema

image.png

UNIT资源单元是多租户架构、分布式架构下的重要概念。任何一个资源单元一定会放置在一个资源足够容纳它的OB Server上,一个租户在同一个OB Server上最多有一个资源单元。


RS模块需要对资源单元进行管理,并通过把资源单元在多个OBServer间调度,对系统资源进行有效利用。RS对资源单元的管理包括:资源单元的分配和均衡。

 

三、OceanBase负载均衡相关参数

image.png

假设存在两个OBServerOBS010CPU)和OBS110CPU)。其中,OBS0上包含6UnitOBS1上包含4Unit,每个Unit的资源规格都为1CPU


过在OBServer间迁移Unit,使得各OBServerCPU占用率尽可能接近。与迁移Unit前相比,两个OBServer的资源占用率更平均。

image.png

多种资源均衡算法,即为参与分配和均衡的每种资源分配一个权重,作为计算OBServer总的资源占用率时该资源所占的百分比,某种资源使用的越多,则该资源的权重就越高。

image.png

enable_rebalance为负载均衡的总开关,用于控制UNIT均衡和PARTITION均衡的开关。


enable_rebalance的值为False时,UNIT均衡和PARTITION均衡均关闭。当enable_rebalance的值为True时,UNIT均衡需参考配置项resource_soft_limit的配置。


resource_soft_limitUNIT均衡resource_soft_limit的开关。当enable_rebalance的值为Trueresource_soft_limit的值小于100时,资源单元均衡开启。


enable_rebalance的值为Trueresource_soft_limit的值大于等于100时,资源单元均衡关闭。当所有节点的资源水位低于resource_soft_limit时,不执行负载均衡,缺省为50


server_balance_cpu_mem_tolerance_percent为触发资源单元均衡的阈值。当某些OBServer的资源单元负载与平均负载的差值超过。


server_balance_cpu_mem_tolerance_percent设置的值时,开始调度均衡,直到所有ObServer的资源单元的负载与平均负载的差值都小于配置项server_balance_cpu_mem_tolerance_percent的值。

image.png

PARTITION是分区副本的自动负载均衡,在租户拥有的Unit内调整分区副本的分布使得Unit的负载差值尽量小。


PARTITION均衡是发生在单个Zone内的租户级别的行为。均衡组是Partition的集合,Zone内的全部Partition划分成若干个组,以组为均衡调度的基本单位,各个均衡组之间相互独立。


均衡组主要分为三类。第一类均衡组,包含多个分区的一个 Table Group下的所有 Partition 被认定为一个均衡组。


第二类均衡组,不属于任何Table Group 的某个多分区表下的全部 Partition 被认定为一个均衡组。


第三类均衡组,除上述Partition 以外的全部其他 Partition 被认定为一个均衡组。针对一个租户,此类均衡组在某个 Zone 内仅有一个。

image.png

Partition个数满足要求的前提下,通过在Unit间交换Partition使各Unit磁盘使用量的差值小于配置项balancer_tolerance_percentage设置的值。

image.png

Table Group是一个逻辑概念,是表的集合。属于某个Table Group集合的所有Table均需要满足三点约束。


第一,必须有相同的 Locality(包括副本类型、个数及位置);


第二,必须相同的 Primary Zone(包括 Leader 位置及其优先级);


第三,必须相同的分区方式、相同的分区数量。

image.png

如上图所示,处于同一个Partition Group的多个分区有较大概率在同一个事务中被修改。为使同一个事务的修改尽量发生在同一个OBServer上,减少分布式事务发生的概率,RootService会将属于同一个Partition Group的分区尽量调度到同一个OBServer上去。

image.png

上图是不同事务类型的持久化日志与事务提交。多机分布式事务有2台及以上server,分为两阶段提交多条日志,采用参与者即协调者的优化和协调者无状态设计。


单机多分区事务有1server,一阶段可以提交多条日志,但仍走分布式事务的流程,二阶段提交优化为一阶段提交。


PG事务有1server,支持单pg提交一条日志,事务提交由原来的一阶段提交优化成单PG提交。

image.png

在分区副本均衡的基础之上,OceanBase数据库还实现了Leader维度的均衡。用户可通过租户级的配置使租户下分区Leader分布在指定的Zone上。与此同时,Leader均衡仍然以均衡组为基本均衡单元,旨在将一个均衡组的所有分区的Leader平均调度到该均衡组。

 

四、OceanBase外置负载均衡能力设计

image.png

如上图所示,一共有三个可用区Zone1Zone2Zone3。每个可用区部署2OBServer,其中一个包括12Partition的均衡组。


PrimaryZone:Zone1,全部12PartitionLeader都分布在Zone1上,Zone1的每个OBServer上各有6Leader


PrimaryZone:Zone1Zone2,全部12PartitionLeader平均分布到Zone1Zone2上,每个OBServer上各有3Leader

image.png

从图中可知,全部12PartitionLeader平均分布到Zone1Zone2Zone3上,每个OBServer上各有2Leader

image.png

上图是负载均衡的相关参数。

其中,alter system enable_auto_leader_switch=true,代表是否允许rs自动切主。


data_copy_concurrency;server_data_copy_out_concurrency;server_data_copy_in_concurrency控制负载均衡时Partition 迁移的速度和影响。

image.png

由于OB内部的负载均衡能力,无法顾及业务热点,OBServer超卖和混合部署。所以为了解决这个问题,出现了外置负载均衡能力,具体架构如上图所示。

 

五、从应用架构看负载均衡

image.png

综上所述,应用架构负载均衡具备以下优势:高效导入、高吞吐、低延迟。除此之外,一份数据支持多种访问接口,适配蚂蚁容灾架构——读写分离。

image.png

在存储混部方面,SSD OB ServerSATAOB Server部署在同一个Zone

外置均衡方面,结合指标+规则,产出均衡计划。在线表移动到SSD,支持高速读写。历史表移动到SATA,实现海量数据存档。

 

六、用户问答


问:CPU不均衡调度,内存均衡调动回去,会不会一直陷入死循环?

答:内存跟着unit走,内存主要用于分配。在迁unit时,OB会判断目标内存是否不足。假设把ZONE_2的黄色资源单元,迁到ZONE_2的第三台机器,这其实是不可行的。当这三个资源单元加起来,CPU会超过目标端。迁移时会考虑目标端的CPU配置、内存配置以及存储的空间配置。

 

问:热点调度需要要外部干预吗?

答:是的。目前,调度主要实现Partition的数字、数量的相对均衡。暂时无法考虑到每个partition的实际请求。

 

问:Root Service是通过选举产生的吗?

答:是的。Root Service具备高可用的能力。如果Leader副本所在的机器挂了,它会漂移到另外的机器上面去的。

 

问:Table groupPartition group有什么区别?

答:Table group是一个集合定义,在建某个表时,需要指定Table group,才能知道哪几张表属于一个Table groupPartition group会出现很多分区,Partition group会统一进行调度。

 

问:热点问题有考虑OB自动做调度吗?

答:阿里有很多产品,具备自动均衡能力。未来,会考虑OB自动调度。目前,工作人员会做一个系统,解决相关问题。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
7月前
|
SQL 数据库 Docker
OBCP实践 - OceanBase Docker 体验
开发者和技术爱好者可以在无需复杂安装配置的情况下迅速搭建OceanBase数据库环境,从而方便地进行功能测试、性能评估或者开发调试等实践活动。同时,由于Docker的便捷性,此方法也支持跨平台部署,使得OceanBase数据库能够在不同的操作系统(如Linux、Windows、macOS)上轻松体验。
310 2
|
7月前
|
SQL Java Shell
OBCP实践 - OceanBase 执行计划
在OceanBase数据库管理系统中,执行计划(Execution Plan)是数据库优化器基于SQL查询语句生成的一种逻辑表示,它详细说明了数据库如何执行SQL查询,包括选择合适的索引、连接顺序、临时数据处理方式、排序算法等一系列操作步骤,最终目的是为了最有效地获取所需数据并返回给客户端。
171 0
|
3月前
|
负载均衡 网络协议 Unix
Nginx负载均衡与故障转移实践
Nginx通过ngx_http_upstream_module模块实现负载均衡与故障转移,适用于多服务器环境。利用`upstream`与`server`指令定义后端服务器组,通过`proxy_pass`将请求代理至这些服务器,实现请求分发。Nginx还提供了多种负载均衡策略,如轮询、权重分配、IP哈希等,并支持自定义故障转移逻辑,确保系统稳定性和高可用性。示例配置展示了如何定义负载均衡设备及状态,并应用到具体server配置中。
|
4月前
|
消息中间件 负载均衡 Kafka
Kafka 实现负载均衡与故障转移:深入分析 Kafka 的架构特点与实践
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理和流传输设计的高性能消息系统。其核心设计注重高吞吐量、低延迟与可扩展性,并具备出色的容错能力。Kafka采用分布式日志概念,通过数据分区及副本机制确保数据可靠性和持久性。系统包含Producer(消息生产者)、Consumer(消息消费者)和Broker(消息服务器)三大组件。Kafka利用独特的分区机制实现负载均衡,每个Topic可以被划分为多个分区,每个分区可以被复制到多个Broker上,确保数据的高可用性和可靠性。
116 2
|
5月前
|
缓存 负载均衡 算法
(四)网络编程之请求分发篇:负载均衡静态调度算法、平滑轮询加权、一致性哈希、最小活跃数算法实践!
先如今所有的技术栈中,只要一谈关于高可用、高并发处理相关的实现,必然会牵扯到集群这个话题,也就是部署多台服务器共同对外提供服务,从而做到提升系统吞吐量,优化系统的整体性能以及稳定性等目的。
|
7月前
|
负载均衡 算法
SpringCloud&Ribbon负载均衡原理与实践
SpringCloud&Ribbon负载均衡原理与实践
90 3
|
7月前
|
负载均衡 关系型数据库 分布式数据库
【PolarDB开源】PolarDB读写分离实践:优化读取性能与负载均衡策略
【5月更文挑战第26天】PolarDB是云原生关系型数据库,通过读写分离优化性能和扩展性。它设置主节点处理写操作,从节点处理读操作,异步复制保证数据一致性。优化读取性能的策略包括增加从节点数量、使用只读实例和智能分配读请求。负载均衡策略涉及基于权重、连接数和地理位置的分配。实践示例中,电商网站通过主从架构、只读实例和负载均衡策略提升商品查询效率。PolarDB的读写分离与负载均衡为企业应对大数据和高并发提供了有效解决方案。
261 0
|
7月前
|
SQL 关系型数据库 MySQL
OBCP实践 - 迁移 MySQL 数据到 OceanBase 集群
OBCP实践 - 迁移MySQL数据到OceanBase集群,这是一个涉及到将现有MySQL数据库的数据和表结构迁移到OceanBase分布式数据库集群的实际操作过程。OceanBase是一款高度兼容MySQL协议的分布式数据库产品,支持在线平滑迁移,以便企业用户可以从传统的MySQL数据库平滑迁移到OceanBase,以实现更高的可用性、扩展性和性能。
136 0
|
7月前
|
运维 安全 网络安全
OBCP实践 - 手动部署 OceanBase 集群
手动部署OceanBase集群是一项专业且细致的工作,需要深入理解OceanBase的架构原理和部署流程,同时也需具备丰富的数据库管理和运维经验。对于初次接触OceanBase的用户,建议先从简单的单节点或通过Docker部署开始体验,然后再逐步过渡到复杂集群环境的部署和运维。
133 0
|
7月前
|
负载均衡 应用服务中间件 nginx
【实践】使用Nginx作为GrayLog日志接入的负载均衡
【实践】使用Nginx作为GrayLog日志接入的负载均衡
164 0