数据库集群系统负载均衡方法和数据库集群系统 技术领域 本发明涉及数据库集群系统, 尤其涉及数据库集群系统中的负载均衡方法和相应 的数据库集群系统, 属于信息技术领域。
背景技术 数据库集群系统是指将一组数据库服务器以集群的方式组合起来, 使用统一的接 口向用户提供服务。 数据库集群系统利用保存在多个数据库后端节点上的数据副本获得更 高的可用性 ; 并利用多个数据库后端节点提供单一数据库系统所无法提供的更强大的数据 管理能力和更高的查询响应效率。
数据库集群系统使用多种数据分布方式, 包括 : 全集冗余模式、 子集划分模式和子 集交叠模式。其中 : 全集冗余模式 ( 也称对等冗余模式 ) 是指, 多个后端节点中所保存的数 据完全相同 ; 子集划分模式是指, 多个后端节点各保存数据全集的一部分数据, 节点间没有 数据交叠 ; 子集交叠模式是指, 各结点各保存数据全集的一部分数据, 节点间有数据交叠。
为了获得更高可用性和响应效率, 集群系统大都采用全集冗余模式。
集群数据库系统在全集冗余模式下工作时, 由于各个数据库后端节点是等价的, 用户查询可仅由一个后端节点执行并应答即可。在这种场景下, 如何选取效率最高的节点 执行用户查询, 是决定整个集群系统应答效率的关键技术。目前普遍使用的数据库集群系 统负载均衡方法包括 :
(1) 随机选择法。在后端中随机选择一个节点来执行用户查询请求。
(2) 轮询法。轮流选取后端节点执行用户查询请求。
(3) 加权轮询法。 给不同的数据库节点赋予不同的权值, 权值大的节点被轮询到的 次数大于权值小的节点, 比如权值为 2 的节点被轮询到的次数是权值为 1 的节点的 2 倍。
然而, 上述负载均衡方法, 均没有考虑到不同计算机节点的差异性。 随机选择法总 是随机选择数据库节点完全不了解后端状态也完全没有可控性, 轮询法和加权轮询法在各 个后端数据库之间按顺序循环执行, 这虽然可以使每个后端都有任务, 但并不能做到各个 后端任务的最优分配。 发明内容
本发明的目的在于克服现有技术中存在的问题, 提供一种数据库集群系统中进行 动态负载均衡的方法和相应的数据库集群系统。 本发明通过对数据库后端节点的运行状态 进行测量, 实时获得后端节点的响应效率评价值, 从而选择效率评价值最高的后端节点进 行执行, 以避免后端节点的过热和故障, 从整体上提升数据库集群系统的运行效率。
本发明的数据库集群系统负载均衡方法包括下列步骤 :
a) 集群控制器采集各个数据库后端的各个设定指标的值, 组成决策矩阵 ;
b) 对决策矩阵进行归一化 ; 计算各个指标的权重向量 ; 并根据 vij = wjbij 计算带 权重的归一化矩阵, 其中 bij 表示归一化后的决策矩阵单元, wj 表示指标的权重向量, i 表示数据库后端序号, j 表示指标序号 ;
c) 分别计算各个数据库后端和负理想解之间的距离 di-, 以及和正理想解之间的 + 距离 di ;
d) 按 di--di+ 的差值由大到小对各个数据库后端进行排序, 集群控制器根据此序列 调用数据库后端。
各具体步骤的优选实现方式将在下面具体描述。
本发明提供的数据库集群系统包括一个集群控制器和一个或多个数据库后端节 点, 在数据库后端节点中保存完全相同的数据集合, 数据库后端节点是同构或异构的数据 库后端节点。
如图 1 所示, 集群控制器包含负载均衡决策组件、 后端检测组件、 用户请求分发组 件和负载信息表, 其中, 负载均衡决策组件用于执行负载均衡决策过程 ; 后端检测组件用于 执行后端负载检测过程 ; 负载信息表用于保存后端负载检测过程所得出的测量值 ; 用户请 求分发组件用于暂存用户请求、 发起后端负载检测过程、 发起负载均衡决策过程、 并将用户 请求发至决策结果确定的数据库后端节点执行。
数据库后端节点包含通信组件、 数据库服务器和负载测量组件, 其中, 通信组件用 于接收后端检测请求、 发起负载测量、 将负载测量值存入集群控制器中的负载信息表中, 并 接收集群控制器发来的用户请求, 将其发给数据库服务器执行, 将得到的结果集返回至集 群控制器 ; 数据库服务器用于接收通信组件发来的用户请求并作出应答 ; 负载测量组件用 于接收通信组件发来的负载测量请求并作出应答。负载测量组件又进一步包含 : CPU 使用 率检测模块、 内存使用率检测模块、 磁盘已占用空间检测模块、 磁盘可用空间比例检测模 块、 磁盘 IO 延迟检测模块和网络延迟检测模块。
在上述数据库集群系统中, 当用户将数据库查询请求发送至集群控制器时, 集群 控制器中的用户请求分发组件负责将数据库查询请求暂存, 通过后端检测组件执行 1 次后 端负载检测过程, 通过负载均衡决策组件执行 1 次负载均衡决策过程, 用户请求分发组件 根据负载决策过程得出的结果将数据库查询请求转发至相应的数据库后端节点执行。
后端负载检测过程的执行流程为 : 后端检测组件向数据库后端发起后端检测请 求, 由数据库后端节点中的通信组件接受后端检测请求, 驱动负载测量组件进行负载测量, 负载测量完成后, 再由通信组件将获得的负载值返回至集群控制器, 并将测量值存储于负 载信息表中。其中, 负载测量的内容包括 : CPU 使用率、 内存使用率、 磁盘已占用空间、 磁盘 可用空间比例、 磁盘 IO 延迟和网络延迟。
负载均衡决策过程的执行流程为 :
(1) 如果数据库查询请求是写请求 (Insert, Update, Delete 操作 ), 决策结果为所 有数据库后端节点 ;
(2) 如果数据库查询请求是读请求 (Select 操作 ), 那么执行以下步骤 :
将负载信息表中的负载值构造为决策矩阵, 第 1 列至第 6 列分别对应为 : CPU 使用 率、 内存使用率、 磁盘可用空间比例、 磁盘已占用空间、 网络延迟、 磁盘 IO 延迟 ;
利用以下两个公式对决策矩阵进行归一化处理,
对于成本型指标使用如下公式计算
对效益型指标使用如下公式计算其中 Mj 是第 j 列最大值, mj 是第 j 列最小值, aij 为归一化前决策矩阵第 i 行第 j 列的值, bij 为归一化处理以后决策矩阵第 i 行第 j 列的值 ;
采用熵值法计算各个指标的权重, 形成权重向量, 使用如下公式将各指标值进行
归一化处理使用如下公式计算指标的熵值使用如下公式将熵值转化为权值
得到 W = [w1, w2, w3, w4, w5, w6], w1+w2+w3+w4+w5+w6 = 1 ;使 用 TOPSIS(Technique for Order Preference by Similarity to Ideal Solution) 方法对所有后端进行排序, 确定正理想解为 : v+ = {1, 1, 0, 0, 1, 1}, 确定负理想 解为 : v = {0, 0, 1, 1, 0, 0}, 使用下述公式计算决策矩阵中每一行和正理想解之间的距离 : j = 1, ..., m, 使用下述公式计算决策矩阵中每一行和负理想解之间的距离 :
j = 1, ..., m, 使用下述公式计算决策排序 :取 dj 值最大的数据库后端节点, 作为决策结果。
使用传统的随机均衡方法、 轮询均衡方法和加权轮询均衡方法等静态负载均衡方 法, 负载均衡结果与数据库后端节点的即时状态无关, 难以保证每次操作都发送至效率最 优的节点执行。这主要是出于两方面的原因 :
随着服务器的运行, 服务器的状态可能会发生变化, 性能也会随之改变, 而预设的 均衡策略无法侦测这种变化。
服务器接收到的任务量不一定相等。用户操作以事务为单元, 但每一个事务的工 作量存在差异。 若一个后端节点接受了一个超长的事务, 则只能将后续的事务延迟处理, 于 此同时, 其他后端节点可能因为接收到事务都是短事务, 而处于闲置状态。
可见, 相对于现有技术中的随机均衡方法、 轮询均衡方法和加权轮询均衡方法等 静态负载均衡方法, 使用本发明所述数据库集群系统动态负载均衡方法, 可以随时监测后 端节点的运行状态, 保证集群系统在每次处理用户请求时都选取效率最优的节点执行。附图说明
图 1 是本发明集群数据库系统的结构示意图。 图 2 是负载测量流程图。 图 3 是用户指令处理流程图。 图 4 是本发明实施例数据库集群系统结构示意图。 图 5 是多指标决策的一般步骤。具体实施方式
下面提供一具体实施例对本发明作进一步说明。
搭建如图 4 所示的异构数据库集群系统, 其中控制器节点和 3 个后端数据库节点 位于不同的主机之上。 在控制器节点主机配置数据库集群控制器提供发明所需的控制器节 点的功能。用户通过集群控制器提供的用户交互平台进行操作。本发明对集群控制器进行 了扩展, 加入以下三个组件 : 负载决策均衡组件、 后端检测组件和负载信息表。后端检测组 件以固定的时间间隔向各后端发起负载检测请求。 在三个后端上分别安装 SqlServer、 Ingres 和 PostgreSQL 数据库。分别在三个数 据库上建立表 loadstate 用来存储本节点的负载信息, 在 loadstate 表上建立触发器, 响应 插入指令。在触发器中调用外部动态链接库函数测量节点负载信息, 再把测得的负载信息 写入 loadstate 表中。该动态链接库可以通过多种方式生成。本例中用 C 代码编写动态链 接库文件。
下面给出一次负载均衡的完整步骤 :
如图 2 所示是一次负载检测的完整过程图。后端检测组件根据内部定时装置, 以 一定的时间间隔向各个后端发起周期性负载检测请求。当一次负载检测请求开始以后。
步骤① : 后端检测组件向通信组件发出负载检测请求。
步骤② : 通信组件将这一请求转发给负载测量组件。
步 骤 ③、 ④: 负 载 测 量 组 件 在 后 端 数 据 库 上 执 行 SQL 指 令 “INSERT INTO loadstateVALUES(id, 0, 0, 0, 0, 0, 0)” 。数据库建立在表 loadstate 上的触发器自动响应 该 INSERT 指令, 调用外部动态链接库函数取得计算机负载信息。再将实际的负载数据通过 UPDATE 指令写入 loadstate 表中。
步骤⑤、 ⑥: 负载信息通过通信组件回到位于控制器端的后端检测组件。
步骤⑦ : 当后端检测组件收集完毕所有 3 个后端的负载信息以后, 将此时形成的 3×6 的决策矩阵传递给负载决策组件。
步骤⑧ : 决策组件对决策矩阵的各列给出排序, 最后的结果放在负载信息表中。
此时一次负载检测过程结束。 这个负载信息表将会在下一次负载检测过程开始前 保持作用。下一次负载检测过程之后, 该负载信息表将会被更新。
如图 5 所示是负载决策组件内部根据决策矩阵形成各个后端排序的过程图。
在上述步骤⑦中, 三个后端采集到的负载决策矩阵为 :
7101841565 A CN 101841566后端 CPU 使用 率 (% ) SqlServer ingres PostgreSQL 4 53 26 内存使用 率 (% ) 93 83 92说明书磁盘剩余空 间 (Mb) 28462 20807 32625 网络延迟 (ms) 62 500 945/7 页磁盘 IO 延 迟 (ms) 63 218 78空闲磁盘 比率 (% ) 69 49 79
步骤 1, 规范化决策矩阵, 根据下列公式对决策矩阵进行归一化处理 :
成本型指标效益型指标
在本实施例所测的六个指标中, CPU 使用率、 内存使用率、 网络延迟和磁盘 IO 延迟 属于成本型指标, 数值越小越好。 空闲磁盘比例和剩余磁盘空间属于效益型指标, 数值越大 越好。归一化处理后的结果如下表所示 :后端 CPU 使用 率 1 0 0.5510 内存使用 率 0 1 0.1 空闲磁盘比 率 0.6667 0 1 磁盘剩余空 间 0.6477 0 1 网络延 迟 1 0 0.9269 磁盘 IO 延 迟 1 0 0.9032
SqlServer ingres PostgreSQL
后端步骤 2, 求权重向量 : 先对原决策矩阵按公式 归一化, 归一化之后的结果如下表所示 :CPU 使用 率 0.0482 0.6386 0.3133内存使用 率 0.3470 0.3097 0.3433空闲磁盘比 率 0.3503 0.2487 0.4010磁盘剩余空 间 0.3475 0.2541 0.3984网络延 迟 0.0945 0.7622 0.1433磁盘 IO 延 迟 0.1759 0.6072 0.2173SqlServer ingres PostgreSQL
步骤 3, 根据公式计算各个指标的熵值, 计算结果如下表所示:
CPU 使用率 0.7247内存使用率 0.9988空闲磁盘比率 0.9830磁盘剩余空间 0.9849网络延迟 0.6448磁盘 IO 延迟 0.8556
步骤 4, 根据公式计算各个指标的权重向量, 计算结果如下表所示 :CPU 使用率 0.3406
后端 SqlServer ingres PostgreSQL内存使用率 0.0014空闲磁盘比率 0.0210磁盘剩余空间 0.0186网络延迟 0.4396磁盘 IO 延迟 0.1787步骤 5, 根据 vij = wjbij 计算带权重的归一化矩阵, 计算结果如下表所示 :CPU 使用率 0.3406 0 0.1877 内存使用率 0 0.0014 1.4443 空闲磁盘比率 0.0140 0 0.0210 磁盘剩余空间 0.0120 0 0.0186 网络延迟 0.4396 0 0.4074 磁盘 IO 延迟 0.1787 0 0.1614
步骤 6, 按下列公式计算每一行分别到正负理想点的距离。
计算结果如下表所示 : di+ SqlServer ingres PostgreSQL 1.5568 1.9993 1.64769di0.5131 1.4142 1.步骤 7, 计算到负点距离和到正点距离的差 SqlServer ingres PostgreSQL -0.0438 -0.5850 -0.1817计算结果如下表所示 :离正点越近离负点越远的负载越小。 所以根据上面的数据得出各个后端负载的序 列如下 :
SqlServer PostgreSQL ingres 如图 3 所示为一个用户请求到来以后系统的响应流程。
当用户请求为写操作如 INSERT、 CREATE、 UPDATE 等语句, 用户请求发送到用户请 求分发组件以后, 该组件直接将请求发送给所有后端数据库。
当用户请求为读操作如 SELECT 语句时, 用户请求按如下流程被处理。
步骤 1, 用户请求首先传入用户请求分发组件, 分发组件识别该语句是读操作。
步骤 2, 用户请求分发组件从负载信息表中读出其中最新的负载的排列, 取出排在 最前面的后端信息 ( 负载最小的后端 )。
步骤 3, 用户请求分发组件将用户请求发送给该后端节点。