zoukankan      html  css  js  c++  java
  • HA调度算法总结

    静态算法:

    按照事先定义好的规则轮训公平调度,不关心后端服务器的当前负载、链接数和响应速度等,并且无法实时修改权重,只能靠重启HA生效。
    
    服务器动态权重调整:

    yum install socat #socat是一个多功能的网络工具,在两个数据流之间建立通道,支持多协议和链接方式 IP TCP UDP IPv6 Socket等
    #echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock
    #echo "get weight web_host/web1" | socat stdio /var/lib/haproxy/haproxy.sock
    #echo "set weight web_host/web1 2" | socat stdio /ar/lib/haproxy/haproxy.sock
    #echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock

    static-rr:
    基于权重的轮训调度,不支持权重的运行时调整及后端服务器的慢启动,后端主机没有限制。
    
    first:
    根据服务器在列表中的位置,自上而下进行调度,但只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务器,因此会忽略服务器的权重设置。
    

    动态算法:

    基于后端服务器状态进行调度适当调整,如优先调度至当前负载较低的服务器,并且权重可以在haproxy运行时动态调整无需重启。
    
    roundrobin:
    基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs中的rr轮询模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数,)每个后端
    backend中最多支持4095个real server,roundrobin为默认调度算法,支持对real server权重动态调整。
    
    示例:

    后端服务器为> server web1 192.168.92.184:80 weight 1 check inter 3000 fall 2 rise 5
    获取当前权重> echo "get weight web_host/web1" | socat stdio /var/haproxy/haproxy.sock
    修改权重----> echo "set weight web_host/web1 3" | socat stdio /var/lib/haproxy/haproxy.sock

    leastconn
    加权最少连接,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度(新客户端连接),适合长连接的场景使用,mysql等。
    

    其他算法

    部分算法既可以作为静态算法,又可以通过选项称为动态算法。
    
    source:
    源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发到同一个后端web服务器,
    适用于session保持/缓存等场景
    源地址有两种转发客户端请求到后端服务器的服务器选取方式,去魔法和一致性hash
    
    map-base取模法
    基于服务器总权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,对后端服务器调度均衡,缺点:当服务器的总权重发生变化时(上线/下线),会因权重发生变化
    而导致结果整体改变。
    取模法:就是计算两个数相除之后的玉树,10%7=3,7%4=3,基于权重取模:(2^32-1)%(1+1+2)
    
    一致性hash:
    一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动.
    
    uri:
    基于对用户请求的uri做hash并将请求转发到后端指定服务器,也可以通过map-based和consistent定义使用取模法还是一致性hash。
    
    url_param:
    对用户请求的url中的params部分中的参数name作hash计算,并由服务器总权重相除以后派发至某服务器,常用语追踪用户,以确保来自同一个用的请求始终发往同一个real server
    

    示例:
    url = http://www.magege.com/foo/bar/index.php?k1=v1&k2=v2
    此时:

    host = "www.magege.com"
    url_param = "h1=v1&k2=v2"

    url_param取模法:

    listen web_host
    bind 192.168.92.10:80,:810-900,192.168.10.10:901-1000
    mode http
    log global
    balance url_param name,age #支持单个/多个url_param值hash
    server web1 192.168.10.12:80 weight 1 check inter 3000 fall 2 rise 5
    server web2 192.168.10.13:80 weight 1 check inter 3000 fall 2 rise 5

    url_param一致性hash:

    listen web_host
    bind 192.168.92.10:80,:810-900,192.168.10.10:901-1000
    mode http
    log global
    balance url_param name,age #支持单个/多个url_param值hash
    hash-type consistent
    server web1 192.168.10.12:80 weight 1 check inter 3000 fall 2 rise 5
    server web2 192.168.10.13:80 weight 1 check inter 3000 fall 2 rise 5

    hdr
    针对用户每个http头部(header)请求中的指定信息做hash,此处由name指定的http首部将会被取出并做hash计算,然后由服务器总权重相除以后派发至服务器,如值无效,则
    使用默认的轮询调度。
    

    hdr取模法

    listen web_host
    bind 192.168.92.10:80,:810-900,192.168.10.10:901-1000
    mode http
    log global
    balance hdr(User-Agent)
    hash-type consistent
    server web1 192.168.10.12:80 weight 1 check inter 3000 fall 2 rise 5
    server web2 192.168.10.13:80 weight 1 check inter 3000 fall 2 rise 5

    hdr一致性hash

    listen web_host
    bind 192.168.92.10:80,:810-900,192.168.10.10:901-1000
    mode http
    log global
    balance hdr(User-Agent)
    hash-type consistent
    server web1 192.168.10.12:80 weight 1 check inter 3000 fall 2 rise 5
    server web2 192.168.10.13:80 weight 1 check inter 3000 fall 2 rise 5

    对远程windows桌面的负载,使cookie保持会话
    

    rdp-cookie取模法

    listen RDP
    bind 192.168.92.10:3389
    mode tcp
    balance rdp-cookie
    hash-type tcp
    server web1 192.168.10.12:3389 weight 1 check inter 3000 fall 2 rise 5
    server web2 192.168.10.13:3389 weight 1 check inter 3000 fall 2 rise 5

    rdp-cookie一致性hash

    listen web_host
    bind 192.168.92.10:3389
    mode tcp
    balance rdp-cookie
    hash-type consistent
    server web1 192.168.10.12:3389 weight 1 check inter 3000 fall 2 rise 5
    server web2 192.168.10.13:3389 weight 1 check inter 3000 fall 2 rise 5

    random:
    1.9版本增加的一个算法,基于一个随机数作为一致性hash的key,随机负载平衡对于大型服务器场景或经常添加/删除服务器非常有用,它可以避免
    在这种情况下由roundrobbin或leastconn导致的锤击效应。
    

    总结

    static-rr-------------------------->tcp/http-------------->静态
    first------------------------------>tcp/http-------------->静态

    roundrobin------------------------->tcp/http----------->动态
    leastconn-------------------------->tcp/http------------>动态
    random----------------------------->tcp/http----------->动态

    source----------------------------->tcp/http------------>
    uri-------------------------------->http------------------>
    url_param-------------------------->http---------------->这几个取决于hash_tyep是否consistent
    hdr-------------------------------->http----------------->
    rdp-cookie------------------------->tcp----------------->

    使用场景

    first #使用较少
    static-rr #做了session共享的web集群
    roundrobin
    random

    leastconn #数据库
    source #基于客户端公网IP的会话保持

    uri #http #缓存服务器、CDN
    url_param #http

    hdr #基于客户端请求报文头部做下一步处理
    rdp-cookie #很少使用

  • 相关阅读:
    深入MVC模式概念
    Asp.NET MVC and Asp.NET WebForms Features
    JavaScript实现简单进度条
    数据分页技术(学习笔记)
    sql行列转换<转>
    全自动静态网页生成器(三)——发布第一个可用版本
    ASP.NET AJAX进度条
    不能远程访问Win7系统上的Sql 2005数据库
    水印及缩略图的C#实现
    无任何网络提供程序接受指定的网络路径解决方法
  • 原文地址:https://www.cnblogs.com/sqbk/p/14501342.html
Copyright © 2011-2022 走看看