Haproxy负载均衡+Web群集搭建 --详细步骤
Haproxy简介
Haproxy是一个使用C语言编写的,可靠的、高性能的负载均衡软件,也是一种免费、快速且可靠的解决方案,可为基于TCP(第四层)和HTTP(第七层)的应用程序提供高可用负载均衡,特别适用于流量非常高也就是负载特别大的Web网站,完全可以支持数以万计的并发连接。这些网站站点通常需要会话保持或七层处理。新型的大型互联网公司会采用Haproxy+keepalived架构搭建高性能Web群集,能够支持千万级并发量。
Haproxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。同时结合了一个快速的I/O层与基于优先级的调度程序。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。单个进程可以运行多个实例,而且在单个进程中,可以配置300000个不同的代理并保持良好的运行。因此,通常不需要为所有实例启动多个进程。包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在内的知名网站,及亚马逊网络服务系统都使用了Haproxy。
Haproxy一旦启动,会做三件事情:
· 处理客户端传入的连接请求;
· 周期性地检查后端服务器的状态(称为健康检查);
· 与其他Haproxy节点交换信息。
Haproxy高性能负载均衡主要优点:
□ Haproxy在负载均衡速度和并发处理上 是优于Nginx
□ Haproxy支持虚拟主机,可以工作在4、7层;
□ 能够补充Nginx的一些缺点,比如Session的保持、Cookie的引导等工作;
□ 支持url检测后端的服务器的状态;
□ Haproxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡
□支持很多负载均衡算法,Round-robin(轮询)、Weight-round-robin(加权轮询)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
四层与七层负载均衡的主要区别:
四层负载均衡器
是通过分析IP层及TCP/UDP层的流量实现的基于“IP + 端口”的负载均衡,主要通过报文的目标地址和端口配合负载均衡算法选择后端真实服务器,确定是否需要对报文进行修改(根据需求,可能会修改目标地址、源地址、MAC地址等)并将数据转发至选出的后端真实服务器。
七层负载均衡器
是基于应用层信息(如URL、Cookies等)的负载均衡。主要依据报文的内容配合负载均衡算法选择后端真实服务器,然后再分发请求到真实服务器进行处理,也称“内容交换器”。客户端与负载均衡器、负载均衡器与后端真实服务器之间会分别建立TCP连接。
配置文件介绍
haproxy 配置中分成五部分内容,分别如下:
global部分: 设置全局配置参数,属于进程的配置,通常是和操作系统相关。
defaults部分:配置默认参数,属于公共配置,这些参数可以被引用到frontend,backend,Listen组件;
frontend部分:接收客户端请求的虚拟节点(配置实体frontend),Frontend可以添加规则 直接指定需要使用的后端服务器backend;
backend部分:用于配置后端服务器集群,是一组真实服务器,用来处理前端传来的请求,一个Backend对应一个或者多个实体服务器;
Listen部分 :frontend和backend的组合体。在frontend和backend部分能使用的所有选项参数,该部分都可以支持(option stop-check除外)。
实验环境:
针对高并发访问,搭建haproxy+nginx群集
一台负载均衡haproxy:IP 192.168.188.156
两台Nginx的web:IP 192.168.188.132~133
群集搭建的详细配置:
首先配下主机名
# hostnamectl set-hostname haproxy
# hostnamectl set-hostname nginx1
# hostnamectl set-hostname nginx2
1:编译Nginx-Web服务
两台nginx可同步操作(两台nginx只有首页内容不同)
# systemctl stop firewalld.service
# setenforce 0
# yum install pcre-devel zlib-devel gcc gcc-c++ make -y
# useradd -M -s /sbin/nologin nginx 创建程序用户
软件包,可自行下载,我这里下载下来放到windows的share目录中
可用samba进行挂载共享
# mount.cifs //192.168.100.1/share /mnt
# cd /mnt/LNMP-C7
# tar zxvf nginx-1.12.2.tar.gz -C /opt/
# cd /opt/nginx-1.12.2/
# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx
# make && make install
# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
# cd /usr/local/nginx/html
# echo "this is kgc web" > test.html
另一台是nginx web 首页内容不同
# nginx -t 检查语法
# nginx 启动nginx服务
# netstat -ntap | grep 80 查看端口
网页访问查看两台nginx服务是否正常
2:haproxy代理服务配置
# systemctl stop firewalld.service
# setenforce 0
# yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
挂载解压
# tar zxvf haproxy-1.5.19.tar.gz -C /opt/
# cd haproxy-1.5.19/
# make TARGET=linux26
# make install
配置文件:
# mkdir /etc/haproxy 创建haproxy目录
# cp examples/haproxy.cfg /etc/haproxy/ 把配置文件拷贝出来
# cd /etc/haproxy/
# vim haproxy.cfg
下面两句注释掉
#chroot /usr/share/haproxy #号注释掉 家目录
#redispatch #号注释掉,防止请求发给有故障的节点
100dd删除所有listen项
自行添加
listen webcluster 0.0.0.0:80
option httpchk GET /test.html
balance roundrobin
server inst1 192.168.195.129:80 check inter 2000 fall 3
server inst2 192.168.195.130:80 check inter 2000 fall 3
解释:
监听的任意网段的80端口
提交方式是test.html网页(两台nginx都创建了test.html网页)
采用轮询机制
节点IP为两个nginx IP 并2000毫秒进行健康检查,3次健康检查失败则认为节点服务器宕掉了
配置启动脚本:
# cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
# cd /etc/init.d/
# chmod +x haproxy
# chkconfig --add /etc/init.d/haproxy 便于service管理
# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy 建立软连接便于系统识别命令
# service haproxy start
# netstat -ntap | grep haproxy
网页访问,基于Haproxy搭建的Web群集是否正常
刷新网页,可看到两台nginx服务的不同首页内容,说明采用的是轮询机制,这在配置文件中已经定义过的。
大家可以搭建 haproxy+keepalived 这种高性能Web群集架构,目前比较实用的。
配置文件中的具体参数:
1、global部分
global部分的参数通常与操作系统有关,只需设置一次。配置说明如下:
· log: 日志配置,可设置rsyslog服务地址、日志设备、日志级别等。
· chroot: Haproxy的工作目录。
· pidfile: PID文件路径。
· maxconn: 每个进程可接受的最大并发连接数。
· user: 运行Haproxy的用户,可设置用户名或uid。
· group: 运行Haproxy的组,可设置组名或gid。
· nbproc: 启动Haproxy时创建的进程数,默认只启动一个进程。
· daemon: 以后台形式运行Haproxy,默认启用。
2、defaults部分
配置说明如下:
· mode: 设置实例的运行模式:tcp、http、health,默认是http。
· log: 设置启用的日志配置,默认是global。
· maxconn: 最大并发连接数。
· retries: 设置连接后端服务器时失败重试的次数,默认值是3。
· timeout: 超时时间,单位毫秒,可以重复出现,定义时以“timeout”关键字开始且另起一行。常用选项如下:
http-request:HTTP请求的超时时间;
queue:队列的超时时间;
connect:成功连接后端服务器的超时时间;
client:客户端发送数据的超时时间;
server:后端服务器响应数据的超时时间;
http-keep-alive:持久连接的超时时间;
check:心跳检测的超时时间。
· option: 定义选项,可以出现多次,每配置一个选项值,则需要另起一行,以“option”开始。
常用选项如下:
httplog:启用日志记录HTTP请求;
dontlognull:不记录健康检查的日志信息;
http-server-close:收到后端响应后,关闭连接,但是不会关闭客户端与HAProxy的连接;
forwardfor:启用X-Forwarded-For,将客户端的真实IP写入其中;
redispatch:在连接失败的情况下启用或禁用会话重新分发,默认值是1。
3、frontend部分
常用选项如下:
· acl: 定义ACL规则;
· use_backend: 指定直接使用的后端(需要先在backend部分定义),一般与ACL配合使用;
· default_backend: 指定默认后端(需要先在backend部分定义),在use_backend规则不匹配时使用。
4、backend部分
常用选项如下:
· balance: 指定调度算法。可以是roundrobin、static-rr、leastconn、first、source、uri、url_param、hdr()、random、rdp-cookie、rdp-cookie();
· server: 定义后端真实服务器