首页 > 代码库 > HAProxy 基础入门

HAProxy 基础入门

Haproxy 基础入门

===============================================================================

概述:


===============================================================================

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, ...


 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

-------------------------------------------------------------------------------

实验拓扑图

技术分享

实验环境描述:

  • 三台虚拟主机,一台作为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服务器,如下:

[root@haproxy ~]# cd /etc/haproxy/
[root@haproxy haproxy]# ls
haproxy.cfg  
[root@haproxy haproxy]#cp haproxy.cfg{,.bak}  //首先做备份
[root@haproxy haproxy]# vim haproxy.cfg       //编辑配置文件

技术分享

 2.启动服务,查看端口80/tcp

[root@haproxy haproxy]# systemctl start haproxy.service
[root@haproxy haproxy]# 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主机提供测试页面;

[root@RS1 ~]# cat /var/www/html/index.html 
<h1>Backend Server 1</h1>

[root@RS2 ~]# cat /var/www/html/index.html 
<h1>Backend Server 2</h1>

 先启动RS1,可以发现,因为haproxy有健康状态检测所以,只反代至RS1主机

技术分享

 再启动RS2主机,可以发现RS1,RS2两台主机以轮询的方式进行响应,如下:

技术分享




HAProxy配置参数---global配置端:

 1.进程及安全配置相关的参数

user/uid, group/gid, nbproc, ulimit-n, ca-base, ...

定义日志系统相关属性

log <address> [len <length>] <facility> [max level [min level]]:

  • <address>:日志服务器地址;

  • [len <length>]:每行日志记录的最大长度;

启动haproxy的记录日志功能:

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

技术分享

 

 2)编辑/etc/rsyslog.cfg配置文件,启动一个记录远程日志的udp或者tcp服务

技术分享

 3)添加记录local2的日志

技术分享

  4)重启rsyslog日志服务,查看端口514/tcp或者514/udp

[root@haproxy ~]# systemctl restart rsyslog.service 
[root@haproxy ~]# 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)在浏览器中访问两次,查看日志如下:

[root@haproxy ~]# tail /var/log/haproxy.log
Nov 20 20:08:57 localhost haproxy[4139]: 10.1.250.25:64580 [20/Nov/2016:20:08:57.196] 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[4139]: 10.1.250.25:64580 [20/Nov/2016:20:08:57.206] main websrvs/web2 627/0/1/1/629 200 297 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1"

-----------------------------------------------------------------------------

2.性能调整相关的参数:

  • maxconn <number>:       //设定单haproxy进程的最大并发连接数;

  • maxconnrate <number>:   //设定单haproxy进程每秒接受的连接数;

  • maxsslconn <number>:    //设定单haproxy进程的ssl连接最大并发连接数;

  • maxsslrate <number>:    //单haproxy进程的ssl连接的创建速率上限;


  • spread-checks <0..50, in percent>


  • tune.rcvbuf.client <number>  //接收客户端请求的缓冲大小

  • tune.rcvbuf.server <number>  //接收服务端响应的缓冲大小

  • tune.sndbuf.client <number>  //向客户端发送响应的缓冲大小

  • tune.sndbuf.server <number>  //向服务端发送请求的缓冲大小

  • tune.ssl.cachesize <number>  //ssl会话的缓存大小

  • tune.ssl.lifetime <timeout>  //ssl会话缓存的有效时长

3.Debugging、Userlists、Peers参数

Debugging 调试相关的参数

  • debug     尽量详细的输出信息

  • quiet     尽量不输出信息

Userlists:定义用户、组及用户列表;

  • userlist <listname>

  • group <groupname> [users <user>,<user>,(...)]

  • user <username> [password|insecure-password <password>]

       [groups <group>,<group>,(...)]

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:前后端的直接组合;

 1.配置参数:

bind:

  • 作用:设定监听的地址和端口;

  • 语法bind [<address>]:<port_range> [, ...]

  • 使用位置:frontend,listen

mode { tcp|http|health }

作用:定义haproxy的工作模型:

  • tcp:

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

  • http:

       客户端的http请求会被深度解析;

  • health:

       工作为健康状态检查响应模式,当请求到达时仅回应“OK”即断开连接;

演示:

  1.使用bind监听多个地址和端口,编辑配置文件/etc/haproxy/haproxy.cfg如下:

技术分享 

  重启haproxy服务,查看端口,发现已经监听80和8080端口,如下:

[root@centos7 haproxy]# systemctl restart haproxy
[root@centos7 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 <algorithm> [ <arguments> ]

  • balance url_param <param> [check_post]

<algorithm>:算法

  • roundrobin 加权轮询

       server后面使用weight来定义权重;

      动态算法:支持权重的运行时调整;支持慢启动;仅支持最大4095个后端活动主机

  • static-rr

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

  • leastconn

       最少连接算法

       动态算法

  • first:

  • source:

       原地址哈希算法,将来自与同一个ip地址的请求发往同一个real server

       动态算法或静态算法取决于hash-type; 

  • uri:

       根据用户所请求的uri进行调度,在缓存服务器中使用,保证用户对同一个uri的请求发往同一个后端主机

  • url_param:

       对用户请求的url中的<param>部分中的指定的参数的值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;

  • hdr(<name>):

      指定的http首部将会被取出做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;没有有效值的会被轮询调度;

  • rdp-cookie

  • rdp-cookie(<name>)

hash-type:

  • map-based:取模法,hash数据结构是静态数组;

  • consistent:一致性哈希,哈希的数据结构是“树”;

 3.启动内建统计页面

maxconn <conns>:

  • 最大并发连接数,默认为2000

  • 使用位置:frontend、default、listen

stats enable:

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

选项:

  • - stats uri   : /haproxy?stats

  • - stats realm : "HAProxy Statistics"

  • - stats auth  : no authentication

  • - stats scope : no restriction

stats uri <prefix>:

  • 自定义stats页面的uri;

stats realm <realm>:

  • 启用统计信息并设置身份认证域。

stats auth <user>:<passwd>

  • 定义认证使用的账号和密码;

stats hide-version:

  • 隐藏版本信息

stats refresh <delay>

  • 自动刷新相关页面的时间间隔;

stats admin { if | unless } <cond>

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

演示:

  定义最大并发连接数并启动内建统计页,并配置统计页相关参数

-------------------------------------------------------------------------------

  1.编辑配置文件/etc/haproxy/haproxy.cfg,在fortend前端添加自低昂一的最大并发连接数和启动内建统计页的参数即可,如下:

技术分享


 2.重载haproxy服务,在浏览器中访问内建统计页如下:

[root@centos7 haproxy]# systemctl reload haproxy.service

技术分享

 3.自定义stats 页面的uri,同样编辑配置文件,如下:

技术分享

 

 重载haproxy服务,访问如下:

技术分享

 4.为统计页面添加账号和密码,编辑配置文件如下:

技术分享


  在浏览器中再次刷新访问,可以发现需要输入用户名和密码才可以登录,如下:

技术分享


 5.隐藏stats统计页面的版本信息,定义5s刷新一次,并启动stats管理功能接口,编辑配置文件,如下:

技术分享


 重载haprosy服务,在浏览器中刷新访问,可以看到版本信息已经隐藏,并且管理功能接口已然启动,如下:

技术分享


=========================================================================================

配置示例总结:

技术分享


























HAProxy 基础入门