负载均衡
负载均衡即通过路由算法(通常是集群环境),合理的分摊服务器压力,达到服务器性能的最大优化。
DolphinScheduler-Worker负载均衡算法
DolphinScheduler-Master分配任务至worker,默认提供了三种算法:
加权随机(random)
平滑轮询(roundrobin)
线性负载(lowerweight)
默认配置为线性加权负载。
由于路由是在客户端做的,即master服务,因此你可以更改master.properties 中的master.host.selector来配置你所想要的算法。
eg:master.host.selector=random(不区分大小写)
Worker 负载均衡配置
配置文件 worker.properties
权重
上述所有的负载算法都是基于权重来进行加权分配的,权重影响分流结果。你可以在 修改worker.weight的值来给不同的机器设置不同的权重。
预热
考虑到JIT优化,我们会让worker在启动后低功率的运行一段时间,使其逐渐达到最佳状态,这段过程我们称之为预热。感兴趣的同学可以去阅读JIT相关的文章。
因此worker在启动后,他的权重会随着时间逐渐达到最大(默认十分钟,我们没有提供配置项,如果需要,你可以修改并提交相关的PR)。
负载均衡算法细述
随机(加权)
该算法比较简单,即在符合的worker中随机选取一台(权重会影响他的比重)。
平滑轮询(加权)
加权轮询算法一个明显的缺陷。即在某些特殊的权重下,加权轮询调度会生成不均匀的实例序列,这种不平滑的负载可能会使某些实例出现瞬时高负载的现象,导致系统存在宕机的风险。为了解决这个调度缺陷,我们提供了平滑加权轮询算法。
每台worker都有两个权重,即weight(预热完成后保持不变),current_weight(动态变化),每次路由。都会遍历所有的worker,使其current_weight+weight,同时累加所有worker的weight,计为total_weight,然后挑选current_weight最大的作为本次执行任务的worker,于此同时,将这台worker的current_weight-total_weight。
线性加权(默认算法)
该算法每隔一段时间会向注册中心上报自己的负载信息。我们主要根据两个信息来进行判断
- load平均值(默认是CPU核数*2)
- 可用物理内存 (默认是0.3,单位是G)
如果两者任何一个低于配置项,那么这台worker将不参与负载。(即不分配流量)
你可以在worker.properties修改下面的属性来自定义配置
worker.max.cpuload.avg= -1(only less than cpu avg load, worker server can work. default value -1: the number of cpu cores * 2 )
worker.reserved.memory=0.3(only larger than reserved memory, worker server can work. default value : physical memory * 1/6, unit is G. )