Haproxy企业级负载均衡

简介

   HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

  HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

 四层和七层负载均衡

OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流

四层(传输层,tcp udp) 七层(应用层)

四层负载均衡:NAT方式,DR方式

① 所谓四层就是基于IP+端口的负载均衡;七层就是基于URL等应用层信息的负载均衡;同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡。 换句换说,二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址;三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址;四层通过虚拟IP+端口接收请求,然后再分配到真实的服务器;七层通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器。 

② 所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决定怎么样转发流量。 比如四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。举个例子,如果你的Web服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。

③ 负载均衡器通常称为四层交换机或七层交换机。四层交换机主要分析IP层及TCP/UDP层,实现四层流量负载均衡。七层交换机除了支持四层负载均衡以外,还有分析应用层的信息,如HTTP协议URI或Cookie信息。

  1、负载均衡分为L4 switch(四层交换),即在OSI第4层工作,就是TCP层啦。此种Load Balance不理解应用协议(如HTTP/FTP/MySQL等等)。例子:LVS,F5。

  2、另一种叫做L7 switch(七层交换),OSI的最高层,应用层。此时,该Load Balancer能理解应用协议。例子:  haproxy,MySQL Proxy。

  注意:上面的很多Load Balancer既可以做四层交换,也可以做七层交换。

 

haproxy 安装与配置

安装步骤:

tar zxf haproxy-1.6.10.tar.gz && cd haproxy-1.6.10 && make TARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy

把安装包安装包下, files目录下面有haproxy的启动脚本,会放在/etc/init.d下面。(启动脚本需要修改:BIN=/usr/local/haproxy/sbin/$BASENAME)

mkdir  /etc/haproxy   把配置文件写入到这个文件里面。

 

配置文件信息:

[root@js-212 vhost]# cat /etc/haproxy/haproxy.cfg
global
    maxconn 100000
    chroot /usr/local/haproxy
    uid 99
    gid 99
    daemon
    nbproc 1
    pidfile /usr/local/haproxy/logs/haproxy.pid
    log 127.0.0.1 local3 info

defaults
    option  httplog
    maxconn 10000
    mode    http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

listen stats
    mode http
    bind 0.0.0.0:8777
    stats enable
    stats uri /haproxy-status
    stats auth haproxy:saltstack

frontend frontend_www_example_com
    bind *:10000                                  #这里可以用当前机器配置的VIP 做成高可用方式。(多个haproxy节点,需要在每个服务器上面都配置keepalived。)
    mode http
    option httplog
    log global
    use_backend backend_www_example_com

backend backend_www_example_com
    option httpchk HEAD / HTTP/1.0
option httpchk header X-REAL-IP #后端获取客户端真实IP 。后端tomcat的访问日志里面设置 %{X-REAL-IP}i
#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数 balance roundrobin server js-212 192.168.20.212:8081 check inter 2000 rise 30 fall 15 server openfire2 192.168.20.172:8081 check inter 2000 rise 30 fall 15

 

启动 :  /etc/init.d/haproxy start    #haproxy支持 reload

配置文件详解

Ha的主要配置块:
  HAProxy配置中分五大部分:     
      global:全局配置参数,进程级的,用来控制Haproxy启动前的一些进程及系统设置     
      defaults:配置一些默认的参数,可以被frontend,backend,listen段继承使用     
      frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理     
      backend:定义后端服务器集群,以及对后端服务器的一些权重、队列、连接数等选项的设置,我将其理解为Nginx中的upstream块     
      listen:我将其理解为frontend和backend的组合体

global   # 全局参数的设置
log 127.0.0.1 local0 info
# log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志
user haproxy
group haproxy
# 设置运行haproxy的用户和组,也可使用uid,gid关键字替代之
daemon
# 以守护进程的方式运行
nbproc 16
# 设置haproxy启动时的进程数,根据官方文档的解释,我将其理解为:该值的设置应该和服务器的CPU核心数一致,即常见的2颗8核心CPU的服务器,即共有16核心,则可以将其值设置为:<=16 ,创建多个进程数,可以减少每个进程的任务队列,但是过多的进程数也可能会导致进程的崩溃。这里我设置为16
maxconn 4096
# 定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
#ulimit -n 65536
# 设置最大打开的文件描述符数,在1.4的官方文档中提示,该值会自动计算,所以不建议进行设置
pidfile /var/run/haproxy.pid
# 定义haproxy的pid 
defaults # 默认部分的定义
mode http
# mode语法:mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OK
log 127.0.0.1 local3 err
# 使用127.0.0.1上的syslog服务的local3设备记录错误信息
retries 3
# 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
option httplog
# 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录“时间[Jan 5 13:23:46] 日志服务器[127.0.0.1] 实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很简单。
option redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
option abortonclose
# 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option dontlognull
# 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
option httpclose
# 这个参数我是这样理解的:使用该参数,每处理完一个request时,haproxy都会去检查http头中的Connection的值,如果该值不是close,haproxy将会将其删除,如果该值为空将会添加为:Connection: close。使每个客户端和服务器端在完成一次传输后都会主动关闭TCP连接。与该参数类似的另外一个参数是“option forceclose”,该参数的作用是强制关闭对外的服务通道,因为有的服务器端收到Connection: close时,也不会自动关闭TCP连接,如果客户端也不关闭,连接就会一直处于打开,直到超时。
contimeout 5000
# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容
clitimeout 3000
# 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容
srvtimeout 3000
# 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容

listen status # 定义一个名为status的部分
bind 0.0.0.0:1080
# 定义监听的套接字
mode http
# 定义为HTTP模式
log global
# 继承global中log的定义
stats refresh 30s
# stats是haproxy的一个统计页面的套接字,该参数设置统计页面的刷新间隔为30s
stats uri /admin?stats
# 设置统计页面的uri为/admin?stats
stats realm Private lands
# 设置统计页面认证时的提示内容
stats auth admin:password
# 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats hide-version
# 隐藏统计页面上的haproxy版本信息

frontend http_80_in # 定义一个名为http_80_in的前端部分
bind 0.0.0.0:80
# http_80_in定义前端部分监听的套接字
mode http
# 定义为HTTP模式
log global
# 继承global中log的定义
option forwardfor
# 启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP
acl static_down nbsrv(static_server) lt 1
# 定义一个名叫static_down的acl,当backend static_sever中存活机器数小于1时会被匹配到
acl php_web url_reg /*.php$
#acl php_web path_end .php
# 定义一个名叫php_web的acl,当请求的url末尾是以.php结尾的,将会被匹配到,上面两种写法任选其一
acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$
#acl static_web path_end .gif .png .jpg .css .js .jpeg
# 定义一个名叫static_web的acl,当请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif结尾的,将会被匹配到,上面两种写法任选其一
use_backend php_server if static_down
# 如果满足策略static_down时,就将请求交予backend php_server
use_backend php_server if php_web
# 如果满足策略php_web时,就将请求交予backend php_server
use_backend static_server if static_web
# 如果满足策略static_web时,就将请求交予backend static_server

backend php_server #定义一个名为php_server的后端部分
mode http
# 设置为http模式
balance source
# 设置haproxy的调度算法为源地址hash
cookie SERVERID
# 允许向cookie插入SERVERID,每台服务器的SERVERID可在下面使用cookie关键字定义
option httpchk GET /test/index.php
# 开启对后端服务器的健康检测,通过GET /test/index.php来判断后端服务器的健康情况
server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2
server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1
server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup
# server语法:server [:port] [param*] # 使用server关键字来设置后端服务器;为后端服务器所设置的内部名称[php_server_1],该名称将会呈现在日志或警报中、后端服务器的IP地址,支持端口映射[10.12.25.68:80]、指定该服务器的SERVERID为1[cookie 1]、接受健康监测[check]、监测的间隔时长,单位毫秒[inter 2000]、监测正常多少次后被认为后端服务器是可用的[rise 3]、监测失败多少次后被认为后端服务器是不可用的[fall 3]、分发的权重[weight 2]、最为备份用的后端服务器,当正常的服务器全部都宕机后,才会启用备份服务器[backup]

backend static_server
mode http
option httpchk GET /test/index.html
server static_server_1 10.12.25.83:80 cookie 3 check inter 2000 rise 3 fall 3
haproxy.cfg 配置文件详

 

socat:Unix套接字命令

Unix Socket commands

  socat是一个多功能的网络工具,名字来由是“Socket CAT”,可以看作是netcat的N倍加强版,socat的官方网站:http://www.dest-unreach.org/socat/ 。 

  socat是一个两个独立数据通道之间的双向数据传输的继电器。这些数据通道包含文件、管道、设备(终端或调制解调器等)、插座UnixIP4IP6 - rawUDPTCP)、SSLSOCKS4客户端或代理CONNECT。 

socat支持广播和多播、抽象Unix socketsLinux tun/tapGNU readlinePTY。它提供了分叉、记录和进程间通信的不同模式。多个选项可用于调整socat和其渠道,Socat可以作为TCP中继(一次性或守护进程),作为一个守护进程基于socksifier,作为一个shell Unix套接字接口,作为IP6的继电器,或面向TCP的程序重定向到一个串行线。 

socat的主要特点就是在两个数据流之间建立通道;且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等。

    使用socat可以查看和设置HAProxy状态,首先得让HAProxy产生出一个sock出来(hatop socat都是基于这个的,没这个什么都做不了)。

 

1、设置配置文件开启unix socket

global 下面 加一行:

stats socket /usr/local/haproxy/stats #路径和名字随意

然后重启服务就可以了。

 

2、安装socat

从官网下在socat最新版,有人说版本太高安装不上,我没有遇到问题。

[root@www~]# wget http://www.dest-unreach.org/socat/download/socat-1.7.2.4.tar.gz

[root@www~]# tar xf socat-1.7.2.4.tar.gz

[root@www~]# cd socat-1.7.2.4

[root@www~]# ./configure 

[root@www~]# make &&make install

 

3、socat使用

echo "help"| socat stdio /usr/local/haproxy/stats    #会有帮助提示

wKiom1PEx8Hz-D9DAAZVFUorDNs060.jpg 

echo "show info"| socat stdio /usr/local/haproxy/stats      #资源使用信息

wKioL1PEyBewRjEIAAIB-PuSfYk684.jpg

 

echo "show stat"| socat stdio /usr/local/haproxy/stats      #状态信息

wKioL1PEyGKg8ifFAApIOoJEn9M931.jpg

     熟悉使用方法后,完全可以使用socat,编写脚本,将HAProxy加到监控里边,实时运行监控状态情况。

wKioL1PEyLbBZcwAAAGuS6oOP54506.jpg

wKioL1PEyLfgk2hhAAC6qfX3fTk255.jpg

 

    以上仅是获取HAProxy信息,如果想通过socat进行设置HAProxy,权限还是不够的,需要修改配置文件,设置操作权限,修改HAProxy配置文件如下:

    stats socket/usr/local/haproxy/stats level admin          #将等级设置为管理

重启服务,然后就可以操作了。

例如禁用启用成员:

[root@www~]#echo "disable server web_cluters/iask51"|socat stdio/usr/local/haproxy/stats

wKiom1PHL46C_iIOAAQG-XrlHJg723.jpg

[root@www ~]# echo "enable serverweb_cluters/iask51"|socat stdio /usr/local/haproxy/stats

wKioL1PHMMyjeRvXAAQqnYDqh1Y678.jpg

[root@www ~]# echo "disable frontend http_80_in"|socat stdio /usr/local/haproxy/stats

wKiom1PHMA6Rh3_NAALvnNiQnJQ782.jpg

[root@www ~]# echo "enable frontend http_80_in"|socat stdio /usr/local/haproxy/stats

wKiom1PHMDWiWyhKAAL1FAvOGmg456.jpg

    disable与enable支持“agent”、“frontend”、“health”和“server”,命令要比图形界面强大的多,好多参数设定,都可以使用socat来操作。记住一个格式“命令  backend/server”,其它的命令用法自己研究吧。

 

posted @ 2017-06-13 10:38  Nice_keep-going  阅读(228)  评论(0)    收藏  举报