设为首页 收藏本站
查看: 1062|回复: 0

[经验分享] HAProxy 基础入门

[复制链接]

尚未签到

发表于 2019-1-1 11:07:44 | 显示全部楼层 |阅读模式
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

  -------------------------------------------------------------------------------
  实验拓扑图

  实验环境描述:


  •   三台虚拟主机,一台作为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
Backend Server 1
[root@RS2 ~]# cat /var/www/html/index.html
Backend Server 2   先启动RS1,可以发现,因为haproxy有健康状态检测所以,只反代至RS1主机

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

  

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

进程及安全相关的参数

  • user/uid, group/gid, nbproc, ulimit-n, ca-base, ...
定义日志系统相关属性
log  [len ]  [max level [min level]]:

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

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


   2)编辑 /etc/rsyslog.conf 配置文件,启动一个记录远程日志的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 :         //设定单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  [users ,,(...)]
  • user  [password|insecure-password ]
       [groups ,,(...)]
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 []: [, ...]
  • 使用位置: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  [  ]
  • balance url_param  [check_post]
:算法

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修改此特性;

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前端添加自低昂一的最大并发连接数和启动内建统计页的参数即可,如下:

  

   2.重载haproxy服务,在浏览器中访问内建统计页如下:
[root@centos7 haproxy]# systemctl reload haproxy.service

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

  
   重载haproxy服务,访问如下:

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

  

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

  

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

  

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

  

  =========================================================================================
  配置示例总结:
  
  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-658208-1-1.html 上篇帖子: HAProxy 高级应用(二) 下篇帖子: haproxy的timout参数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表