首先对比一下LVS/Nginx/HAProxy特点
名称 | 特点 |
LVS | 1) 抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的; 2) 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率; 3) 工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived; 4) 无流量,保证了均衡器IO的性能不会收到大流量的影响; 5) 应用范围比较广,可以对所有应用做负载均衡; 6) 软件本身不支持正则处理,不能做动静分离,这个就比较遗憾了;其实现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。 7) 如果是网站应用比较庞大的话,实施LVS/DR+Keepalived起来就比较复杂了,特别后面有Windows Server应用的机器的话,如果实施及配置还有维护过程就比较复杂了。 |
Nginx | 1) 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是许多朋友喜欢它的原因之一; 2) Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在; 3) Nginx安装和配置比较简单,测试起来比较方便; 4) 也可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量; 5) Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测; 6) Nginx仅能支持http和Email,这样就在适用范围上面小很多,这个它的弱势; 7) Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web架构,大有和以前最流行的LAMP架构分庭抗争之势,在高流量的环境中也有很好的效果。 8) Nginx现在作为Web反向加速缓存越来越成熟了,很多朋友都已在生产环境下投入生产了,而且反映效果不错,速度比传统的Squid服务器更快,有兴趣的朋友可以考虑用其作为反向代理加速器。 |
HAProxy | 1) 支持两种代理模式:TCP(四层)和HTTP(七层)HAProxy是支持虚拟主机的。 2) 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作 3) 支持url检测后端的服务器出问题的检测会有很好的帮助。 4) 它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。 5) HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived。 6) HAProxy的算法现在也越来越多了,算法特别灵活 |
Keepalived工作原理
keepalived基于VRRP协议来实现高可用,主要用作realserver的健康检查以及负载均衡主机和backup主机之间的故障漂移。如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检测服务器的状态,自动剔除与恢复。
三层机理是发送ICMP数据包即PING给某台服务器,如果不通,则认为其故障,并从服务器群中剔除;四层机理是检测TCP端口号状态来判断某台服务器是否故障,如果检测端口存在异常,则从服务器群中剔除;五层机理是根据用户的设定检查某个服务器应用程序是否正常运行,如果不正常,则从服务器群中剔除。
Haproxy工作原理
HAProxy是一种高效、可靠、免费的高可用及负载均衡解决方案,非常适合于高负载站点的七层数据请求。客户端通过HAProxy代理服务器获得站点页面,而代理服务器收到客户请求后根据负载均衡的规则将请求数据转发给后端真实服务器。
HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
准备工作
# setenforce 0 临时关闭SeLinux
修改主机名
防火墙开放22/80端口,编辑IPtables文件
-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址通信
-A RH-Firewall-1-INPUT -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允许80端口通过防火墙
测试网络连通性
更新YUM源
编译安装方法
#cd haproxy-1.4.24
#make TARGET=linux26 CPU=x86_64 PREFIX=/usr/local/haprpxy #编译 TARGET=内核版本
#make install PREFIX=/usr/local/haproxy #安装
#cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy
#ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
以下例子为yum安装
haproxy记录日志,默认haproxy是不记录日志的,为了记录日志还需要配置syslog模块,在linux下是rsyslogd服务,
用rsyslog的理由:
1.防止系统崩溃无法获取系统日志分享崩溃原因,用rsyslog可以把日志传输到远程的日志服务器上
2.使用rsyslog日志可以减轻系统压力,因为使用rsyslog可以有效减轻系统的磁盘IO
3.rsyslog使用tcp传输非常可靠,可以对日志进行过滤,提取出有效的日志,rsyslog是轻量级的日志软件,在大量日志写的情况下,系统负载基本上在0.1以下
#yum –y install rsyslog #先安装rsyslog
#cd /etc/rsyslog.d/ && touch haproxy.conf
#vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514 #基于UDP接收日志请求
*.info;mail.none;authpriv.none;cron.none;local2.none; /var/log/messages #修改
local2.* /var/log/haproxy.log ###这个必须和haproxy.cfg的配置文件一致。可多个
#vi /etc/sysconfig/syslog
SYSLOGD_OPTIONS="-r -m 0" #接收远程服务器日志
重启rsyslog
HAproxy配置
在master与backup上面同时配置
安装可采用yum直接安装,或下载tar包编译安装。
两台前端HAproxy配置一样
haproxy的配置文件通常分为三部分: global(全局配置部分) defaults(默认配置部分) listen(应用组件部分)
# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 #以日志服务器形式发往本机地址,设施名local2。在本机记录日志
chroot /var/lib/haproxy #haproxy工作目录安装目录
pidfile /var/run/haproxy.pid
maxconn 4000 #每个haproxy单进程所接受的最大并发连接数
user haproxy
group haproxy
daemon #haproxy以守护进程的方式工作于后台#以后台守护进程运行
# nbproc 8 #进程数量,可以设置多个,提高处理效率
stats socket /var/lib/haproxy/stats #统计数据保存位置
defaults
mode http #默认的模式mode #指定frontend和backend工作模式{ tcp|http|health },tcp是4层,http是7层,health只会返回OK
log global #日志使用全局中定义的日志参数
option httplog #启用http的log,启用对http请求会话计时捕获到cookie的日志,默认原格式简陋,后面还可跟参数[clf] clf格式
option dontlognull #不记录健康检查的日志信息#不记录空信息,保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
option http-server-close #启用http连接在服务器端关闭功能,支持客户端一侧长连接#每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8 # forwardfor将用户请求转发后端服时,在HTTP请求报文中添加"X-Forwarded-For"特殊首部,以便后端服记录真实发起请求的客户端IP地址,而不是代理服务器内网卡地址。#不记录本机转发的日志
option redispatch # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。#如果后端有服务器宕机,强制切换到正常服务器
# option http-pretend-keepalive #服务器端保持长连接
# option forceclose #服务端响应后主动关闭请求连接,及早释放服务连接,不必等到客户端应答确认
# option accept-invalid-http-request #接受无效的http请求,一般建议不设置,但是可解决部分杂牌浏览器访问打不开页面问题
# option abortonclose #当Haproxy服务器负载很高的时候,自动结束掉当前队列处理比较久的连接#丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
# option originalto #记录客户端访问的目的IP
retries 3 # 定义连接后端服务器的失败重连次数,三次连接失败,则判断服务不可用
timeout http-request 10s #http请求超时时间
timeout queue 1m #后端有多个服务器,当每个后端服务器都达到最大连接上限,haproxy等待发送到对应后端服务器的队列已满或请求已入列但未处理的超时时间1分种#一个请求在队列里的超时时间
timeout connect 10s #haproxy向后端服务器请求建立连接的超时时间#连接超时
timeout client 1m #发起连接请求的前端客户端连接处于非活动态的最大超时时间,过时断开,相当于Apache的timeout keepalive
timeout server 1m #服务器端连接处于非活动态的最大超时时间
timeout http-keep-alive 10s #长连接超时时间#设置http-keep-alive的超时时间
timeout check 10s #做健康状态检测的超时时间#检测超时时间
stats uri /stats #haproxy 状态页面
stats auth admin:admin #haproxy登陆验证用户名密码
stats refresh 30s #统计页面自动刷新时间
stats hide-version #隐藏统计页面上HAProxy版本信息
maxconn 3000
frontend proxy *:80 #监听地址为80
acl url_static path_beg -i /static /images /javascript /stylesheets #path_begin路径以XX开头,-i忽略大小写
acl url_static path_end -i .jpg .gif .png .css .js .html #定义静态访问规则#path_end路径以XX结尾,同名acl逻辑或关系
acl dynamic_content path_end -i .php #定义动态访问规则
use_backend static if url_static #满足ACL url_static 使用backend static。
default_backend dynamic
#调度算法动静区别在于调整配置文件haproxy.cfg,动态调整reload生效,静态调整restart生效
#轮调平均分配访问到后端服,访问动态页面需要保持会话因此source consistent源地址一致性hash算法把来自于同一客户端请求始终转发于同一台后端服
backend static
balance roundrobin #指定负载模式,roundrobin轮询模式 | source保存session值
server web01 10.10.10.11:80 check inter 2000 fall 3 weight 30 #后端静态web
server web02 10.10.10.12:80 check inter 2000 fall 3 weight 30 #每隔2000ms检查服务器80端口状态,连续失败次数3次,权重30
#inter 2000 心跳检测时间;rise 3 三次连接成功,表示服务器正常;fall 3 三次连接失败,表示服务器异常; weight 100 权重设置
backend dynamic #定义一个名为dynamic后端部分
balance roundrobin #负载均衡算法 #source,对源IP地址进行哈希;hash-type决定动态静态加hash-type consistent
server web03 10.10.10.13:80 check inter 2000 fall 3 weight 30 #后端动态web
server web04 10.10.10.14:80 check inter 2000 fall 3 weight 30
在web1,web2服务器配置中日志格式添加"X-Forwarded-For"特殊首部,以便后端服务器记录真实发起请求的客户端IP地址
验证静态页面的负载均衡,(动态页面长连接保持于同一后端服务器),动静分离。
Haproxy反代日志会详细显示前端客户端IP,Haproxy反代IP,根据动静分离ACL选择不同后端服务器,GET到不同页面。后端upstream服务器别名
以下为keepalived配置文件关键配置
notify_master "/etc/keepalived/clean_arp.sh VIP" #更新虚拟服务器(VIP)地址的arp记录到网关
vrrp_script check_Haproxy { #对集群中某服务进行监控。这里为httpd
script “” #检测端口的运行状态。判断服务是否正常。(或者“”里加脚本路径)
interval 2 #检查的时间间隔。2秒
# weight 2
fall 2 #若请求失败两次,认为此节点故障
rise 1 #若请求一次成功,认为此节点恢复正常
}
track_script {
check_Haproxy #监测Haproxy进程状态,。为vrrp_script 定义的名
}
#vi /etc/keepalived/check_haproxy.sh #编辑,添加以下代码
#########################################################
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ]
then service haproxy start
sleep 3
if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ]
then service keepalived stop
fi
fi
#vi /etc/keepalived/clean_arp.sh #编辑,添加以下代码
#!/bin/sh
VIP=$1
GATEWAY=192.168.21.2
/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null
或者以下脚本
配置haproxy的脚本脚本,在/etc/keepalived目录添加目录sripts,存放haproxy的脚本脚本。
1、check_haproxy.sh
vi/etc/keepalived/scripts/check_haproxy.sh
##脚本含义:如果没有haproxy进程存在,就启动haproxy,停止keepalived
#!/bin/bash
STARTHAPROXY="/usr/local/haproxy/sbin/haproxy -f/usr/local/haproxy/haproxy.cfg"
STOPKEEPALIVED="/etc/init.d/keepalived stop"
LOGFILE="/usr/local/keepalived/var/log/keepalived-haproxy-state.log"
echo "[check_haproxystatus]" >>$LOGFILE
A=`ps-C haproxy --no-header |wc-l`
echo "[check_haproxystatus]" >>$LOGFILE
date >>$LOGFILE
if [ $A-eq 0 ];then
echo $STARTHAPROXY>> $LOGFILE
$STARTHAPROXY >> $LOGFILE 2>&1
sleep5
fi
if [`ps -C haproxy --no-header |wc-l` -eq 0 ];then
exit 0
else
exit 1
fi
2、haproxy_master.sh(master和slave一样):
3、haproxy_backup.sh(master和slave一样)
4、haproxy_fault.sh(master和slave一样)
5、haproxy_stop.sh
在/etc/keepalived.conf配置文件去掉#好,启动这些脚本
要给脚本的权限:777
重启keepalived 服务
#Service keepalived restart
测试~~~Ing~~~~ 略
本文出自 “墨” 博客,请务必保留此出处http://jinyudong.blog.51cto.com/10990408/1900896
原文:http://jinyudong.blog.51cto.com/10990408/1900896