Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

 

Nginx、LVS、HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能。

1)在四层(tcp)实现负载均衡的软件:
lvs------>重量级
nginx------>轻量级,带缓存功能,正则表达式较灵活
haproxy------>模拟四层转发,较灵活
 
2)在七层(http)实现反向代理的软件:
haproxy------>天生技能,全面支持七层代理,会话保持,标记,路径转移;
nginx------>只在http协议和mail协议上功能比较好,性能与haproxy差不多;
apache------>功能较差<br>

总的来说,一般是lvs做4层负载;nginx做7层负载;haproxy比较灵活,4层和7层负载均衡都能做

一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析:
1)如果是中小型的 Web 应用,比如日PV小于1000 万,用 Nginx 就完全可以了;
2)如果机器不少,可以用DNS轮询, LVS所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时, 可以考虑用LVS。

还有一种是通过硬件来进行进行,常见的硬件有比较昂贵的F5和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小
的网络服务来说暂时还没有需要使用;另外一种就是类似于 Nginx/LVS/HAProxy 的基于 Linux 的开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费用非常低廉。目前关于网
站架构一般比较合理流行的架构方案: Web 前端采用Nginx/HAProxy+Keepalived 作负载均衡器;后端采用 MySQL 数据库一主多从和读写分离,采用 LVS+Keepalived 的架构。 当然要根据
项目具体需求制定方案。下面说说各自的特点和适用场合。

------------------------------------------------------------------------------------------------------------------
下面简单说下Nginx、LVS、HAProxy 负载均衡软件的优缺点:

一、Nginx的优点是:
1)工作在网络的7层之上,可以针对 http 应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比 HAProxy 更为强大和灵活,这也是它目前广泛流
行的主要原因之一, Nginx 单凭这点可利用的场合就远多于 LVS 了。
2) Nginx 对网络稳定性的依赖非常小,理论上能 ping 通就就能进行负载功能,这个也是它的优势之一;相反 LVS 对网络稳定性依赖比较大,这点本人深有体会;
3) Nginx 安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。 LVS 的配置、测试就要花比较长的时间了, LVS 对网络依赖比较大。
4)可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比 LVS 相对小些。
5) Nginx 可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。
比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障, Nginx 会把上传切到另一台服务器重新处 理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文
件的话,用户可能会因此而不满。
6)Nginx 不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的 Web 应用服务器。 LNMP 也是近几年非常流行的 web 架构,在高流量的环境中稳定性也很好。
7)Nginx 现在作为 Web 反向加速缓存越来越成熟了,速度比传统的 Squid 服务器更快,可以考虑用其作为反向代理加速器。
8)Nginx 可作为中层反向代理使用,这一层面 Nginx 基本上无对手,唯一可以对比 Nginx 的就只有 lighttpd 了,不过 lighttpd 目前还没有做到 Nginx 完全的功能,配置也不那么清晰易读,
社区资料也远远没 Nginx 活跃。
9) Nginx 也可作为静态网页和图片服务器,这方面的性能也无对手。还有 Nginx社区非常活跃,第三方模块也很多。

Nginx 的缺点是:
1)Nginx 仅能支持 http、 https 和 Email 协议,这样就在适用范围上面小些,这个是它的缺点。
2)对后端服务器的健康检查,只支持通过端口来检测,不支持通过 url 来检测。不支持 Session 的直接保持,但能通过 ip_hash 来解决。

二、LVS:使用 Linux 内核集群实现一个高性能、 高可用的负载均衡服务器,它具有很好的可伸缩性( Scalability)、可靠性( Reliability)和可管理性(Manageability)。
LVS 的优点是:
1)抗负载能力强、是工作在网络 4 层之上仅作分发之用, 没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和 cpu 资源消耗比较低。
2)配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
3)工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived,不过我们在项目实施中用得最多的还是 LVS/DR+Keepalived。
4)无流量, LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO的性能不会收到大流量的影响。
5)应用范围比较广,因为 LVS 工作在 4 层,所以它几乎可以对所有应用做负载均衡,包括 http、数据库、在线聊天室等等。

LVS 的缺点是:
1)软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是 Nginx/HAProxy+Keepalived 的优势所在。
2)如果是网站应用比较庞大的话, LVS/DR+Keepalived 实施起来就比较复杂了,特别后面有 Windows Server 的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,
Nginx/HAProxy+Keepalived 就简单多了。

三、HAProxy 的特点是:
1)HAProxy 也是支持虚拟主机的。
2)HAProxy 的优点能够补充 Nginx 的一些缺点,比如支持 Session 的保持,Cookie的引导;同时支持通过获取指定的 url 来检测后端服务器的状态。
3)HAProxy 跟 LVS 类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。
4)HAProxy 支持 TCP 协议的负载均衡转发,可以对 MySQL 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,大家可以用 LVS+Keepalived 对 MySQL主从做负载均衡。
5)HAProxy 负载均衡策略非常多, HAProxy 的负载均衡算法现在具体有如下8种:
1> roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
2> static-rr,表示根据权重,建议关注;
3> leastconn,表示最少连接者先处理,建议关注;
4> source,表示根据请求源 IP,这个跟 Nginx 的 IP_hash 机制类似,我们用其作为解决 session 问题的一种方法,建议关注;
5> ri,表示根据请求的 URI;
6> rl_param,表示根据请求的 URl 参数’balance url_param’ requires an URLparameter name;
7> hdr(name),表示根据 HTTP 请求头来锁定每一次 HTTP 请求;
8> rdp-cookie(name),表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。

四、Nginx和LVS 对比的总结:
1)Nginx 工作在网络的 7 层,所以它可以针对 http 应用本身来做分流策略,比如针对域名、目录结构等,相比之下 LVS 并不具备这样的功能,所以 Nginx 单凭这点可利用的场合就远多于LVS了;
但 Nginx 有用的这些功能使其可调整度要高于 LVS,所以经常要去触碰触碰,触碰多了,人为出问题的 几率也就会大。
2)Nginx 对网络稳定性的依赖较小,理论上只要 ping 得通,网页访问正常, Nginx就能连得通,这是 Nginx 的一大优势! Nginx 同时还能区 分内外网,如果是同时拥有内外网的节点,就相当于
单机拥有了备份线路; LVS 就比较依赖于网络环境,目前来看服务器在同一网段内并且 LVS 使用 direct 方式分流,效果较能得到保证。另外注意, LVS 需要向托管商至少申请多一个 ip 来做 
Visual IP,貌似是不能用本身的 IP 来做 VIP 的。要做好 LVS 管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个 HTTP 那么简单了。
3)Nginx 安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。 LVS 的安装和配置、测试就要花比较长的时间了; LVS 对网络依赖比较大,很多时候不能配置成功都是
因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦得多。
4)Nginx 也同样能承受很高负载且稳定,但负载度和稳定度差 LVS 还有几个等级:Nginx 处理所有流量所以受限于机器 IO 和配置;本身的 bug 也还是难以避免的。
5)Nginx 可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前 LVS 中ldirectd 也能支持针对服务器内部的情况
来监控,但 LVS 的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中 出现故障, Nginx 会把上传切到另一台服务器重新处理,而 LVS 就直接断掉了,如果
是上传一个很大的文件或者很重要的文件的话,用户可能会因此而恼火。
6)Nginx 对请求的异步处理可以帮助节点服务器减轻负载,假如使用 apache 直接对外服务,那么出现很多的窄带链接时 apache 服务器将会占用大 量内存而不能释放,使用多一个 Nginx 做 apache 
代理的话,这些窄带链接会被 Nginx 挡住,apache 上就不会堆积过多的请求,这样就减少了相 当多的资源占用。这点使用squid 也有相同的作用,即使 squid 本身配置为不缓存,对 apache 还是有
很大帮助的。
7)Nginx 能支持 http、 https 和 email( email 的功能比较少用), LVS 所支持的应用在这点上会比 Nginx 更多。在使用上,一般最 前端所采取的策略应是 LVS,也就是 DNS 的指向应为 LVS 均衡器, 
LVS 的优点令它非常适合做这个任务。重要的ip地址,最好交由 LVS 托管,比如数据 库的 ip、 webservice 服务器的 ip等等,这些 ip 地址随着时间推移,使用面会越来越大,如果更换 ip 则故障会接踵
而至。所以将这些重要 ip 交给 LVS 托管是最为稳妥的,这样做的唯一缺点是需要的 VIP 数量会比较多。Nginx 可作为 LVS 节点机器使用,一是可以利用 Nginx的功能,二是可以利 用 Nginx 的性能。当然
这一层面也可以直接使用 squid,squid 的功能方面就比 Nginx 弱不少了,性能上也有所逊色于 Nginx。Nginx 也可作为中层代理使用,这一层面 Nginx 基本上无对手,唯一可以撼动 Nginx 的就只有 lighttpd 
了,不过 lighttpd 目前还没有能做到 Nginx 完全的功能,配置也不那么清晰易读。另外,中层代理的 IP 也是重要的,所以中层代理也拥有一个VIP 和 LVS 是最完美的方案了。具体的应用还得 具体分析,如果
是比较小的网站(日 PV 小于 1000 万),用 Nginx 就完全可以了,如果机器也不少,可以用DNS 轮询, LVS 所耗费的机器还是比较多 的;大型网站或者重要的服务,机器不发愁的时候,要多多考虑利用 LVS。


现在对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术:
1)第一阶段:利用 Nginx 或 HAProxy 进行单点的负载均衡,这一阶段服务器规模刚脱离开单服务器、单数据库的模式,需要一定的负载均衡,但是仍 然规模较小没有专业的维护团队来进行维护,也没有需要进行大规模的网站部署。这样利用Nginx 或 HAproxy 就是第一选择,此时这些东西上手快, 配置容易,在七层之上利用 HTTP 协议就可以。这时是第一选择。
2)第二阶段:随着网络服务进一步扩大,这时单点的 Nginx 已经不能满足,这时使用 LVS 或者商用 Array 就是首要选择, Nginx 此时就作为 LVS 或者 Array 的节点来使用,具体 LVS 或 Array 的是选择是根据
公司规模和预算来选择,Array 的应用交付功能非常强大,本人在某项目中使用过,性价比也远高于 F5,商用首选!但是一般来说这阶段相关人才跟不上业务的提升,所以购买商业负载均衡已经成为了必经之路。
3)第三阶段:这时网络服务已经成为主流产品,此时随着公司知名度也进一步扩展,相关人才的能力以及数量也随之提升,这时无论从开发适合自身产品的定制,以及降低成本来讲开源的 LVS,已经成为首选,这时 
LVS 会成为主流。最终形成比较理想的基本架构为: Array/LVS — Nginx/Haproxy —Squid/Varnish — AppServer。

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载。HAProxy相比LVS的使用要简单很多,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。

现在用HAProxy主要在于它有以下优点:

1)免费开源,稳定性也是非常好,这个可通过我做的一些小项目可以看出来,单Haproxy也跑得不错,稳定性可以与LVS相媲美;
2)根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom's 10GbE NICs (Myri-10G PCI-Express),这个作为软件级负载均衡,也是比较惊人的;
3)HAProxy可以作为MySQL、邮件或其它的非web的负载均衡,我们常用于它作为MySQL(读)负载均衡;
4)自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警,这个也是我非常喜欢它的原因之一;
5)HAProxy支持虚拟主机。

HAProxy介绍
反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。新的1.3引入了frontend,backend;frontend根据任意 HTTP请求头内容做规则匹配,然后把请求定向到相关的backend.

keepalived简介  
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
类似的HA工具还有heatbeat、drbd等,heatbeat、drbd配置都较为复杂。

keepalived工作原理
keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。
keepalived是一个类似于layer3, 4,5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web 服务器的状态。 Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。

keepalived作用
随着网站业务量的增长,网站的服务器压力越来越大,需要负载均衡方案!商业的硬件如F5又太贵,创业型互联公司如何有效节约成本,节省不必要的浪费呢?同时实现商业硬件一样的高性能高可用的功能?有什么好的负载均衡可伸张可扩展的方案吗?答案是肯定的!有!可以利用Haproxy+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

Keepalived是一个基于VRRP协议来实现的WEB 服务高可用方案,可以利用其来避免单点故障。一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。keepalived是VRRP的完美实现!

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

VRRP协议简介
在现实的网络环境中,两台需要通信的主机大多数情况下并没有直接的物理连接。对于这样的情况,它们之间路由怎样选择?主机如何选定到达目的主机的下一跳路由,这个问题通常的解决方法有二种:

1)在主机上使用动态路由协议(RIP、OSPF等)
2)在主机上配置静态路由

很明显在主机上配置路态路由是非常不切实际的,因为管理、维护成本以及是否支持等诸多问题,配置静态路由就变得十分流行,但路由器(或者说默认网关default gateway)却经常成为单点。
VRRP的目的就是为了解决静态路由单点故障问题。VRRP通过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。

VRRP工作机制
在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台的物理的机器并不能同时工作,而是由一台称为MASTER的负责路由工作,其它的都是BACKUP,MASTER并非一成不变,VRRP让每个VRRP路由器参与竞选,最终获胜的就是MASTER。MASTER拥有一些特权,比如 拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。
VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址 224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以,在一个虚拟路由 器中,不管谁是MASTER,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为MASTER的改变而修改自己的路由配置,对他们来 说,这种主从的切换是透明的。
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRPAdvertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到广告包), 多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性。由于安全性考虑,VRRP包使用了加密协议进行加密。

----------------------------------------------------------------------------------------------------------------------------------------------------
Haproxy+Keepalived的负载均衡和高可用环境的部署过程,有主从和主主两种模式:

主从模式:一个vip,vip在master机器上,当master机器出现故障后,vip漂移到slave机器上,slave变为master提供服务。
主主模式:两个vip,两台机器都设置vip,当其中一台机器出现故障后,它的vip就漂移到另一台机器上(即另一台机器有两个vip),当故障机器恢复后,再将vip重新漂移过来。
 
各自作用:
1)Keepalived 的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除, 当web服务器工作正常
  后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的 web服务器。
2)HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点, 这些
  站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整 合进您当前的架构中, 同时
  可以保护你的 web 服务器不被暴露到网络上。

一、Haproxy+Keepalived主主架构部署记录

0)需求描述:

网站的域名之前都是放在机房的两台服务器上,前面做CDN加速,CDN节点会同步缓存到网站数据,用户访问网站,流量压力都在前面的CDN设备上。
后续网站服务器被***,又在CDN前面加了一个上层,即又多加一层缓存,刚加这个上层的时候,流量回源会很大,访问量也会减少,不过随着回源,访问量渐渐恢复。

后来为了安全考虑,计划做Keepalivedd+Haproxy负载均衡的高可用,部署好之后,可以将后端源站服务器的外网ip拿下,进来的请求通过Haproxy代理进来,出去的请求可以通过squid代理出去。
后端源站机器的web端口只需要对Haproxy机器开放即可,然后CDN解析那边将源站ip改为Haproxy服务器ip即可。

1)环境准备

Haproxy_Keepalived_Master      182.148.15.237
VIP1                           182.148.15.239

Haproxy_Keepalived_Backup      182.148.15.236
VIP2                           182.148.15.235

Real_Server1                   182.148.15.233
Real_Server2                   182.148.15.238

系统版本都是centos6.8

基本的网络拓扑图如下:

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

2)Haproxy_keepalived_Master和Haproxy_keepalived_Backup两台服务器上安装配置haproxy和keepalived的操作记录:

--------------------------------------------------------------------------------------------------------------------------
关闭 SElinux、配置防火墙(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)
[root@Haproxy_Keepalived_Master ~]# vim /etc/sysconfig/selinux
#SELINUX=enforcing                #注释掉
#SELINUXTYPE=targeted             #注释掉
SELINUX=disabled                  #增加

[root@Haproxy_Keepalived_Master ~]# setenforce 0      #临时关闭selinux。上面文件配置后,重启机器后就永久生效。

注意下面182.148.15.0/24是服务器的公网网段,192.168.1.0/24是服务器的私网网段
一定要注意:加上这个组播规则后,MASTER和BACKUP故障时,才能实现VIP资源的正常转移。其故障恢复后,VIP也还会正常转移回来。
[root@Haproxy_Keepalived_Master ~]# vim /etc/sysconfig/iptables    
.......
-A INPUT -s 182.148.15.0/24 -d 224.0.0.18 -j ACCEPT      #允许组播地址通信。 
-A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT
-A INPUT -s 182.148.15.0/24 -p vrrp -j ACCEPT            #允许 VRRP(虚拟路由器冗余协)通信
-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 

[root@Haproxy_Keepalived_Master ~]# /etc/init.d/iptables restart


----------------------------------------------------------------------------------------------------------------------
下载Haproxy地址:http://www.haproxy.org/download/1.6/src/

1)安装Haproxy(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)  注意:安装之前,先执行yum install gcc gcc-c++ make openssl-devel kernel-devel
[root@Haproxy_Keepalived_Master src]# wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.12.tar.gz
[root@Haproxy_Keepalived_Master src]# tar -zvxf haproxy-1.6.12.tar.gz
[root@Haproxy_Keepalived_Master src]# cd haproxy-1.6.12
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# make TARGET=linux26 CPU=x86_64 PREFIX=/usr/local/haprpxy USE_OPENSSL=1 ADDLIB=-lz

参数说明:
TARGET=linux26      #使用 uname -r 查看内核,如:2.6.32-642.el6.x86_64,此时该参数就为linux26
CPU=x86_64          #使用 uname -r 查看系统信息,如 x86_64 GNU/Linux,此时该参数就为 x86_64
PREFIX=/usr/local/haprpxy      #haprpxy 安装路径

[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ldd haproxy | grep ssl
  libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f6f3d9b2000)
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# make install PREFIX=/usr/local/haproxy
  
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# mkdir -p /usr/local/haproxy/conf
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# mkdir -p /etc/haproxy
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# cp /usr/local/src/haproxy-1.6.12/examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# cp -r /usr/local/src/haproxy-1.6.12/examples/errorfiles  /usr/local/haproxy/errorfiles
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# mkdir -p /usr/local/haproxy/log
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# touch /usr/local/haproxy/log/haproxy.log
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ln -s /usr/local/haproxy/log/haproxy.log /var/log/haproxy.log
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# cp /usr/local/src/haproxy-1.6.12/examples/haproxy.init /etc/rc.d/init.d/haproxy
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# chmod +x /etc/rc.d/init.d/haproxy
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# chkconfig haproxy on
[root@Haproxy_Keepalived_Master haproxy-1.6.12]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin

2)配置 haproxy.cfg 参数(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)
[root@Haproxy_Keepalived_Master ~]# cp /usr/local/haproxy/conf/haproxy.cfg /usr/local/haproxy/conf/haproxy.cfg.bak
[root@Haproxy_Keepalived_Master ~]# vim /usr/local/haproxy/conf/haproxy.cfg
global                               
   log 127.0.0.1 local3 info         #在本机记录日志
   maxconn 65535                     #每个进程可用的最大连接数
   chroot /usr/local/haproxy         #haproxy 安装目录
   uid 99                            #运行haproxy的用户uid(cat /etc/passwd 查看,这里是nobody的uid)
   gid 99                            #运行haproxy的用户组id(cat /etc/passwd 查看,这里是nobody组id)
   daemon                            #以后台守护进程运行

defaults
   log global
   mode http                         #运行模式 tcp、 http、 health
   retries 3                         #三次连接失败,则判断服务不可用
   option redispatch                 #如果后端有服务器宕机,强制切换到正常服务器
   stats uri /haproxy                #统计页面 URL 路径
   stats refresh 30s                 #统计页面自动刷新时间
   stats realm haproxy-status        #统计页面输入密码框提示信息
   stats auth admin:dxInCtFianKtL]36   #统计页面用户名和密码
   stats hide-version                 #隐藏统计页面上 HAProxy 版本信息
   maxconn 65535                     #每个进程可用的最大连接数
   timeout connect 5000              #连接超时
   timeout client 50000              #客户端超时
   timeout server 50000              #服务器端超时

frontend http-in                     #自定义描述信息
   mode http                         #运行模式 tcp、 http、 health
   maxconn 65535                     #每个进程可用的最大连接数
   bind :80                          #监听 80 端口
   log global                        
   option httplog                    
   option httpclose                  #每次请求完毕后主动关闭 http 通道
   acl is_a hdr_beg(host) -i www.wangshibo.com        #规则设置,-i 后面是要访问的域名
   acl is_b hdr_beg(host) -i www.guohuihui.com        #如果多个域名,就写多个规则,一规则对应一个域名;即后面有多个域名,就写 is_c、 is-d….,这个名字可以随意起。但要与下面的use_backend 对应
   use_backend web-server if is_a    #如果访问 is_a 设置的域名,就负载均衡到下面backend 设置的对应 web-server 上。web-server所负载的域名要都部署到下面的web01和web02上。如果是不同的域名部署到不同的机器上,就定义不同的web-server。
   use_backend web-server if is_b

backend web-server
   mode http
   balance roundrobin                #设置负载均衡模式,source 保存 session 值,roundrobin 轮询模式
   cookie SERVERID insert indirect nocache
   option httpclose
   option forwardfor
   server web01 182.148.15.233:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
   server web02 182.148.15.238:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5

注意参数解释:inter 2000 心跳检测时间;rise 2 三次连接成功,表示服务器正常;fall 5 三次连接失败,表示服务器异常; weight 1 权重设置


3)启动haproxy(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)
[root@Haproxy_Keepalived_Master ~]# service haproxy start    #启动
[root@Haproxy_Keepalived_Master ~]# service haproxy stop     #关闭
[root@Haproxy_Keepalived_Master ~]# service haproxy restart  #重启
[root@Haproxy_Keepalived_Master ~]# service haproxy status   #查看服务状态

4)设置HAProxy日志(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)
[root@Haproxy_Keepalived_Master ~]# vim /etc/rsyslog.conf
.......
$ModLoad imudp                       #取消注释 ,这一行不注释,日志就不会写
$UDPServerRun 514                    #取消注释 ,这一行不注释,日志就不会写
.......
local0.*                                                /var/log/haproxy.log      #这一行可以没有,可以不用写
local3.*                                                /var/log/haproxy.log      #这一行必须要写

[root@Haproxy_Keepalived_Master ~]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r -m 0"           #接收远程服务器日志

[root@Haproxy_Keepalived_Master ~]# service rsyslog restart


-------------------------------------------------------------------------------------------------------------------------

1)安装Keepalived(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)
[root@Haproxy_keepalived_Master ~]# yum install -y openssl-devel
[root@Haproxy_keepalived_Master ~]# cd /usr/local/src/
[root@Haproxy_keepalived_Master src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
[root@Haproxy_keepalived_Master src]# tar -zvxf keepalived-1.3.5.tar.gz
[root@Haproxy_keepalived_Master src]# cd keepalived-1.3.5
[root@Haproxy_keepalived_Master keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived
[root@Haproxy_keepalived_Master keepalived-1.3.5]# make && make install
      
[root@Haproxy_keepalived_Master keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
[root@Haproxy_keepalived_Master keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@Haproxy_keepalived_Master keepalived-1.3.5]# mkdir /etc/keepalived/
[root@Haproxy_keepalived_Master keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@Haproxy_keepalived_Master keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@Haproxy_keepalived_Master keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local

[root@Haproxy_keepalived_Master keepalived-1.3.5]# chmod +x /etc/rc.d/init.d/keepalived      #添加执行权限
[root@Haproxy_keepalived_Master keepalived-1.3.5]# chkconfig keepalived on                   #设置开机启动
[root@Haproxy_keepalived_Master keepalived-1.3.5]# service keepalived start                   #启动
[root@Haproxy_keepalived_Master keepalived-1.3.5]# service keepalived stop                    #关闭
[root@Haproxy_keepalived_Master keepalived-1.3.5]# service keepalived restart                 #重启

2)Haproxy_Keepalived_Master服务器上的Keepalived配置如下:
[root@Haproxy_Keepalived_Master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-bak
[root@Haproxy_Keepalived_Master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
  notification_email {
    root@localhost
    }

notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAproxy237
}

vrrp_script chk_haproxy {                                   #HAproxy 服务监控脚本                     
  script "/etc/keepalived/check_haproxy.sh"
  interval 2
  weight 2
}

vrrp_instance VI_1 { 
  state MASTER 
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
}
  track_script {
    chk_haproxy 
}
virtual_ipaddress {
    182.148.15.239 
}
notify_master "/etc/keepalived/clean_arp.sh 182.148.15.239" 
}
vrrp_instance VI_2 {
  state BACKUP
  interface eth0
  virtual_router_id 52
  priority 99
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
}
virtual_ipaddress {
  182.148.15.235
}
notify_master "/etc/keepalived/clean_arp.sh 182.148.15.235"
}


3)Haproxy_Keepalived_Backup服务器上的Keepalived配置如下:
[root@Haproxy_Keepalived_Backup ~]# /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-bak
[root@Haproxy_Keepalived_Backup ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
  notification_email {
    root@localhost
    }

notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAproxy236
}

vrrp_script chk_haproxy {                             
  script "/etc/keepalived/check_haproxy.sh"
  interval 2
  weight 2
}

vrrp_instance VI_1 { 
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 99
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
}
  track_script {
    chk_haproxy 
}
virtual_ipaddress {
    182.148.15.239
}
notify_master "/etc/keepalived/clean_arp.sh 182.148.15.239" 
}
vrrp_instance VI_2 {
  state MASTER
  interface eth0
  virtual_router_id 52
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
}
virtual_ipaddress {
  182.148.15.235
}
notify_master "/etc/keepalived/clean_arp.sh 182.148.15.235"
}

4)设置HAproxy服务监控脚本(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)
[root@Haproxy_Keepalived_Master ~]# vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ];then
/etc/init.d/haproxy start
sleep 3
if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi

[root@Haproxy_Keepalived_Master ~]# chmod +x /etc/keepalived/check_haproxy.sh

5)设置更新虚拟服务器(VIP)地址的arp记录到网关脚本(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)
[root@Haproxy_Keepalived_Master ~]# vim /etc/keepalived/clean_arp.sh
#!/bin/sh
VIP=$1
GATEWAY=182.148.15.254                                      #这个是本机的外网网卡网关地址
/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null

6)系统内核优化(Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器都要操作)
[root@Haproxy_Keepalived_Master ~]# echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
[root@Haproxy_Keepalived_Master ~]# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
[root@Haproxy_Keepalived_Master ~]# echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
[root@Haproxy_Keepalived_Master ~]# echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
[root@Haproxy_Keepalived_Master ~]# echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
[root@Haproxy_Keepalived_Master ~]# echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
[root@Haproxy_Keepalived_Master ~]# echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
[root@Haproxy_Keepalived_Master ~]# echo 0 > /proc/sys/net/ipv4/tcp_timestamps
[root@Haproxy_Keepalived_Master ~]# echo 0 > /proc/sys/net/ipv4/tcp_ecn
[root@Haproxy_Keepalived_Master ~]# echo 1 > /proc/sys/net/ipv4/tcp_sack
[root@Haproxy_Keepalived_Master ~]# echo 0 > /proc/sys/net/ipv4/tcp_dsack

7)分别启动Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup的keealived和haproxy服务,并查看vip
[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived start
[root@Haproxy_Keepalived_Master ~]# /etc/init.d/haproxy start
[root@Haproxy_Keepalived_Master ~]# ip addr               
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
    inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0
    inet 182.148.15.239/32 scope global eth0
    inet6 fe80::5054:ff:fe68:dcb6/64 scope link 
       valid_lft forever preferred_lft forever

[root@Haproxy_Keepalived_Backup ~]# /etc/init.d/keepalived start
[root@Haproxy_Keepalived_Backup ~]# /etc/init.d/haproxy start
[root@Haproxy_Keepalived_Backup ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff
    inet 182.148.15.236/27 brd 182.148.15.255 scope global eth0
    inet 182.148.15.235/32 scope global eth0
    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link 
       valid_lft forever preferred_lft forever

3)两台Real Server上的操作

在两台Real Server上配置好nginx,nginx安装配置过程省略。
 
分别在两台Real Server上配置两个域名www.wangshibo.com和www.guohuihui.com

在Haproxy_Keepalived_Master 和 Haproxy_Keepalived_Backup两台机器上要能正常访问这两个域名
[root@Haproxy_Keepalived_Master ~]# curl http://www.wangshibo.com
this is page of Real_Server1:182.148.15.238 www.wangshibo.com
[root@Haproxy_Keepalived_Master ~]# curl http://www.guohuihui.com
this is page of Real_Server2:182.148.15.238 www.guohuihui.com

[root@Haproxy_Keepalived_Backup ~]# curl http://www.wangshibo.com
this is page of Real_Server1:182.148.15.238 www.wangshibo.com
[root@Haproxy_Keepalived_Backup ~]# curl http://www.guohuihui.com
this is page of Real_Server2:182.148.15.238 www.guohuihui.com

关闭182.148.15.238这台机器(即Real_Server2)的nginx,发现对于域名的请求就会到Real_Server1上
[root@Real_Server2 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@Real_Server2 ~]# lsof -i:80

[root@Haproxy_Keepalived_Master ~]# curl http://www.wangshibo.com
this is page of Real_Server1:182.148.15.233 www.wangshibo.com
[root@Haproxy_Keepalived_Master ~]# curl http://www.guohuihui.com
this is page of Real_Server1:182.148.15.233 www.guohuihui.com
[root@Haproxy_Keepalived_Backup ~]# curl http://www.wangshibo.com
this is page of Real_Server1:182.148.15.233 www.wangshibo.com
[root@Haproxy_Keepalived_Backup ~]# curl http://www.guohuihui.com
this is page of Real_Server1:182.148.15.233 www.guohuihui.com

另外,设置这两台Real Server的iptables,让其80端口只对前面的两个vip资源开放
[root@Real_Server1 ~]# vim /etc/sysconfig/iptables
......
-A INPUT -s 182.148.15.235 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -s 182.148.15.239 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
[root@Real_Server1 ~]# /etc/init.d/iptables restart

4)测试 HAProxy+Keepalived 是否正常运行
将www.wangshibo.com和www.guohuihui.com域名解析到这两个VIP资源上
打开 HAProxy 监控页面。输入在haproxy.cfg文件里配置的用户名和密码(如上,即用户名admin和密码dxInCtFianKtL]36)

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

 

 Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

可以看出后端两台Real Server服务器的web状态,如上截图,发现web01状态是ok的,web02状态是down,即Real_Server2这台服务器的nginx进程关闭,它已不在负载均衡内。
启动web02的nginx,再次查看,就在负载均衡内了

[root@Real_Server2 ~]# /usr/local/nginx/sbin/nginx

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

 在浏览器里访问这两个域名,是可以正常访问的,如下访问请求负载到Real Server1(即182.148.15.233这台机器上)

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

 

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

尝试关闭Real Server1的nginx,再次访问这两个域名,发现访问请求就会负载到另一台Real Server2机器上了

[root@Real_Server1 ~]# /usr/local/nginx/sbin/nginx -s stop

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

接着测试Keepalived心跳测试的高可用
默认情况下,Haproxy_Keepalived_Master 和Haproxy_Keepalived_Backup 这两台机器各自绑定自己的vip,并都提供服务。使用ip addr可以查看到VIP情况
[root@Haproxy_Keepalived_Master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
    inet 182.48.115.237/27 brd 182.48.115.255 scope global eth0
    inet 182.48.115.239/32 scope global eth0
    inet6 fe80::5054:ff:fe68:dcb6/64 scope link 
       valid_lft forever preferred_lft forever

[root@Haproxy_Keepalived_Backup ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff
    inet 182.48.115.236/27 brd 182.48.115.255 scope global eth0
    inet 182.48.115.235/32 scope global eth0
    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link 
       valid_lft forever preferred_lft forever


1)先关闭 Haproxy_Keepalived_Master的keepalived服务。查看/var/log/message日志,可以发现VIP资源已经转移走了
[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived stop
Stopping keepalived:                                       [  OK  ]

[root@Haproxy_Keepalived_Master ~]# tail -f /var/log/messages
May  5 16:16:45 Haproxy_Keepalived_Master Keepalived_vrrp[29820]: VRRP_Instance(VI_1) sent 0 priority
May  5 16:16:45 Haproxy_Keepalived_Master Keepalived_vrrp[29820]: VRRP_Instance(VI_1) removing protocol VIPs.

[root@Haproxy_Keepalived_Master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
    inet 182.48.115.237/27 brd 182.48.115.255 scope global eth0
    inet6 fe80::5054:ff:fe68:dcb6/64 scope link 
       valid_lft forever preferred_lft forever

接着查看Haproxy_Keepalived_Backup的/var/log/messages日志,发现已经将Haproxy_Keepalived_Master的VIP接管过来了
[root@Haproxy_Keepalived_Backup ~]# tail -f /var/log/messages
.......
May  5 16:16:45 locahost Keepalived_vrrp[23381]: VRRP_Instance(VI_1) Transition to MASTER STATE
May  5 16:16:46 locahost Keepalived_vrrp[23381]: VRRP_Instance(VI_1) Entering MASTER STATE
May  5 16:16:46 locahost Keepalived_vrrp[23381]: VRRP_Instance(VI_1) setting protocol VIPs.
May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239
May  5 16:16:46 locahost Keepalived_vrrp[23381]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 182.48.115.239
May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239
May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239
May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239
May  5 16:16:46 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239
May  5 16:16:51 locahost Keepalived_vrrp[23381]: Sending gratuitous ARP on eth0 for 182.48.115.239

[root@Haproxy_Keepalived_Backup ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff
    inet 182.48.115.236/27 brd 182.48.115.255 scope global eth0
    inet 182.48.115.235/32 scope global eth0
    inet 182.48.115.239/32 scope global eth0
    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link 
       valid_lft forever preferred_lft forever

在浏览器里访问这两个域名,发现访问正常,没有受到影响!

然后将Haproxy_Keepalived_Master的Keepalived服务启动,就会发现它的vip又会自动转移回来
[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]
[root@Haproxy_Keepalived_Master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
    inet 182.48.115.237/27 brd 182.48.115.255 scope global eth0
    inet 182.48.115.239/32 scope global eth0
    inet6 fe80::5054:ff:fe68:dcb6/64 scope link 
       valid_lft forever preferred_lft forever

而此时Haproxy_Keepalived_Backup的只有自己的vip了
[root@Haproxy_Keepalived_Backup ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff
    inet 182.48.115.236/27 brd 182.48.115.255 scope global eth0
    inet 182.48.115.235/32 scope global eth0
    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link 
       valid_lft forever preferred_lft forever

同理,关闭Haproxy_Keepalived_Backup的keepalived,它的vip也会转移到Haproxy_Keepalived_Master机器上,等它重新启动keepalived后,它的vip也会重新转移回来!

--------------------------------------------------------------------------------------------------------------

最后关闭Haproxy_Keepalived_Master的haproxy进程,发现haproxy进程关闭后,vip资源还在,说明还在提供服务。
这是因为在keepalived.conf文件里配置了haproxy进程的监控脚本,当haproxy进程关闭后,会自动执行监控脚本,当发现haproxy进程不在后,最多2s就会启动,如若haproxy启动失败,才会强制关闭keeaplived服务,
此时就会转移vip到另一台机器上。所以,一般在keepalived服务启动的情况下,haproxy服务不会关闭,即使关闭了,也会自动重启。

---------------------------------------------------------------------------------------------------
二、Haproxy+Keepalived主从模式的高可用环境

主从环境相比于主主环境,区别只在于keepalived.conf的配置不同,其他的配置都和主主模式下的一样,并且主从环境下只有一个VIP(默认在Master端配置)
比如:VIP为182.148.15.239
 
1)Haproxy_Keepalived_Master服务器上的Keepalived配置如下:
[root@Haproxy_Keepalived_Master ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
  notification_email {
    root@localhost
    }
 
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAproxy237
}
 
vrrp_script chk_haproxy {                            
  script "/etc/keepalived/check_haproxy.sh"
  interval 2
  weight 2
}
 
vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
}
  track_script {
    chk_haproxy
}
virtual_ipaddress {
    182.148.15.239
}
notify_master "/etc/keepalived/clean_arp.sh 182.148.15.239"
}
 
2)Haproxy_Keepalived_Backup服务器上的Keepalived配置如下:
[root@Haproxy_Keepalived_Backup ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
  notification_email {
    root@localhost
    }
 
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAproxy236
}
 
vrrp_script chk_haproxy {                            
  script "/etc/keepalived/check_haproxy.sh"
  interval 2
  weight 2
}
 
vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 99
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
}
  track_script {
    chk_haproxy
}
virtual_ipaddress {
    182.148.15.239
}
notify_master "/etc/keepalived/clean_arp.sh 182.148.15.239"
}
 
 
3)分别重启两台机器的keepalived服务,再次查看vip,发现vip默认是在Haproxy_Keepalived_Master下
[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived restart
Stopping keepalived:                                       [  OK  ]
Starting keepalived:                                       [  OK  ]
[root@Haproxy_Keepalived_Master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
    inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0
    inet 182.148.15.239/32 scope global eth0
    inet6 fe80::5054:ff:fe68:dcb6/64 scope link
       valid_lft forever preferred_lft forever
 
[root@Haproxy_Keepalived_Backup ~]# /etc/init.d/keepalived restart
Stopping keepalived:                                       [  OK  ]
Starting keepalived:                                       [  OK  ]
[root@Haproxy_Keepalived_Backup ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff
    inet 182.148.15.236/27 brd 182.148.15.255 scope global eth0
    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link
       valid_lft forever preferred_lft forever
 
4)测试
关闭Haproxy_Keepalived_Master的keepalived进程,发现VIP资源已经漂移到Haproxy_Keepalived_Backup上了
[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived stop
Stopping keepalived:                                       [  OK  ]
[root@Haproxy_Keepalived_Master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
    inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0
    inet6 fe80::5054:ff:fe68:dcb6/64 scope link
       valid_lft forever preferred_lft forever
 
查看Haproxy_Keepalived_Backup机器,发现VIP已经转移过来
[root@Haproxy_Keepalived_Backup ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:7c:b8:f0 brd ff:ff:ff:ff:ff:ff
    inet 182.148.15.236/27 brd 182.148.15.255 scope global eth0
    inet 182.148.15.239/32 scope global eth0
    inet6 fe80::5054:ff:fe7c:b8f0/64 scope link
       valid_lft forever preferred_lft forever
 
然后再次启动Haproxy_Keepalived_Master的keepalived进程,发现VIP资源又转移回来。
[root@Haproxy_Keepalived_Master ~]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]
[root@Haproxy_Keepalived_Master ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
    inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0
    inet 182.148.15.239/32 scope global eth0
    inet6 fe80::5054:ff:fe68:dcb6/64 scope link
       valid_lft forever preferred_lft forever
 
再以上测试过程中,对于两个测试域名的访问时不受影响的。
 
--------------------------------------------------------------------------------------
关闭Haproxy进程,由于已经在keepalived.conf文件里配置了chk_haproxy的监控脚本,即:
Haproxy进程关闭后,会自动执行这个监控脚本区启动haproxy,如果启动失败,就会强制关闭keepalived进程,从而实现VIP资源的转移。
上一篇:HAProxy基于KeepAlived实现Web高可用及动静分离


下一篇:keepalived+haproxy搭建高可用服务