博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HAProxy的独门武器:ebtree[转]
阅读量:6162 次
发布时间:2019-06-21

本文共 1088 字,大约阅读时间需要 3 分钟。

hot3.png

1. HAProxy和ebtree简介

HAProxy是法国人Willy Tarreau个人开发的一个开源软件,目标是应对客户端10000以上的同时连接,为后端应用服务器、数据库服务器提供高性能的负载均衡服务。

在底层数据结构方面,旧版本HAProxy曾经使用过红黑树,用于任务调度、负载均衡等方面。但是Willy Tarreau认为,在事件响应非常频繁的情况下,任务插入、删除的频率非常高,这时候使用红黑树存在性能瓶颈,尤其不能接受红黑树删除节点的时间复杂度为O(log n)。因此,他发明了一种新的数据结构,叫做弹性二叉树(elastic binary tree),简称ebtree。
目前新版本的HAProxy(本文编写时最新版本为1.4.23)已使用ebtree,而除了HAProxy之外,还没有其它著名的开源软件使用ebtree。可以这么说,HAProxy最有特色的地方就是ebtree,ebtree名符其实是HAProxy的独门武器。
ebtree是不平衡的二叉搜索树(BST),而红黑树、AVL树等都是平衡的BST。传统的BST最怕的就是退化成线性搜索,因此,红黑树等BST插入、删除时都需要对树进行平衡化,而平衡化是一个从叶子节点开始,向根节点方向递归向上的过程,时间复杂度是O(log n)。
有鉴于此,ebtree为了实现删除节点时O(1)的时间复杂度,必然放弃保持树的平衡,为了拒绝由此而来的副作用——退化成线性搜索(或者更准确地说,退化成不受限制的线性搜索),不可避免地引入了一些新的成员和新的思路,且待我慢慢道来。

2. ebtree节点的组成

一个ebtree的节点(以下简称ebnode)分为node部分和leaf部分(Willy Tarreau是这样描述的,但我觉得称为树干部分和叶子部分更合适一些,以下就按我的理解来叙述)。树干负责关联其它ebnode,由父指针(node_p)和分支(Willy Tarreau称之为root,包括左分支L和右分支R),以及一个控制树的高度的特殊成员(bit)组成,叶子负责携带数据(data,一般是数据的键值,所以下文都称为key),另外包含一个指向上层的指针(leaf_p)。

一棵ebtree只有一个根节点(root),包含两个左右分支的指针(L、R)。所有的ebnode总是挂在根节点的左分支下面,根节点的右分支总是为空。在ebtree的遍历过程中,判断当前节点是否根节点就是判断其右指针是否为空。

 

转载于:https://my.oschina.net/qiangzigege/blog/684559

你可能感兴趣的文章
Android知识点复习(一)-Android系统架构
查看>>
calc(~,mac电脑set-cookies要域名和请求域名相同
查看>>
小葵花妈妈课堂开课了:《Handler Looper Message 浅析》
查看>>
浏览器和node的eventLoop的区别
查看>>
Android-动画-view 动画笔记
查看>>
爬虫调用百度翻译API
查看>>
80%的前端程序员都遇到的问题,你中招了吗?
查看>>
slider轮播插件的多种写法
查看>>
小米6.0以上系统怎么无需root激活Xposed框架的步骤
查看>>
【Spring】HttpMessageConverter的作用及替换
查看>>
android 关于 textview首行缩进 显示图片、文字问题
查看>>
YTKNetwork使用application json方式传递参数
查看>>
HTML5 小动画例子
查看>>
温故之.NET 任务并行
查看>>
React怎样从函数中辨别类
查看>>
js中split之正则运用(模式匹配)
查看>>
Nuxt使用cookies踩坑之设置axios的header
查看>>
UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews
查看>>
二维码编解码 Java调用示例代码
查看>>
vue canvas动效组件插件库制作
查看>>