• HAProxy基础原理介绍


    HAProxy的功能概述

        反向代理

            1. mode http,https: 七层反向代理(仅支持http,https七层协议)

            2. mode  tcp:         (伪)四层反向代理

        调度器

           四层调度和七层调度的区别

             1.四层调度服务器仅仅起到的是管道的作用,tcp连接是客户端和真实的后端服务器之间来建立的,调度器只起到一个转发作用(不受套接字数量限制)

             2.七层调度表示调度服务器既要充当客户端的服务器(和客户端建立完整连接)又要充当后端服务器的客户端,向后端服务器发送建立连接请求

       各种调度算法介绍balance

           1.roundrobin  加权轮询  (适合短连接)

              根据后端服务器的权重额度,生成对应的主机对象个数 存放到一个数组中  然后轮询这个数组  比如 有两台后端服务器(node1,node2)权重为2:1

              总权重就为2+1=3  生成的轮询数组为  [node1,node1,node2]  然后直接轮询此数组即可实现加权轮询

              动态轮询:支持服务器数量的总权重动态改变  支持慢启动     支持最大的节点数是4095 

           2.static-rr 静态轮询

              静态轮询:修改权重和后台节点数量后 必须重启服务才能生效    不支持慢启动    无节点数量限制

           3.leastconn 加权最少连接数  (适合长连接)

             把当前任务调度到后台主机连接数是最少的上面

           4.frist 先到先得

              第一个服务器的并发连接数满额了后才会往第二台主机上调度 串行调度 设置权重无效

           5.source 源地址hash 

              将同一个IP发送的所有请求发往同一个后台服务器进行处理   

              实现方式:

                  1.把每个IP和第一次调度处理的后台服务器的对应关系映射成hash表存放在内存中

                  2.map-based:  静态数组取模法   除权取余数法  哈希数据结构是一个静态的数组

                  3.consistent:   一致性hash算法   一致性哈希  哈希数据结构是一个树

              问题:

                  1.将大量的SNAT的主机识别成一个IP

                  2.后端服务器宕机

              把所有的session存放在一台单独的redis服务器中 

          6.uri算法

              不管客户端只要访问的是同一个URL,就始终发给后端同一个缓存服务器 提高缓存利用率

          7.uri_param算法

             www.a.com/index;username=jack 对 jack字符串进行hash计算然后调度到某个服务器,以后只要是jack发起的请求都会被调度到同一个服务器

         8.hdr(<name>) 算法

             对于每个http请求,取出指定的http首部的值做hash计算,然后相同的http首部的值被调度到同一个后端服务器

             

    HAProxy的安装

           已经被集成到base仓库,直接使用yum install haproxy即可

    HAProxy配置文件说明

        分为两个配置段       global全局配置段和proxies代理配置段

        global

        proxies

            defaults 为fronted   backend     listen 提供默认配置

            fronted        前端配置      类似于 nginx   server {}

            backend      后端配置      类似于 nginx   upstream {}

            listen           同时拥有前端和后端

    HAproxy配置实例  

    前端配置  
    frontend main *:80
         mode http   
         #mode只能在frontend和listen中定义 标识此代理是七层还是四层代理
         #bind *:80
         default_backend     webserver
    
    
    后端配置
    backend webserver
        balance  roundrobin
        server   webserver1  172.20.127.177:80 check
        server   node2       172.20.127.178:80 check weight 3
    
    backend webserver
        balance  uri
        hash-type consistent
        server   webserver1  172.20.127.177:80 check
        server   node2       172.20.127.178:80 check weight 3
    
    backend webserver
        balance   hdr(User-Agent)
        hash-type consistent
        server   webserver1  172.20.127.177:80 check
        server   node2       172.20.127.178:80 check weight 3
    
    backend webserver
        balance roundrobin
        cookie WEBSRCOOKIE insert nocache indirect
        server   webserver1  172.20.127.177:80 check cookie ck1
        server   node2       172.20.127.178:80 check cookie ck2
    
    
    #七层状态检测后端服务器
    backend webserver
        balance roundrobin
        option httpchk GET /test11.html
        server   webserver1  172.20.127.177:80 check 
        server   node2       172.20.127.178:80 check 
    
    #四层代理
    listen ssh
       bind :2222
       mode tcp
       balance leastconn
       server srv1 172.20.127.177:22 check
       server srv2 172.20.127.178:22 check
    
     ssh 172.20.127.175 -p 2222
    
    errorfile   文件路径
    errorloc    url
    
    #操作http请求头和响应头
    #响应头
    frontend main *:80
         mode http
         default_backend     webserver
         stats   enable
         rspidel ^Server:.*
         rspadd  laozide: tianhuangwansui
    
    #请求头
    frontend main *:80
         mode http
         default_backend     webserver
         stats   enable
         reqdel ^Server:.*
         reqadd  laozide: tianhuangwansui
    
    ACL实现访问控制和动静分离
    访问控制
     frontend main *:80
         mode http
         default_backend     webserver
         acl mynet src 172.20.20.0/16
         http-request allow if mynet
         #http-request deny if mynet
         acl badip src 172.20.20.222
         block if badip
         errorfile  403 /etc/haproxy/errorfile
         errorloc  403 http://www.baidu.com
    
    
    
    动静分离
     url  > http://www.yxh.com:80/static/images/a.jpg
     path > /static/images/a.jpg(url去掉协议,主机名,端口)
     path_beg   /images/          以/images/开始
     path_end   .jpg .jpeg .png
     path_sub   images            包含images子字符串
     path_dir   jpegs             包含jpegs子目录
     path_dom   jd                包含jd子域名
    
     url示例 http://www.yxh.com:80/static/images/a.jpg
     url_beg
     url_end
     url_sub
     url_dir
     url_dom
    
     [root@localhost html]# find /usr/share -iname "*.jpg" -exec cp {} ./images ;
     frontend main *:80
         mode http
         default_backend     webserver
         stats   enable
         acl url_img path_beg /images
         acl url_img path_end .jpg .png .jpeg .gif
         use_backend imgsrvs if url_img
    
     backend imgsrvs
        balance roundrobin
        server imgsrv1 172.20.127.177:80 check
    
     backend webserver
        balance roundrobin
        server   webserver1  172.20.127.177:80 check 
        server   node2       172.20.127.178:80 check
    基础配置实例

    代理服务调试步骤

         从七层架构底层向上层一层一层分析
            1.  先检查服务器的链路层 查看远程主机是否在线
            2.  然后在服务器的网络层 ping 远程主机
            3.  查看远程主机的相关服务是否启动 相应端口是否处于监听

  • 相关阅读:
    第一题 (Map)利用Map,完成下面的功能:
    练习5 练习目标:继承、多态、方法的重写。
    练习4:用数组表示多重性
    练习3:修改withdraw 方法
    练习2 练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。
    练习1:创建一个简单的银行程序包
    2.建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),表示存入银行1
    总复习测试(二)
    总复习测试(一)
    新闻发布系统<分页>
  • 原文地址:https://www.cnblogs.com/yxh168/p/9286108.html
Copyright © 2020-2023  润新知