lvs-nat模式

LVS-nat模式前端

lvs-dr模式下:修改数据包的mac地址、数据包出去的时候是由真实服务器直接发送给客户端
lvs-nat模式下:修改数据包的ip地址、数据包出去的时候是由真实服务器发送给调度服务器,而后由调度服务器再转发给客户端。
lvs-nat模式:因为nat模式下在调度服务器常常修改数据包内的ip,数据包进来和出去都要修改ip,集群系统中的真实服务器若不少,数据量就很大,那么对调度服务器的性能要求就高,因此调度服务器会成为瓶颈。
工做原理:node

(1)客户端向防火墙(开启路由转发)发送请求数据包(源ip是客户端、目标ip是防火墙)
 防火墙---->调度服务器(源ip是客户端目标ip是调度服务器)web

(2)调度服务器根据调度算法选择一台真实服务器,将数据包转发给它(源ip是客户端,目标ip是真实服务器)算法

(3)真实服务器收到数据包以后进行处理,而后再将回应数据包发送给调度服务器(源ip是真实服务器,目标ip是客户端)
调度服务器-->防火墙(源ip是真实服务器,目标ip是客户端)数据库

(4)调度服务器再转发给客户端(源ip是真实服务器,目标ip是客户端)

防火墙为何要开启路由转发,调度服务器为何要开启路由转发?
 不一样网段通讯交给路由器。跨网段了,必须得查找路由,若没有路由,则只能是默认路由,那默认路由在这里就是网关的呀,网关通常有两个ip,若是不开启路由 转发功能,就不会有路由表,不会有另外一个网段的路由记录,也就不知道应该如何走,那么就只能和另外一个网段的网卡上的ip通讯,而另外一个网段上的全部的其余 ip都不能通(结合图理解)。因此要开启路由转发功能。安全

   路由转发:路由器 把IP数据包的目IP地址和路由表对比,找到匹配的路由表项以后,根据这个路由表项的指示将数据包转发给下一个网络设备或PC。服务器

(1)dnat--->数据包进去时:目标地址转发dnat,即客户端要访问防火墙上的某个ip的某个端口,它就会把这个ip该为后面调度服务器上的ip的某个端口(结合图理解)dnat就是外网访问内网时,修改成内网的一个ip
如上图:客户端能访问到防火墙的eth0,可是访问不到防火墙的eth1,由于那是内网了,eth1是私有地址。(能够搞成公网地址可是一、公网地址浪费财力二、公网地址少),那么问题来了,它也要访问调度服务器,而调度服务器也是私有地址,如何才能访问呢。
 当你访问到防火墙(保护做用)的eth0时,它就转发到调度服务器的eth0或者某个端口好比(192.168.10.6:80)访问其余端口不转发。也就是说dnat其实就是写一条防火墙规则,匹配该规则就转发,不匹配就不转发。
(2)snat--->数据包出来时:源地址转发snat,即当内网的某个网络或某个ip要访问外网的时候就把它改成网关上的另外一个ip(结合图理解) snat就是内网访问外网时,修改成外网的一个ip
如:# iptables -t nat -A POSTROUTING -s192.168.0.0/24 -j SNAT --to 1.1.1.1 将内网192.168.0.0/24的源地址修改成外网的1.1.1.1,用于NAT网络

LVS+Heartbeat+Ldirectord负载均衡

(1)客户端发送请求包给load balancer的虚拟ip(vip,是在网卡上设置虚拟ip)(源ip是客户端,目标ip是load balancer的vip),
 (为何数据包要发送给load balancer的vip而不是发给实际的ip呢?那怎么作高可用呀,高可用就是一个挂了,另外一个还能够继续提供服务,即就是作热备。你把数据包给了这个实际ip,那么问题来了,这个调度服务器挂了,访问不了了。heartbeat就是利用心跳线作高可用的,一旦收不到另外一台的心跳就会得到vip,对呀, 主挂了,那么能够用备的实际ip啊。这样就能够提供服务了啊,能够人家不知道你是备用的调度服务器啊怎么访问你。再说你的实际ip也和主的实际ip不同 啊。那我能够用arp广播啊,告诉客户端个人ip是多少,它就能够访问了啊。那你不用heartbeat心跳线,你怎么知道主挂了呢。我能够用arp广播 啊或者用ping啊,主若是一直不回应我,那不就是挂了吗那我就能够用备的实际ip来提供服务啊。你是要有客户端吧,客户端只访问一个ip,arp广播 啊,告诉客户端备ip是什么。个人天。你访问的淘宝的时候,www.baidu.com,你点击连接而后域名解析到一个ip,你只知道一个ip,怎么会知 道另外一个ip,就算是arp,你也只能根它是同一个局域网才能知道。)ssh

(2)load balancer根据调度算法选择集群系统中的一台真实服务器,而后将该请求包发送给真实服务器。
( 源ip是客户端,目标ip是真实服务器的vip,因为两台load balancer和全部真实服务器的vip都是同一个虚拟ip,因此此时要修改mac地址为真实服务器的mac)

(当调度服务器把数据包发给真实服务器时,因为全部真实服务器的vip都是同样的,因此数据包就不知道要到哪台服务器上,因此此时用到mac地址。)
(两台调度服务器,一个主,一个备。主和备的虚拟ip也是同一个是浮动的ip,当备经过heartbeat得知主失效后,就会自动成为主,而后接管主调度上的服务或者资源)
(两台调度服务器得设置实际的ip,而不能只有vip,由于两台机器上的vip是同一个vip,那怎么通讯啊。因此仍是得设置实际的ip)
(调度服务器和真实服务器之间通讯能够经过vip吗?哎又是同一个问题,全部的vip都是同样的。再说了,ipvsadm也要用到实际的ip。 ipvsadm指明的是调度的算法和调度的ip。不设置实际的ip,调度服务器把数据包调度给谁呀。不是修改来mac地址了吗。那也得知道实际ip才能用arp获得mac地址啊。。因此真实服务器也得有实际的ip才能够。)
(heartbeat最核心的包括两个部分:心跳检测部分和资源接管部分。心跳检测能够经过网络链路和串口进行,并且支持冗余链路,它们之间相互发送报文来告诉对方本身当前的状态,若是在指定时间内未收到对方发送的报文,那么就认为对方失效,这时启动资源接管模块来接管运行在对方主机上的资源或服务等。)
(抑制arp广播:由于全部真实服务器的vip都是同样的。禁arp就是不让交换机知道它有这个vip。由于交换机会记录ip和mac。进来的时候是根据 交换机找内网主机的。交换机也是有条目的。交换机记录了整个局域网内全部的ip和mac的映射,虽然主机上也会有ip和mac的映射,可是只记录的是经过 信的主机的ip和mac。防止内网ip冲突。)
(自路由:就是真实服务器上的vip要和本身的实际ip进行通讯,数据包出去的时候就是在vip那个网口上,而vip要发数据出去必需要读路由嘛。问题是 它没有路由。设置vip的时候,它是32位的子网掩码,也就是说它本身是一个网段也就它一个ip。设置vip时就必须给它设置为32位的子网掩码,让它不 能和别人进行通讯。那真实服务器的vip是怎么和它的实际ip进行通讯的呢。添加自路由route add -host ip dev eth0:0 最好把它写进rc.local让它开机启动 ip指的是真实ip,vip是在dev eth0:0 准确的说是vip经过真实ip往外通讯)

(3)真实服务器对该请求包进行处理以后,将数据包发送给客户端(源ip是vip,目标ip是客户端)

heartbeat的调度服务器超过两台怎么实现的?

Heartbeat只能是两台调度服务器,不能有多台。心跳线嘛

若是用keepalive就能够:

调度服务器能够为多台,一主多备,或者 互为主主。用到的是vrrp协议。如果互为主主的话,刚开始的那一台主调度服务器,是根据受权值来判断刚开始谁是那台主调度。spacer.gif这个就是受权值 。spacer.gif这个是规定这台机器是主仍是备

VRRP虚拟路由冗余协议(Virtual RouterRedundancy Protocol,简称VRRP) 容错协议

Keepalived就是用的这个vrrp协议。

VRRP的工做过程以下:

1.       路由器开启VRRP功能后,会根据优先级肯定本身在备份组中的角色。优先级高的路由器成为主用路由器,优先级低的成为备用路由器。主用路由器按期发送VRRP通告报文,通知备份组内的其余路由器本身工做正常;备用路由器则启动定时器等待通告报文的到来。

2.       VRRP在不一样的主用抢占方式下,主用角色的替换方式不一样:

l在抢占方式下,当主用路由器收到VRRP通告报文后,会将本身的优先级与通告报文中的优先级进行比较。若是大于通告报文中的优先级,则成为主用路由器;不然将保持备用状态。

l在非抢占方式下,只要主用路由器没有出现故障,备份组中的路由器始终保持主用或备用状态,备份组中的路由器即便随后被配置了更高的优先级也不会成为主用路由器。

3.       若是备用路由器的定时器超时后仍未收到主用路由器发送来的VRRP通告报文,则认为主用路由器已经没法正常工做,此时备用路由器会认为本身是主用路由器,并对外发送VRRP通告报文。备份组内的路由器根据优先级选举出主用路由器,承担报文的转发功能

 

 

1、负载均衡 
  负载均衡的目的就是将大量的负载请求经过负载均衡调度转发将请求分发到提供相同应用的不一样服务器上,提供一个单独服务器所不具有的负载能力。一般将提供实际服务的服务器群叫作real server,好比实际提供smtp、http服务的服务器。而提供负载分发功能的这个设备就是负载均衡设备,硬件的有经常使用的Radware,Alten 等,软件的就是lvs。对于用户来讲,须要一个提供统一的入口地址来访问,这个地址就是VIP(虚拟IP virtual ip)地址。用户只关心VIP地址,LVS负责把VIP的请求分发给real server 
 loader balancer是整个集群系统的前端,负责把客户请求转发到real server上。
 Backup 是备份调度服务器,当Load balancer不可用时接替它,成为实际的real server。
 heartbeat安装在load balancer和backup上,运行于active/standby模式。当load balancer失效时,Backup自动激活成为实际的load balancer。切换到active模式时,按顺序启动virtual ip、ipvs、ldirectord;切换到standby模式时,按顺序关闭ldirectord、ipvs、virtualip。
 ipvs是LVS集群系统的核心软件,主要做用是安装在load balancer上,把发往virtual ip的请求转发到真实服务器上。

2、Heartbeat

HeartBeat的做用:

经过HeartBeat,能够将资源(IP以及程序服务等资源)从一台已经故障的计算机快速转移到另外一台正常运转的机器上继续提供服务,通常称之为高可用的服务。在实际的生产应用场景中,heartbeat的功能和另外一个高可用的开源软件keepalived有不少的相同之处,在咱们实际的生产业务中也是有区别的。

HeartBeat的工做原理:

经过修改Heartbeat的软件的配置文件,能够制定哪一台Heartbeat服务器做为主服务器,则另外一台将自动成为热备服务器。而后在热备服务器上配置Heartbeat守护程序来监听来自主服务器的心跳消息。若是热备服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转义程序,并取得主服务器上的相关资源服务的全部权,接替主服务器继续不间断的提供服务,从而达到资源以及服务高可用的目的。

 以 上的描述heartbeat的主备模式,heartbeat还支持主主模式,即两台服务器互为主备,这是他们之间还会互相发送报文来告诉对方本身的当前的 状态,若是在指定的时间内未收到对方发送的心跳报文,那么,一方就会认为对方失效或者是已宕机了,这时每一个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者是服务,继续为用户提供服务。通常状况下,能够较好的实现一台主机故障后,企业业务可以不间断的持续的提供服务。注意:所谓 的业务不间断,在故障转移期间也是须要切换时间的,heartbeat的切换时间是5-20秒。

切换的常见条件:1)服务器宕机  2)Heartbeat服务本故障  3)中间的链接线路故障

应用服务故障则不会产生切换,能够经过服务宕机把heartbeat服务停掉。

ldirectord是heartbeat中的一部分,当咱们安装了heartbeat就带了ldirectord(1)heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测能够经过网络链路和串口进行,并且支持冗余链路,它们之间相互发送报文来告诉对方本身当前的状态,若是在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。

  Heartbeat仅仅是个HA软件,它仅能完成心跳监控和资源接管,不会监视它控制的资源或应用程序。要监控资源和应用程序是否运行正常,必须使用第三方的插件,例如ipfail、Ldirector等 

 Ldirector是一个监控集群服务节点运行状态的插件。Ldirector若是监控到集群节点中某个服务出现故障,就屏蔽此节点的对外链接功能,同时将后续请求转移到正常的节点提供服务。这个插件常常用在LVS负载均衡集群中。

 Ldirector自动检测后台Realserver的运行情况,并采起响应的措施。

  (2)HeartBeat 运行于备用主机上的Heartbeat能够经过以太网链接检测主服务器的运行状态,一旦其没法检测到主服务器的"心跳"则自动接管主服务器的资源。一般情 况下,主、备服务器间的心跳链接是一个独立的物理链接,这个链接能够是串行线缆、一个由"交叉线"实现的以太网链接。Heartbeat甚至可同时经过多 个物理链接检测主服务器的工做状态,而其只要能经过其中一个链接收到主服务器处于活动状态的信息,就会认为主服务器处于正常状态。从实践经验的角度来讲,建议为Heartbeat配置多条独立的物理链接,以免Heartbeat通讯线路自己存在单点故障。

一、串行电缆:被认为是比以太网链接安全性稍好些的链接方式,由于hacker没法经过串行链接运行诸如telnet、ssh或rsh类的程序,从而能够下降其经过已劫持的服务器再次侵入备份服务器的概率。但串行线缆受限于可用长度,所以主、备服务器的距离必须很是短。

二、以太网链接:使用此方式能够消除串行线缆的在长度方面限制,而且能够经过此链接在主备服务器间同步文件系统,从而减小了从正常通讯链接带宽的占用。

基 于冗余的角度考虑,应该在主、备服务器使用两个物理链接传输heartbeat的控制信息;这样能够避免在一个网络或线缆故障时致使两个节点同时认为自已经是惟一处于活动状态的服务器从而出现争用资源的状况,这种争用资源的场景便是所谓的"脑裂"(split-brain)或"partitionedcluster"。在两个节点共享同一个物理设备资源的状况下,脑裂会产生至关可怕的后果。

为了不出现脑裂,可采用下面的预防措施:

一、如前所述,在主、备节点间创建一个冗余的、可靠的物理链接来同时传送控制信息;

二、一旦发生脑裂时,借助额外设备强制性地关闭其中一个节点;



第 二种方式便是俗称的"将其它节点'爆头'(shoot the other node in the head)",简称为STONITH。基于可以经过软件指令关闭某节点特殊的硬件设备,Heartbeat便可实现可配置的Stonith。但当主、备服 务器是基于WAN进行通讯时,则很难避免"脑裂"情景的出现。所以,当构建异地"容灾"的应用时,应尽可能避免主、备节点共享物理资源。

Heartbeat的控制信息:

"心跳"信息: (也称为状态信息)仅150 bytes大小的广播、组播或多播数据包。可为以每一个节点配置其向其它节点通报"心跳"信息的频率,以及其它节点上的heartbeat进程为了确认主节点出节点出现了运行等错误以前的等待时间。

集 群变更事务(transition)信息:ip-request和ip-request-rest是相对较常见的两种集群变更信息,它们在节点间须要进行 资源迁移时为不一样节点上heartbeat进程间会话传递信息。好比,当修复了主节点而且使其从新"上线"后,主节点会使用ip-request要求备用 节点释放其此前从因主节点故障而从主节点那里接管的资源。此时,备用节点则关闭服务并使用ip-request-resp通知主节点其已经再也不占用此前接 管的资源。主接点收到ip-request-resp后就会从新启动服务。

重传请求:在某集群节点发现其从其它节点接收到的heartbeat控制信息"失序"(heartbeat进程使用序列号来确保数据包在传输过程当中没有被丢弃或出现错误)时,会要求对方从新传送此控制信息。 Heartbeat通常每一秒发送一次重传请求,以免洪泛。

上面三种控制信息均基于UDP协议进行传送,能够在/etc/ha.d/ha.cf中指定其使用的UDP端口或者多播地址(使用以太网链接的状况下)。

此外,除了使用"序列号/确认"机制来确保控制信息的可靠传输外,Heartbeat还会使用MD5或SHA1为每一个数据包进行签名以确保传输中的控制信息的安全性。

heartbeat的心跳链接:

要部署heartbeat服务,至少须要两台主机才能完成。那么,要实现高可用服务,这两台主机之间,是如何作到互相通讯互相监控的呢/

下面是两台heartbeat主机之间通讯的一些经常使用的可行的方法:

1)串行电缆,即所谓的串口(首选,缺点是距离不能太远)

2)一根以太网电缆量网口直连(生产环境中经常使用的方式)

3)以太网电缆,经过交换机等网络设备链接

(次选,缘由是增长了故障点,很差排查故障,同时,线路不是专用的心跳线,容易受其余数据传输的影响,致使心跳报文发送问题)

Heartbeat裂脑:  什么是裂脑?

由 于两台高可用服务器之间在指定的时间内,没法互相检测到对方心跳而各自启动故障转移功能,取得了资源以及服务的全部权,而此时的两台高可用服务器对都还活着并做正常运行,这样就会致使同一个IP湖综合服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址,当用户写 入数据的时候可能会分别写入到两端,这样可能会致使服务器两端的数据不一致或形成数据的丢失,这种状况就本成为裂脑,也有的人称之为分区集群或者大脑垂直分隔

致使裂脑发生的缘由:

通常来讲,裂脑的发生,主要是由如下的几个缘由致使的:

1)高可用服务器对 之间心跳线路故障,致使没法正常的通讯。缘由好比:

  (1)心跳线自己就坏了(包括断了,老化)

  (2)网卡以及相关驱动坏了,IP配置及冲突问题

  (3)心跳线间链接的设备故障(交换机的故障或者是网卡的故障)

  (4)仲裁的服务器出现问题

2)高可用服务器对上开启了防火墙阻挡了心跳消息的传输

3)高可用服务器对上的心跳网卡地址等信息配置的不正确,致使发送心跳失败。

4)其余服务配置不当等缘由,如心跳的方式不一样,心跳广播冲突,软件出现了BUG等

防止脑裂发生的方法总结:

  发生脑裂的时候,对业务的影响是及其严重的,有时甚至致命。

如: 两台高可用的服务器对之间发生脑裂,致使互相竞争同一个IP资源,就如同咱们局域网内常见的IP地址冲突同样,两个机器就会有一个或者两个不正常,影响用户正常访问服务器。若是是应用在数据库或者是存储服务这种极重要的高可用上,那就致使用户发布的数据间断的写在两台服务器上的恶果,最终数据恢复困难或者 是难已恢复。

实际的生产环境中,咱们能够从如下几个方面来防止裂脑的发生:

1)同时使用串行电缆和以太网电缆链接,同时用两条心跳线路,这样一条线路坏了,另外一个线路仍是好的,依然能传送消息(推荐的)

2)检测到裂脑的时候强行关闭一个心跳节点(须要特殊的节点支持,如stonith,fence),至关于程序上备节点发现心跳线故障,发送关机命令到主节点。

3)作好对裂脑的监控报警(如邮件以及手机短信等),在问题发生的时候可以人为的介入到仲裁,下降损失。固然,在实施高可用方案的时候,要根据业务的实际需求肯定是否可以容忍这样的损失。对于通常的网站业务,这个损失是可控的(公司使用)。

4) 启用磁盘锁。正在服务一方锁住共享磁盘,脑裂发生的时候,让对方彻底抢不走共享的磁盘资源。但使用锁磁盘也会有一个不小的问题,若是占用共享盘的一方不主动解锁,另外一方就永远得不到共享磁盘。若服务节点忽然死机或者崩溃,另外一方就永远不可能执行解锁命令。后备节点也就接管不了共享的资源和应用服务。因而有 人在HA中涉及了“智能”锁,正在服务的一方只在发现心跳线所有断开时才启用磁盘锁,平时就不上锁了。

5)报警报在服务器接管以前,给人员处理留足够的时间就是1分钟内报警了,可是服务器不接管,而是5分钟以后接管,接管的时间较长。

数据不会丢失,但就是会致使用户没法写数据。

6)报警后,不直接自动服务器接管,而是由人员接管。

7)增长仲裁的机制,肯定谁该得到资源,这里面有几个参考的思路:

 (1)增长一个仲裁机制。例如设置参考的IP,小心跳彻底断开的时候,2个节点各自都ping一下参考的IP,不一样则代表断点就出如今本段,这样就主动放弃竞争,让可以ping通参考IP的一端去接管服务。

 (2)经过第三方软件仲裁谁该得到资源,这个在阿里有相似的软件应用。

3、Ldirectord

  Ldirector是一个监控集群服务节点运行状态的插件。Ldirector若是监控到集群节点中某个服务出现故障,就屏蔽此节点的对外链接功能,同时将后续请求转移到正常的节点提供服务。这个插件常常用在LVS负载均衡集群中。

 Ldirector自动检测后台Realserver的运行情况,并采起响应的措施。

 

 ldirectord守护进程经过向每台real server ip(RIP)上的集群资源发送访问请求来实现对真实服务器的监控,这对全部类型的LVS集群都是成立的:LVS-DR  LVS-NAT LVS-TUN

正常状况下,为每一个Director上的VIP地址运行一个ldirectord守护进程,当真实服务器不响应运行在Director上的 ldirectord守护进程时,ldirectord守护进程运行适当的ipvsadm命令将VIP地址从IPVS表中移除。(之后,当真实服务器回到在线状态时,ldirectord使用适当的ipvsadm命令将真实服务器从新添加到IPVS表中 )

 为了监视web集群内的真实服务器,ldirectord守护进程使用HTTP协议向每一个真实服务器请求一个专用的web页面,若真实服务器是健康 的,Director知道将从真实服务器接收到什么内容,若真实服务器返回应答字串或者web页面的时间太长,或根本没有返回任何内容,或返回的内容不是 预期的,Director就知道该真实服务器出错了,并从IPVS表中将这个真实服务器移除。 
   ldirectord工做原理:ldirtctord将链接到每个真正的服务器,每隔一段时间就请求测试网页文件,若是返回的内容和测试的内容不匹配,则代表测试失败,则真实服务器将从Ipvs表中被删除。若再次测试时,成功,则将real server从新添加到ipvs表中。

相关文章
相关标签/搜索