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实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。

★文档位置

★版本(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服务器,如下:

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

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

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

[[email protected] ~]# cat /var/www/html/index.html 
<h1>Backend Server 1</h1>

[[email protected] ~]# 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

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

[[email protected] ~]# 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端口,如下:

[[email protected] haproxy]# systemctl restart haproxy
[[email protected] 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服务,在浏览器中访问内建统计页如下:

[[email protected] haproxy]# systemctl reload haproxy.service

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

 重载haproxy服务,访问如下:

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

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

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

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

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

配置示例总结:

时间: 2024-10-09 01:21:22

HAProxy 基础入门的相关文章

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android基础入门教程——2.3.12 Date &amp; Time组件(下)

Android基础入门教程--2.3.12 Date & Time组件(下) 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来继续学习Android系统给我们提供的几个原生的Date & Time组件,他们分别是: DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图),好吧, 其实一开始让我扣这几个玩意我是拒绝的,因为在我的印象里,他们是这样的: 简直把我丑哭了,有木有,终于知道为什么那么多人喜欢自定义这种类型的

Android基础入门教程——2.1 View与ViewGroup的概念

Android基础入门教程--2.1 View与ViewGroup的概念 标签(空格分隔): Android基础入门教程 本节引言: 告别了第一章,迎来第二章--Android中的UI(User Interface)组件的详解, 而本节我们要学习的是所有控件的父类View和ViewGroup类!突发奇想,直接翻译官方文档对 这两个东西的介绍吧,对了,天朝原因,google上不去,Android developer上不去,我们可以 改hosts或者用vpn代理,当然也可以像笔者一样使用国内的API

DAX基础入门 – 30分钟从SQL到DAX — PowerBI 利器

看到漂漂亮亮的PowerBI报表,手痒痒怎么办?! 有没有面对着稀奇古怪的DAX而感到有点丈八金刚摸不着头脑或者干瞪眼?! 有没有想得到某个值想不出来DAX怎么写而直跳脚!? 看完这篇文章,你会恍然大悟,捂脸偷笑.呼呼呼~ 前言: 这篇文章对于具有一点SQL查询基础人会十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等. 注:此文不涉及到Filter Context(筛选上下文)的介绍. 正文: 对于对SQL有一定了解的人来说,咋看DAX,怎么都不习惯. 但是,如果理解以下几个后,

Linux 基础入门----推荐课程

Linux 基础入门课程:https://www.shiyanlou.com/courses/1 很好的一门Linux基础课,精炼.简洁!推荐! 课程内容: 第1节 Linux 系统简介 https://www.shiyanlou.com/courses/1/labs/1/document 第2节 基本概念及操作 https://www.shiyanlou.com/courses/1/labs/2/document 第3节 用户及文件权限管理 https://www.shiyanlou.com/

从零基础入门JavaScript(1)

从零基础入门JavaScript(1) 1.1  Javascript的简史 1995年的时候   由网景公司开发的,当时的名字叫livescript    为了推广自己的livescript,搭了java顺风车,改名为javascript 与此同时,     微软因此在自身的浏览器里,也推出了自己的脚本语言 jscript 1997年时候,  由ECMA(欧洲计算机制造商协会)出面,推出了一套javascript的规范,Ecmascript ,规范提出js由三部分组成 JS的组成: ECMAS

saltstack之基础入门系列文章简介

使用saltstack已有一段时间,最近由于各种原因,特来整理了saltstack基础入门系列文章,已备后续不断查阅(俗话说好记性不如烂笔头),也算是使用此工具的一个总结.saltstack的前六篇文章主要讲述了saltstack的安装.远程执行.配置管理.数据系统以及jinjia模板等知识点,从第七篇往后的文章是一些使用saltstack的案例,包括系统初始化,rpm包以及源码安装等. 博客中saltstack系列的文章,适合初学者从零开始学习直到逐渐熟练使用.文章具有一定的连贯性,如果没有任