KaiwuDB 分布式存储的负载均衡

导读

KaiwuDB 是浪潮开源的 NewSQL 分布式数据库,拥有强一致、高可用的分布式架构。在高负载的情况下,分布式数据库能够将负载压力平衡到不同的物理机节点上,充分利用不同节点的资源。本文将介绍 KaiwuDB 在面对高负载存储过程中采用的负载均衡策略。

负载均衡
作为分布式数据库,为了更有效利用不同物理机节点的资源, 避免服务器性能的浪费,在数据库高负载的情况下需要尽量将压力平衡到各个物理机节点上。这也是分布式数据库的研究重点之一。

KaiwuDB 在存储上采用三副本策略,即每份数据默认同时存在三个节点中,每个副本为一个 Replica。数据库在进行读写时,其中一份副本会获得一定时间内的租约,成为 lease,该 lease 的节点即为该 range 的 leaseholder。系统的读写都是通过 leaseholder 进行的,leaseholder 会将对该副本的读写同步到其他的 Replica。

KaiwuDB 在启动时会创建 StoreReblancer,用于自适应的对副本进行均衡。KaiwuDB 通过对 Replica 以及 lease 进行迁移以平衡数据库的压力负载。StoreReblancer 会以 10 秒的周期反复执行,如果存储的压力超过阈值,则会循环对每个 range 分两个部分进行平衡,包括租约平衡和副本平衡。

image.png

图 1-1 负载均衡基本流程图

租约平衡
KaiwuDB 会维护当前节点存储的副本,其中的 lease 会维护该副本的 QPS(每秒查询率),并按照 QPS 降序进行排序。压力不够阈值的 range,不进行平衡。StoreReblancer 会循环遍历一个 range 的多个副本,排除本地的,排除压力不符合阈值的,排除不正常的,排除 zone 限制的副本,选择剩下的副本转移租约。租期的选举和迁移不涉及到 replica 的复制和传输。

对于需要迁移的 range 来说,StoreReblancer 对其租约迁移的副本选取规则如下:

  1. 非本地副本。
  2. 当前 store 拥有的租期是合法的。
  3. 判断租期转移后本地 range 的 QPS 可以转到阈值以内。
  4. 待迁移的 replica 的 raftStatus 领先于候选的 replica 的 raftStatus
  5. 满足 zone(分区信息)的约束条件 。一些表可能会带有租期的限制条件,规定了该数据表的副本所在的结点,以及租期所在的结点。对于固定了租期的数据表,StoreReblancer 不会迁移其 range 的租期。

Lease 选取的基本流程如图 1-2 所示:

image.png

图1-2 待选取 lease 流程

如果当它的 QPS 大于当前的阈值范围,数据库会将其租约转移到该存储该副本的其他节点上。因为数据库是直接对 leaseholder 进行读写,并由 leaseholder 同步到其他副本,故当节点负载过大时,只要将较大读写负载的副本租约转换到其他节点,就可以把该部分的压力均衡出去。

副本平衡
如果保存某副本的三台节点压力负载都不符合 lease 的迁出条件时,数据库会选择将该副本同步到三副本以外的节点,然后将 lease 迁出,以动态平衡压力。系统会对需要平衡的 range 进行筛选,对于压力没有达到阈值的 range 或迁移后对该 store 的 QPS 影响较小时,则不会进行平衡操作。

系统首先设定目标 store 数量,通常等于 range 的副本数。循环一个 range 的多个副本,排除本地副本后,如果副本所在的 store 压力符合阈值,或者不存在,将该 store 放入目标数组。

如果目标数组的目标数量不足,则继续从其他所有 store 中选择,直到符合目标数量。选择 Store 目标数组的过程需要符合 zone(分区)限制,容量限制,压力阈值限制,并排序。如果还是不足,则放弃平衡。同时,副本的迁移应该满足多样性的限制,多样性指副本所在的多级分区的分散程度,副本所在的多级分区越分散,多样性分值越高。在选择目标 store 时,需要将新的多样性分值同原来的多样性分值进行比较,如果不如以前,则放弃平衡。

KaiwuDB 会循环目标数组,计算新的租约和压力值,然后选择目标数组进行副本迁移。迁移过程首先用 batch 命令,副本收到命令,并发送快照。

热数据分裂
如果同时对某副本的数据进行大量的读写,压力负载是由于该副本引起时,单纯的迁移 lease 或者 replica 都无法较好的调节该情况。该部分功能由 splitQueue 进行管理。KaiwuDB 会选择对热点数据的 range 进行分裂,从而把压力从单个 range 上分开,该步骤会导致创建新的 replica,从而分散了压力和流量。创建新的 replica 之后的均衡仍由 store-reblancer 进行。数据库会在 range 分裂后再进行 reblance。当压力降低后,系统会自动进行 range 的合并。

总结
以上就是 KaiwuDB 在处理高负载存储时采用的负载均衡策略,通过租约平衡、副本平衡与热数据分裂三种不同维度的均衡策略,避免了单个节点在高负载情况下出现性能瓶颈,提升了数据库系统的读写性能。

KaiwuDB 是浪潮控股的数据库企业,公司汇聚了全球顶尖的数据库人才,以 AIoT 数据库为核心产品,面向工...

12 声望
1 粉丝
0 条评论
推荐阅读
4月26日-30日,KaiwuDB 在数字中国等你!
2023年4月26日-30日(下周三至周日),作为我国数字中国建设最新成果展示平台、汇聚全球力量助推数字中国建设的合作平台,第六届数字中国建设峰会(数字中国)将以“加快数字中国建设,推进中国式现代化”为主题于...

KaiwuDB阅读 168

封面图
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
又一款内存数据库横空出世,比 Redis 更强,性能直接飙升一倍!杀疯了
KeyDB是Redis的高性能分支,专注于多线程,内存效率和高吞吐量。除了多线程之外,KeyDB还具有仅在Redis Enterprise中可用的功能,例如Active Replication,FLASH存储支持以及一些根本不可用的功能,例如直接备份...

民工哥4阅读 1.6k评论 2

封面图
面试官:请说一下如何优化结构体的性能?
使用内存对齐机制优化结构体性能,妙啊!前言之前分享过2篇结构体文章:10秒改struct性能直接提升15%,产品姐姐都夸我好棒 和 Go语言空结构体这3种妙用,你知道吗? 得到了大家的好评。这篇继续分享进阶内容:结...

王中阳Go4阅读 3.7k评论 2

封面图
Vue+Express+Mysql全栈项目之增删改查、分页排序导出表格功能
本文记录一下实现一个全栈项目,前端使用vue框架、后端使用express框架、数据库使用mysql。此项目的意义不仅仅有助于我们复习nodejs相关知识、更有助于带前端新人,使其快速从整体全局角度中,理解常规后台管理系...

水冗水孚4阅读 2.6k

MySQL百万数据深度分页优化思路分析
一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看,最常见的一种就是根据日期进行筛选。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万...

一个程序员的成长7阅读 862

封面图
深入理解MySQL索引底层数据结构
在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没...

京东云开发者3阅读 569

封面图

KaiwuDB 是浪潮控股的数据库企业,公司汇聚了全球顶尖的数据库人才,以 AIoT 数据库为核心产品,面向工...

12 声望
1 粉丝
宣传栏