于一 发表于 2019-1-1 11:07:44

HAProxy 基础入门

Haproxy 基础入门
  ===============================================================================
  概述:
  本章将介绍Linux中的一种代理服务HAProxy,具体内容如下:

[*]  haproxy的功能介绍,以及安装、程序环境和配置文件;
[*]  搭建基于haproxy负载均衡后端web server
[*]  haproxy 的全局配置参数;
   ·进程及安全配置相关的参数
   ·性能调整相关的参数:
   ·调试相关的参数
   ·定义用户、组及用户列表
[*]  haproxy 的自定义配置参数段,包括:
   ·bind设定监听的地址和端口;
   ·mode定义haproxy的工作模型:
   ·balance调度算法
   ·启动内建统计页面
  ===============================================================================
  
HAProxy:
1.LB CLuster均衡集群工作的协议层分类

★LB CLuster:
⊙传输层(四层):

[*]lvs:Linux Virtual Server,内核(netfilter, INPUT);
[*]nginx (stream):
[*]HAProxy:mode tcp

⊙应用层(七层):(根据自定义的请求模型分类完成分发)

[*]http:nginx(http模块), haproxy(mode http模块), httpd, ats, ...
注意:

[*]haproxy同nginx 一样,是工作在用户空间(应用层)的应用程序,负载均衡能力同样受限于 套接字(端口)的数量限制,最大并发数量不能够大于65535;
[*]lvs 是工作在内核空间的,只是作为了一个报文转发的角色,不受限于端口的数量,所以会有人说,lvs优化之后可以承载四百万个并发;

   2.HAProxy介绍

         ---单一进程模型,事件驱动,弹性二叉树;

★功能介绍

[*]HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理;
[*]HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
[*]HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。
[*]HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。
★文档位置

[*]http://cbonte.github.io/haproxy-dconv/
★版本(Version)


[*]1.4, 1.5, 1.6, 1.7-dev

3.haproxy的安装、程序环境及配置文件

★安装

[*]# yum install haproxy -y
★程序环境:

[*]配置文件: /etc/haproxy/haproxy.cfg
[*]Unit File: haproxy.service
[*]主程序:    /usr/sbin/haproxy
★配置文件:
⊙global:全局配置段

[*]进程及安全配置相关的参数
[*]性能调整相关的参数
[*]Debug相关的参数
⊙proxies:代理配置段

[*]defaults:为frontend, backend以及listen提供默认配置;
[*]frontend:前端,相当于Nginx中的server{ ... };
[*]backend:后端,相当于nginx中的upstream { ...};
[*]listen:前后端的直接组合;



实验:搭建基于haproxy负载均衡后端web server

  -------------------------------------------------------------------------------
  实验拓扑图
http://s5.运维网.com/wyfs02/M00/8A/74/wKioL1gxdZfDJTNsAACUeSAr5jI283.png
  实验环境描述:


[*]  三台虚拟主机,一台作为haproxy的反代服务器,另外两台作为后端原始Web服务器RS1和RS2;
[*]  真实工作中的环境应该是:hapoxy作为反代服务器,一手托两家,即要接收来自外网的的客户端请求,又要将客户端请求的内容反向代理至后端web服务器。所以,要在haproxy上准备两块网卡,一块与外网连接,接受客户端请求;一块与内网连接,和后端web服务器在同一网络,反代至后端主机(要打开网络间转发功能)。这里为了实验方便,所有的主机都在同一网段。
  ip地址规划:

[*]  haproxy ip:10.1.252.153
[*]  RS1:10.1.252.161
[*]  RS2:10.1.252.73

  具体操作如下:
  -------------------------------------------------------------------------------------------
   1.编辑haproxy的配置文件/etc/haproxy/haproxy.cfg,使其能够反代至后端的web服务器,如下:

# cd /etc/haproxy/
# ls
haproxy.cfg
#cp haproxy.cfg{,.bak}//首先做备份
# vim haproxy.cfg       //编辑配置文件http://s3.运维网.com/wyfs02/M01/8A/75/wKioL1gxhL3wc93_AABNF4rKEjo943.png
   2.启动服务,查看端口80/tcp
# systemctl start haproxy.service
# ss -tnl
State       Recv-Q Send-Q   Local Address:Port                  Peer Address:Port            
LISTEN      0      25                   *:514                              *:*                  
LISTEN      0      128                  *:80                               *:*                  
LISTEN      0      128                  *:22                               *:*                  
LISTEN      0      128          127.0.0.1:631                              *:*                  
LISTEN      0      100          127.0.0.1:25                               *:*   3.为两台后端web主机提供测试页面;
# cat /var/www/html/index.html
Backend Server 1
# cat /var/www/html/index.html
Backend Server 2   先启动RS1,可以发现,因为haproxy有健康状态检测所以,只反代至RS1主机
http://s5.运维网.com/wyfs02/M02/8A/75/wKioL1gxiB-CmTFVAAA-v6NzO-4054.png
   再启动RS2主机,可以发现RS1,RS2两台主机以轮询的方式进行响应,如下:
http://s4.运维网.com/wyfs02/M00/8A/75/wKioL1gxiMLyhYroAAOfCOKfj3c364.gif
  

HAProxy配置参数---global配置端:
1.进程及安全配置相关的参数

★进程及安全相关的参数

[*]user/uid, group/gid, nbproc, ulimit-n, ca-base, ...
★定义日志系统相关属性
⊙log]:

[*]:日志服务器地址;
[*]:每行日志记录的最大长度;

  启动haproxy的记录日志功能:
  1)查看haproxy的配置文件,在全局配置段中获知要想启用记录日志功能,得在/etc/rsyslog.cfg配置文件中添加

http://s5.运维网.com/wyfs02/M02/8A/79/wKiom1gxkDzxVFV4AABILSRLxcY292.png
   2)编辑 /etc/rsyslog.conf 配置文件,启动一个记录远程日志的udp或者tcp服务
http://s5.运维网.com/wyfs02/M02/8A/75/wKioL1gxkavzcr1wAAAtE1GlIXY095.png
   3)添加记录local2的日志
http://s3.运维网.com/wyfs02/M00/8A/79/wKiom1gxkzKy8v4KAAAS8ZmMY6A837.png
  4)重启rsyslog日志服务,查看端口514/tcp或者514/udp
# systemctl restart rsyslog.service
# ss -unl
State       Recv-Q Send-Q   Local Address:Port                  Peer Address:Port            
UNCONN      0      0                  *:68                               *:*                  
UNCONN      0      0            127.0.0.1:323                              *:*                  
UNCONN      0      0                  *:48491                            *:*                  
UNCONN      0      0                  *:44489                            *:*                  
UNCONN      0      0                  *:514                              *:*                  
UNCONN      0      0                  ::1:323                           :::*                  
UNCONN      0      0                   :::13758                           :::*                  
UNCONN      0      0                   :::514                           :::*   5)在浏览器中访问两次,查看日志如下:
# tail /var/log/haproxy.log
Nov 20 20:08:57 localhost haproxy: 10.1.250.25:64580 main websrvs/web1 0/0/4/6/10 200 297 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1"
Nov 20 20:08:57 localhost haproxy: 10.1.250.25:64580 main websrvs/web2 627/0/1/1/629 200 297 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1"-----------------------------------------------------------------------------
2.性能调整相关的参数:


[*]maxconn :       //设定单haproxy进程的最大并发连接数;
[*]maxconnrate : //设定单haproxy进程每秒接受的连接数;
[*]maxsslconn :   //设定单haproxy进程的ssl连接最大并发连接数;
[*]maxsslrate :   //单haproxy进程的ssl连接的创建速率上限;



[*]spread-checks



[*]tune.rcvbuf.client//接收客户端请求的缓冲大小
[*]tune.rcvbuf.server //接收服务端响应的缓冲大小
[*]tune.sndbuf.client //向客户端发送响应的缓冲大小
[*]tune.sndbuf.server //向服务端发送请求的缓冲大小
[*]tune.ssl.cachesize    //ssl会话的缓存大小
[*]tune.ssl.lifetime       //ssl会话缓存的有效时长

3.Debugging、Userlists、Peers参数

★Debugging 调试相关的参数

[*]debug   尽量详细的输出信息
[*]quiet   尽量不输出信息
★Userlists:定义用户、组及用户列表;

[*]userlist
[*]group
[*]user
   
★Peers:定义haproxy同步集群

[*]peer
[*]peers

HAProxy配置参数---代理配置段:
            ---Proxy configuration can be located in a set of sections

★proxies:代理配置段

[*]defaults:为frontend, backend以及listen提供默认配置;
[*]frontend:前端,相当于Nginx中的server{ ... };
[*]backend:后端,相当于nginx中的upstream { ...};
[*]listen:前后端的直接组合;
https://s3.运维网.com/wyfs02/M00/8E/CC/wKiom1jLWxvT1dQJAACVQwQ9rig931.png
1.配置参数:

★bind:

[*]作用:设定监听的地址和端口;
[*]语法:bind []: [, ...]
[*]使用位置:frontend,listen
★mode { tcp|http|health }
⊙作用:定义haproxy的工作模型:
◆tcp:

[*]基于layer4实现代理,可代理大多数基于tcp的应用层协议,例如ssh,mysql,pgsql等;
◆http:

[*]客户端的http请求会被深度解析;
◆health:

[*]工作为健康状态检查响应模式,当请求到达时仅回应“OK”即断开连接;
  演示:
  1.使用bind监听多个地址和端口,编辑配置文件/etc/haproxy/haproxy.cfg如下:
http://s1.运维网.com/wyfs02/M01/8A/78/wKioL1gxxhLBGtk8AAAt_w0ljfI890.png
  重启haproxy服务,查看端口,发现已经监听80和8080端口,如下:
# systemctl restart haproxy
# ss -tnl
State       Recv-Q Send-Q   Local Address:Port                  Peer Address:Port            
LISTEN      0      128                  *:8080                           *:*                  
LISTEN      0      128                  *:80                               *:*                  
LISTEN      0      128                  *:22                               *:*                  
LISTEN      0      128          127.0.0.1:631                              *:*                  
LISTEN      0      100          127.0.0.1:25                               *:*                  
LISTEN      0      128          127.0.0.1:6010                           *:*                  
LISTEN      0      25                   *:514                              *:*
2.balance调度算法

★balance
⊙作用:

[*]定义向后端主机使用的调度算法;
⊙语法格式:

[*]balance[]
[*]balance url_param
⊙:算法

◆roundrobin 加权轮询

[*]server后面使用 weight 来定义权重;
[*]动态算法:支持权重的运行时调整;支持慢启动;仅支持最大4095个后端活动主机;
◆static-rr

[*] 静态算法:不支持权重的运行时调整及慢启动;但后端主机数量无限制;
◆leastconn

[*]最少连接算法
[*]动态算法
◆first:
◆source:

[*]原地址哈希算法,将来自与同一个ip地址的请求发往同一个real server;
[*]将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;
[*]动态算法或静态算法取决于hash-type;
◆uri:

[*]根据用户所请求的uri进行调度,在缓存服务器中使用,保证用户对同一个uri的请求发往同一个后端主机;
[*]uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;
[*]其默认为静态算法,不过也可以使用hash-type修改此特性;
https://s1.运维网.com/wyfs02/M01/8E/CB/wKioL1jLae-wKb7XAAAUNEenmSM185.png
◆url_param:

[*]对用户请求的url中的部分中的指定的参数的值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;
◆hdr():

[*]指定的http首部将会被取出做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;没有有效值的会被轮询调度;
      示例:hdr(User-Agent)基于绑定浏览器类型进行访问
◆rdp-cookie
◆rdp-cookie()
⊙hash-type:

[*]map-based:取模法,hash数据结构是静态数组;
[*]consistent:一致性哈希,哈希的数据结构是“树”;
注意:

[*]为了确保因为一个主机的变动不对整个服务器群等的取值都要发生变化,应该使用一致性哈希算法!!!

3.启动内建统计页面

★maxconn :

[*]最大并发连接数,默认为2000
[*]使用位置:frontend、default、listen
★stats enable:
⊙作用:

[*]启用内建的统计页,在缺少其它必要的参数时,会使用默认配置;

⊙默认配置:

[*]- stats uri   : /haproxy?stats
[*]- stats realm : "HAProxy Statistics"
[*]- stats auth: no authentication
[*]- stats scope : no restriction
★stats uri :

[*]自定义stats页面的uri;
★stats realm :

[*]启用统计信息并设置身份认证域。

★stats auth :

[*]定义认证使用的账号和密码;
★stats hide-version:

[*]隐藏版本信息

★stats refresh

[*]自动刷新相关页面的时间间隔;

★stats admin { if | unless }

[*]条件满足时启用stats内建的管理功能接口;不建议启用,有安全隐患

  演示:
  定义最大并发连接数并启动内建统计页,并配置统计页相关参数
  -------------------------------------------------------------------------------
  1.编辑配置文件/etc/haproxy/haproxy.cfg,在fortend前端添加自低昂一的最大并发连接数和启动内建统计页的参数即可,如下:
http://s3.运维网.com/wyfs02/M02/8A/7D/wKioL1gylXyByDX-AAAoZa3F5e4957.png
  

   2.重载haproxy服务,在浏览器中访问内建统计页如下:
# systemctl reload haproxy.servicehttp://s1.运维网.com/wyfs02/M00/8A/7D/wKioL1gyltKChz6NAAGKddqPvE8966.png
   3.自定义stats 页面的uri,同样编辑配置文件,如下:
  
http://s1.运维网.com/wyfs02/M02/8A/81/wKiom1gyn_eRj4xSAAAsPXX1c2Q912.png
  
   重载haproxy服务,访问如下:
http://s1.运维网.com/wyfs02/M00/8A/81/wKiom1gyoDnzisw8AAGOpGmgWXk336.png
   4.为统计页面添加账号和密码,编辑配置文件如下:
http://s4.运维网.com/wyfs02/M00/8A/82/wKiom1gyqKqyjjSlAAA4uIvVl0I044.png
  

  在浏览器中再次刷新访问,可以发现需要输入用户名和密码才可以登录,如下:
http://s3.运维网.com/wyfs02/M00/8A/7E/wKioL1gyqOSRQ6E9AACzL48aaTM535.png
  

   5.隐藏stats统计页面的版本信息,定义5s刷新一次,并启动stats管理功能接口,编辑配置文件,如下:
http://s5.运维网.com/wyfs02/M02/8A/83/wKiom1gyrl2AvonxAABAc79RM68312.png
  

   重载haprosy服务,在浏览器中刷新访问,可以看到版本信息已经隐藏,并且管理功能接口已然启动,如下:
http://s4.运维网.com/wyfs02/M02/8A/7F/wKioL1gyr7bhULqWAAHYPYN9kO4974.png
  

  =========================================================================================
  配置示例总结:
  http://s1.运维网.com/wyfs02/M00/8A/7F/wKioL1gysMXBnCJlAAAo4Dx0RVY150.png
  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  




页: [1]
查看完整版本: HAProxy 基础入门