标签:负载均衡之hapoxy
目前市场上,有关实现负载均衡的软件,使用比较多的是haproxy、nginx和lvs。
首先,介绍一下:什么是负载均衡?负载均衡一般通过两种方式来实现:基于操作系统的负载实现和基于第三方应用的负载实现。LVS就是基于Linux操作系统实现的一种负载,HAProxy就是开源的并且基于第三应用实现的负载。
两者之间的不同:LVS的特点是:
1、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低;
2、工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
HAProxy的特点是:
1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2、haproxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或七层处理。当haproxy运行在硬件上,完全可以支持数以万计的并发连接。
介绍完基本知识,让我们开始学习haprxoy这款软件。
一、HAProxy介绍
反向代理服务器,支持双机热备,支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入?
二、HAProxy的优点
1、免费开源,可靠性与稳定性都非常出色,可与硬件级设备媲美
2、支持连接拒绝,可以用于防止DDoS攻击
3、支持长连接、短连接和日志功能,可根据需要灵活配置
4、路由HTTP请求到后端服务器,基于cookie作会话绑定;同时支持通过获取指定的url来检测后端服务器的状态
5、HAProxy还拥有功能强大的ACL支持,可灵活配置路由功能,实现动静分离,在架构设计与实现上带来很大方便
6、可支持四层和七层负载均衡,几乎能为所有服务常见的提供负载均衡功能
7、拥有功能强大的后端服务器的状态监控web页面,可以实时了解设备的运行状态,还可实现设备上下线等简单操作。
8、支持多种负载均衡调度算法,并且也支持session保持。
三、配置文件介绍
haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen。
3.1 配置文件格式
HAProxy的配置处理3类来主要参数来源:
——最优先处理的命令行参数;
——“global”配置段,用于设定全局配置参数;
——proxy相关配置段,如“defaults”、“listen”、“frontend”和“backend”;
3.2 时间格式
一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀。
3.3 全局配置
* 进程管理及安全相关的参数
– chroot :修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
– daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
– gid :以指定的GID运行haproxy,建议使用专用于运行haproxy的GID,以免因权限问题带来风险;
– group :同gid,不过指定的组名;
– log [max level [min level]]:定义全局的syslog服务器,最多可以定义两个;
– log-send-hostname []:在syslog信息的首部添加当前主机名,可以为“string”指定的名称;
– nbproc :指定启动的haproxy进程的个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
– uid:以指定的UID身份运行haproxy进程;
– ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件数为1024个;
– user:同uid,但使用的是用户名;
– stats:用户访问统计数据的接口;
– node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;
– description:当前实例的描述信息;
* 性能调整相关的参数
– maxconn :设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;
– maxpipes :haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每个进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit -n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大;
3.4 代理
代理相关的配置可以如下配置段中。
defaults”段用于为所有其它配置段提供默认参数,这默认配置参数可由下一个“defaults”所重新设定。
“frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
“backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
“listen”段通过关联“frontend”和“backend”定义了一个完整的代理,通常只对TCP流量有用。
所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。
四、配置案例
一个最简单的http服务的配置
global
log 127.0.0.1
local2chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s #在客户端建立连接但不请求数据时,关闭客户端连接
timeout queue 1m # 等待最大时长
timeout connect 10s # 定义haproxy将客户端请求转发至后端服务器所等待的超时时长
timeout client 1m # 客户端非活动状态的超时时长
timeout server 1m # 客户端与服务器端建立连接后,等待服务器端的超时时长
timeout http-keep-alive 10s # 定义保持连接的超时时长
timeout check 10s # 健康状态监测时的超时时间,过短会误判,过长资源消耗
maxconn 3000 # 每个server最大的连接数
frontend webser #webser为名称
option forwardfor
bind *:80 #自定义监听端口
default_backend app
backend app
balance roundrobin #使用roundrobin 算法
server app1 192.168.159.120:80 check
server app2 192.168.159.121:80 check
动静分离示例
frontend webservs
bind *:80
acl url_static path_beg -i /static/images/javascript/stylesheets
acl url_static path_end -i .jpg.gif.png.css.js.html
acl url_php path_end -i .php
acl host_static hdr_beg(host) -i img. imgs. video. videos. ftp. image. download.
use_backend static if url_static or host_static
use_backend dynamic if url_php
default_backend dynamic
backend static
balance roundrobin
server node1 192.168.159.120:80 check maxconn 3000
backend dynamic
balance roundrobin
server node2 192.168.159.121:80 check maxconn 1000
五、HAProxy+Keepalived实现高可用负载均衡
下图描述了使用keepalived+Haproxy主从配置来达到能够针对前段流量进行负载均衡到多台后端web1、web2、web3、img1、img2。但是由于haproxy会存在单点故障问题,因此使用keepalived来实现对Haproxy单点问题的高可用处理。
一、环境准备:
centos系统服务器4台、两台用于做haproxy主从架构,两台作为后端server,服务器配置好
yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信。
1、准备四台主机:
一台Director-master,DIP:192.168.159.151 VIP:172.17.253.115(桥接模式和仅主机模式)
一台Director-backup,DIP:192.168.159.129 VIP:172.17.253.115(桥接模式和仅主机模式)
一台后台服务器,RIP:192.168.159.120 仅主机模式
一台后台服务器,RIP:192.168.159.121 仅主机模式
二、安装步骤:
1、iptables -F && setenforing 清空防火墙策略,关闭selinux
2、两台服务器Director-master和Director-backup都使用yum方式安装haproxy、keepalived服务
或编译安装:tar zxvf haproxy-1.4.8.tar.gz
cd haproxy-1.4.8
uname -a //查看linux内核版本
make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
3、后端服务器配置好基于LNMP架构的web服务
三、修改配置文件:
1.修改/etc/keepalived/keepalived.conf配置文件内容
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@magedu.com
smtp_server 127.0.0.1
smtp_connect_timeout 5
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 23
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass riqi
}
virtual_ipaddress {
172.17.253.115
}
}
启动服务:systemctl start keepalived
2、配置日志服务
vim /etc/rsyslog.conf
$ModLoad imudp 开启UDP的日志服务,也可以开启TCP
$UDPServerRun 514
local2.* /var/log/haproxy.log 定义日志标准
systemctl restart rsyslog 重启日志服务
3、在haproxy-master上操作haproxy配置文件,定义全局配置
vim /etc/haproxy/haproxy.conf
global #全局配置
log 127.0.0.1 local2 #日志类型
chroot /var/lib/haproxy #修改haproxy的工作目录
pidfile /var/run/haproxy.pid #进程id
maxconn 4000 #最大连接数
user haproxy #运行用户
group haproxy #所属组
daemon #让haproxy以守护进程的方式工作
defaults
mode http #实现http的七层协议
log global #日志定义,沿用global的日志文件
option httplog #启用日志记录http请求
option dontlognull#日志将不会记录空连接
option http-server-close #强制短连接
option forwardfor except 127.0.0.0/8 #添加xforward日志标记
option redispatch #出错时重新分配
retries 3 #重试次数
timeout http-request 10s #请求超时时间
timeout queue 1m #队列超时
timeout connect 10s #连接超时
timeout client 1m #客户端超时
timeout server 1m #服务端超时
timeout http-keep-alive 10s #持久连接
timeout check 10s #检查超时
maxconn 3000 #最大连接
listen stats #定义一个统计报告服务
mode http #基于http服务
bind 0.0.0.0:1080 #1080端口的全局监听
stats enable #开启统计报告服务
stats hide-version #隐藏统计报告版本信息
stats uri /haproxyadmin #统计报告访问url (假若想访问监控界面:配置stats uri /haproxy项,重启服务:访问地址为:本机IP地址:PORT或URL)
stats realm Haproxy\ Statistics #页面登陆信息
stats auth admin:admin #验证账号信息
stats admin if TRUE #验证模式
frontend web #定义一系列监听套接字
bind *:80
#acl url_static path_beg -i /static /images /javascript /stylesheets
#acl url_static path_end -i .jpg .gif .png .css .js
#use_backend static if url_static
default_backend lnmpserver
backend lnmpserver
balance roundrobin
option httpchk /index.php 检查页面
server lnmpserver1 192.168.159.120:80 check inter 3000 rise 3 fall 3
server lnmpserver2 192.168.159.121:80 check inter 3000 rise 3 fall 3
启动服务:systemctl start haproxy
netstat -nult 出现1080端口
开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
3、在haproxy-backup上操作:
修改/etc/keepalived/keepalived.conf配置文件内容
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@magedu.com
smtp_server 127.0.0.1
smtp_connect_timeout 5
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 23
priority 88
advert_int 1
authentication {
auth_type PASS
auth_pass riqi
}
virtual_ipaddress {
172.17.253.115
}
}
启动服务:systemctl start keepalived
vim /etc/haproxy/haproxy.conf
global #全局配置
log 127.0.0.1 local2 #日志类型
chroot /var/lib/haproxy #修改haproxy的工作目录
pidfile /var/run/haproxy.pid #进程id
maxconn 4000 #最大连接数
user haproxy #运行用户
group haproxy #所属组
daemon #让haproxy以守护进程的方式工作
defaults
mode http #实现http的七层协议
log global #日志定义,沿用global的日志文件
option httplog #启用日志记录http请求
option dontlognull#日志将不会记录空连接
option http-server-close #强制短连接
option forwardfor except 127.0.0.0/8 #添加xforward日志标记
option redispatch #出错时重新分配
retries 3 #重试次数
timeout http-request 10s #请求超时时间
timeout queue 1m #队列超时
timeout connect 10s #连接超时
timeout client 1m #客户端超时
timeout server 1m #服务端超时
timeout http-keep-alive 10s #持久连接
timeout check 10s #检查超时
maxconn 3000 #最大连接
listen stats #定义一个统计报告服务
mode http #基于http服务
bind 0.0.0.0:1080 #1080端口的全局监听
stats enable #开启统计报告服务
stats hide-version #隐藏统计报告版本信息
stats uri /haproxyadmin #统计报告访问url
stats realm Haproxy\ Statistics #页面登陆信息
stats auth admin:admin #验证账号信息
stats admin if TRUE #验证模式
frontend web #定义一系列监听套接字
bind *:80
#acl url_static path_beg -i /static /images /javascript /stylesheets
#acl url_static path_end -i .jpg .gif .png .css .js
#use_backend static if url_static
default_backend lnmpserver
backend lnmpserver
balance roundrobin
option httpchk /index.php 检查页面
server lnmpserver1 192.168.159.120:80 check inter 3000 rise 3 fall 3
server lnmpserver2 192.168.159.121:80 check inter 3000 rise 3 fall 3
启动服务:systemctl start haproxy
netstat -nult 出现1080端口和80端口
开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
4、测试
测试keepalived高可用:当主服务器正常工作时,VIP在主服务器上,当关闭主服务器的keepalived服务,VIP会漂移到从服务器上,而且网站照常可以访问。(关闭主服务器后IP漂移,可查看ip add)
访问:http://172.17.253.115:1080/haproxyadmin
标签:负载均衡之hapoxy
原文地址:http://blog.51cto.com/youguofusi/2046643