Haproxy群集部署

目录

HAProxy简介

Haproxy工作原理

HAProxy基础配置文件详解

HaProxy的负载均衡算法现在具体有如下 8 种:

Haproxy实例配置

1、拓扑图:

2、基本配置

3、安装配置haproxy服务器

4、优化命令和服务管理脚本优化命令路径:

5、修改haproxy.cfg配置

6、配置httpd服务器

7、修改haproxy的调度算法为source

8、客户端访问测试

9、配置NFS共享目录

10、在httpd-1和httpd-2服务器上挂载共享目录

11、重新创建测试页面


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

LVS性能最好,但是搭建相对复杂

Nginx支持集群功能,但是对集群节点健康检查功能不强

Haproxy支持集群功能,对集群节点健康检查功能性能较强

  • HAProxy简介

(1)HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy 运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护web服务器不被暴露到网络上

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

(3)HAProxy支持连接拒绝:因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。

(4)HAProxy支持全透明代理(已具备硬件防火墙的典型特点):可以用客户端IP地址或者任何其他地址来连接后端服务器。这个特性仅在Linux 2.4/2.6内核打了cttproxy 补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

性能

HAProxy借助于OS上几种常见的技术来实现性能的最大化。

1、单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。

2、事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。

3、在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽。

4、借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting)。

5、内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长。

6、树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列。

7、优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域。

8、精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等。

所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。

在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。

HAProxy目前主要有三个版本:1.3,1.4,1.5,CentOS6.6自带的RPM包为1.5的。

  • Haproxy工作原理

4层负载平衡:

将网络流量负载平衡到多个服务器的最简单方法是使用第4层(传输层)负载平衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量(即,如果请求进入 http://www.guiguedu.cn/,则流量将转发到处理www.guiguedu.cn的所有请求的后端。端口80)。

 

用户访问负载均衡器,负载均衡器将用户的请求转发给后端服务器的Web后端组。无论选择哪个后端服务器,都将直接响应用户的请求。通常,Web后端中的所有服务器应该提供相同的内容,否则用户可能会收到不一致的内容。

(3)7层负载平衡:

7层负载平衡是更复杂的负载均衡网络流量的方法,是使用第7层(应用层)负载均衡。使用第7层允许负载均衡器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。

 

示例中,如果用户请求www.guiguedu.cn/blog,则会将其转发到博客后端,后端是一组运行博客应用程序的服务器。其他请求被转发到web-backend,后端可能正在运行另一个应用程序。

HAProxy基础配置文件详解

6-1、haproxy配置中分成五部分内容,分别如下:

global:设置全局配置参数,属于进程的配置,通常是和操作系统相关。

defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen 组件;

frontend:接收请求的前端虚拟节点,Frontend 可以更加规则直接指定具体使用后端的 backend;

backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;

Listen:frontend和backend的组合体。

6-2、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

6-3、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替代。该参数向后兼容

6-4、listen status定义一个名为status的部分

bind 0.0.0.0: 80

# 定义监听的群集地址与端口号,此处表示haproxy服务器的任意IP地址都可以作为群集地址。

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版本信息

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

6-6、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

6-7、haproxy健康检测方式

通过对节点服务器提交访问请求,获取服务器的回应信息,通过回应信息判断健康状态。

HTTP  请求提交方式

GET:快速提交,但不安全。

POST:安全提交

信息状态码:

工作正常的状态码:2xx 3xx

不正常的状态码:4xx 5xx

HaProxy的负载均衡算法现在具体有如下 8 种:

1)、roundrobin:简单的轮询

2)、static-rr:权重轮询

3)、leastconn:最少连接者优先

4)、source:根据请求源IP,这个跟Nginx的ip_hash机制类似

5)、ri:根据请求的URI

6)、rl_param:表示根据请求的URI参数‘balance url_param’requires an URL parameter name;

7)、hdr(name):根据HTTP请求头来锁定每一次HTTP请求

8)、rdp-cookie(name):根据cookie来锁定并哈希每一次TCP请求

Haproxy实例配置

1、拓扑图:

 

2、基本配置

服务器名

安装软件

IP 地址

haproxy

haproxy

192.168.10.1

HTTPD-1

httpd

192.168.10.2

HTTPD-2

httpd

192.168.10.3

fireserver

NFS

192.168.10.4

3、安装配置haproxy服务器

3-1、解压,并编译安装haproxy

[root@localhost ~]# tar zxf haproxy-1.5.19.tar.gz -C /usr/src/

[root@localhost ~]# cd /usr/src/haproxy-1.5.19/

[root@localhost haproxy-1.5.19]# make TARGET=linux26 PREFIX=/usr/local/haproxy

//linux26是指linux的内核版本号

[root@localhost haproxy-1.5.19]# make install PREFIX=/usr/local/haproxy

3-2、创建配置文件

[root@localhost ~]# mkdir /etc/haproxy

[root@localhost ~]# cp /usr/src/haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/

3-3、创建调度信息存储目录:

[root@localhost ~]# mkdir /usr/share/haproxy

4、优化命令和服务管理脚本优化命令路径:

[root@localhost ~]# ln -s /usr/local/haproxy/sbin/* /usr/sbin

复制服务管理脚本:

[root@localhost ~]# cp /usr/src/haproxy-1.5.19/examples/haproxy.init /etc/rc.d/init.d/haproxy

[root@localhost ~]# chmod a+x /etc/rc.d/init.d/haproxy

将服务添加到服务管理器

[root@localhost ~]# chkconfig --add haproxy

设置启动系统时,自动启动服务

[root@localhost ~]# chkconfig haproxy on

5、修改haproxy.cfg配置

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg

修改:

global //全局配置

log 127.0.0.1 local0 //日志文件服务器

log 127.0.0.1 local1 notice #日志保存位置与类型

#log loghost  local0 info

maxconn 4096 #最大并发连接数

chroot /usr/share/haproxy #保存调度信息的目录

uid 99 #访问用户

gid 99 #访问组

daemon #启用守护进程

defaults #针对所有群集节点的默认配置

log global #日志类型参照全局模式

mode http     #群集模式为http(7层)群集

option httplog #使用http的日志格式

option dontlognull #日志不能为空

//不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包

retries 3 #健康检查重试次数

#redispatch

//当服务器负载很高时,自动结束当前队列处理比较久的连接

maxconn 2000 #单节点服务器最大连接数,不能超过全局配置

contimeout 5000 #链接超时时间

clitimeout 50000 #客户端链接超时时间

srvtimeout 50000 #服务器节点链接超时时间

listen 群集名称 0.0.0.0:80 #指定群集地址与端口号

option httpchk GET /index.html  #健康检查方式

balance roundrobin #调度算法

server inst1 192.168.10.3:80 check inter 2000 fall 3

server inst2 192.168.10.2:80 check inter 2000 fall 3

#指定服务器节点 ip 和端口号,检查并发连接数和重试次数

启动服务

systemctl restart haproxy

注意:

如果启动时出现报错:/haproxy.main()] Cannot chroot(/usr/share/haproxy)

则手动创建:

mkdir /usr/share/haproxy

如果启动时出现报错:Starting proxy cacti: cannot bind socket

则执行:

sysctl -e net.ipv4.ip_nonlocal_bind=1

6、配置httpd服务器

6-1、安装httpd服务

mount /dev/cdrom /media

rm -rf /etc/yum.repos.d/*

vim /etc/yum.repos.d/yum.repo

[yum]

name=yum

baseurl=file:///media

enabled=1

gpgcheck=0

[root@localhost ~]# yum -y install httpd

6-2、配置httpd服务

关闭保持会话,测试时使用

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

添加:

keepalive off

6-3、分别给两台httpd服务器创建测试页

httpd-1服务器:

[root@localhost ~]# vim /var/www/html/index.html

httpd1

httpd-2服务器:

[root@localhost ~]# vim /var/www/html/index.html

httpd1

7、修改haproxy的调度算法为source

vim /etc/haproxy/haproxy.cfg

修改:

listen 群集名称 0.0.0.0:80 #指定群集地址与端口号

option httpchk GET /index.html #健康检查方式

balance source #调度算法

server inst1 192.168.10.3:80 check inter 2000 fall 3

server inst2 192.168.10.2:80 check inter 2000 fall 3

重启服务

[root@localhost ~]# systemctl restart haproxy

8、客户端访问测试

在同一台客户端上访问,打开页面后按F5刷新,发现页面无变化

按F5刷新

 

 

在另一台客户端访问:

 

9、配置NFS共享目录

配置IP地址:192.168.10.4

[root@localhost ~]# mkdir /data

[root@localhost ~]# vim /etc/exports

data *(rw)

[root@localhost data]# systemctl restart nfs

10、在httpd-1和httpd-2服务器上挂载共享目录

[root@localhost ~]# mount 192.168.10.4:/data /var/www/html

11、重新创建测试页面

在nfs服务器上创建测试页:

[root@localhost data]# cd /data/

[root@localhost data]# vim index.html

hahahah

验证:

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值