Druid.io每次增加历史节点,经过一段时间的balance,数据总会均衡,下面从代码分析一下原因。Druid版本为0.9.11
DruidCoordinatorBalancer.java
|
|
选择将要移动的segment—pickSegmentToMove()方法
所在类:
getRandomBalancerSegmentHolder
循环遍历serverList中的每一个server中的每一个segment,每个segment都是等概率的1/N,所以当前已有segment越多的server选中segment的概率会越大。
实现一个等概率的选择:
比如说一共有5个数,第2个选中的话,就需要第3、4、5选不中:
第i个:
选择将要移动到的server—findNewSegmentHomeBalancer()
所在类:
server的cost的计算方法
当前server已有的and将要加载的每个seg,与将要移动的seg的cost值之和。
两个seg的cost的计算方法
如果要提高查询速度,同一个查询查询的数据尽量分散在不同的server。而上述chooseBestServer中选择最佳server是选择cost最小的,即将要移动的seg移动到cost小的server。
druid 0.9.0
- recencyPenalty: 离得越近的时间,越可能在同一个查询中
- dataSourcePenalty: 同一个数据源的数据,越可能在同一个查询中
- gapPenalty: 重叠区域越多,越可能在同一个查询中
cost越大的因素:seg大小越大、七天内离现在越近、同一个数据源、两段seg的区间重叠或者间距越小。
cost越小的因素:seg大小越小、七天内离现在越远、非同一个数据源、两段seg的区间间距越大
同一个server符合cost越小,即数据段离得越远、不重叠且间距大、来自不同的数据源。
|
|
druid 0.9.1改进
https://github.com/druid-io/druid/pull/2972
|
|
具体函数:
两个seg的时间区间 :X = [x0=0, x1) and Y = [y0, y1)
|
|