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

此文为转载,原文地址:https://www.cnblogs.com/kevingrace/p/5892169.html

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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 负载均衡软件的优缺点:
 
1、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 来解决。
 
2、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 就简单多了。
 
3、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 请求。
 
4、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主要在于它有如下优势:linux

1
2
3
4
5
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.ios

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

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

1
2
3
4
5
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服务器。web

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

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

1
2
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的负载均衡和高可用环境的部署过程,有主从和主主两种模式:

1
2
3
4
5
6
7
8
9
主从模式:一个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 服务器不被暴露到网络上。

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

0)需求描述:

1
2
3
4
5
网站的域名以前都是放在机房的两台服务器上,前面作CDN加速,CDN节点会同步缓存到网站数据,用户访问网站,流量压力都在前面的CDN设备上。
后续网站服务器被攻击,又在CDN前面加了一个上层,即又多加一层缓存,刚加这个上层的时候,流量回源会很大,访问量也会减小,不过随着回源,访问量渐渐恢复。
 
后来为了安全考虑,计划作Keepalivedd+Haproxy负载均衡的高可用,部署好以后,能够将后端源站服务器的外网ip拿下,进来的请求经过Haproxy代理进来,出去的请求能够经过squid代理出去。
后端源站机器的web端口只须要对Haproxy机器开放便可,而后CDN解析那边将源站ip改成Haproxy服务器ip便可。

1)环境准备

1
2
3
4
5
6
7
8
9
10
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

基本的网络拓扑图以下:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
--------------------------------------------------------------------------------------------------------------------------
关闭 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上的操做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
在两台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)

 

 

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

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

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

 

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
接着测试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服务不会关闭,即便关闭了,也会自动重启。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
主从环境相比于主主环境,区别只在于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资源的转移。
相关文章
相关标签/搜索