设为首页 收藏本站
查看: 1310|回复: 0

[经验分享] Haproxy负载均衡详解,与keepalived的搭配

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-2-27 13:12:38 | 显示全部楼层 |阅读模式
首先对比一下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~~~~   略



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348012-1-1.html 上篇帖子: 使用haproxy-实现七层负载均衡 下篇帖子: 高性能HTTP加速器varnish实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表