一、Keepalived是什么

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

二、Keepalived的特性

配置文件简单:配置文件比较简单,可通过简单配置实现高可用功能

稳定性强:keepalived是一个类似于layer3, 4&7交换机制的软件,具备我们平时说的第3层、第4层和第7层交换机的功能,常用于前端负载均衡器的高可用服务,当主服务器出现故障时,可快速进行切换,监测机制灵活,成功率高。

成本低廉:开源软件,可直接下载配置使用,没有额外费用。

应用范围广:因为keepalived可应用在多个层面,所以它几乎可以对所有应用做高可用,包括LVS、数据库、http服务、nginx负载均衡等等

支持多种类型:支持主从模式、主主模式高可用,可根据业务场景灵活选择。

三、keepalived工作流程

20171111103154410

keepalived主要模块是VRRP Stack和Cheackers,实现HA集群中失败切换(Failover)功能。Keepalived通过VRRP功能能再结合LVS负载均衡软件即可部署一个高性能的负载均衡集群系统。Cheackers主要实现可实现对服务器运行状态检测和故障隔离。,其中ipvs和realserver健康状态检查通过配置文件配置就可以实现,而其他服务高可用则需要通过自己编写脚本,然后配置keepalived调用来实现。Keepalived运行有3个守护进程。父进程主要负责读取配置文件初始化、监控2个子进程等;然后两个子进程,一个负责VRRP,另一个负责Cheackers健康检查。其中父进程监控模块为WacthDog,工作实现:每个子进程打开一个接受unix域套接字,父进程连接到那些unix域套接字并向子进程发送周期性(5s)hello包。上图是Keepalived的功能体系结构,大致分两层:用户空间(user space)和内核空间(kernel space)。内核空间:主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)和NETLINK(提供高级路由及其他相关的网络功能)两个部份。

四、什么是vrrp协议

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)可以认为是实现路由器高可用的协议,简单的说,当一个路由器故障时可以由另一个备份路由器继续提供相同的服务。VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器)。VRRP优先级的取值范围为0到255(数值越大表明优先级越高),可配置的范围是1到254,优先级0为系统保留给路由器放弃Master位置时候使用,255则是系统保留给IP地址拥有者使用。优先级越高,则越有可能成为Master路由器。当两台优先级相同的路由器同时竞争Master时,比较接口IP地址大小。接口地址大者当选为Master。

五、keepalived的应用场景

在网络层、数据链路层,运行着4个重要的协议:互联网协议IP、互联网控制报文协议ICMP、地址转换协议ARP以及反向地址转换协议RARP。Keepalived在网络层采用的最常见的工作方式是通过ICMP协议向服务器集群中的那个节点发送一个ICMP数据包(类似于ping实现的功能),如果某个节点没有返回响应数据包,那么认为此节点发生了故障,Keepalived将报告次节点失效,并从服务器集群中剔除故障节点。在传输层,提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制协议TCP可以提供可靠的数据传输服务、Ip地址和端口代表TCP的一个连接端。要获得TCP服务,需要在发送机的一个端口上和接收机的一个端口上建立连接,而Keepalived在传输层就是利用TCP协议的端口连接和扫描技术来判断集群点是否正常的。比如,对于常见的WEB服务默认的80端口、SSH服务默认的22端口等,Keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应得节点从服务器集群组中移除。在应用层,可运行FTP、TELNET、HTTP、DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作方式;例如:用户可以通过编写程序来运行keepalived。而keepalived将根据用户的设定检测各种程序或服务是否运行正常,如果Keepalived的检测结果与用户设定不一致时,Keepalived将把对应的服务从服务器中移除。

六、keepalived配置文件分析

global_defs { #全局配置


notification_email { #realserver故障时通知邮件的收件人地址,可以多个
root@localhost
}
notification_email_from root_keepalived #发件人信息(可以随意伪装,因为邮件系统不会验证处理发件人信息)
smtp_server 127.0.0.1 #发邮件的服务器(一定不可为外部地址)
smtp_connect_timeout 30 #连接超时时间
router_id KEEPALIVED #路由器的标识(可以随便改动)
}

vrrp_instance VI_1  { #配置虚拟路由器的实例,VI_1是自定义的实例名称


state MASTER #初始状态,MASTER|BACKUP,当state指定的instance的初始化状态,在两台服务器都启动以后,马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER
interface eth0 #通告选举所用端口
virtual_router_id 51 #虚拟路由的ID号(一般不可大于255)
priority 101 #优先级信息 #备节点必须更低
advert_int 1 #VRRP通告间隔,秒
authentication {
auth_type PASS #认证机制
auth_pass 5344 #密码(尽量使用随机)
}
nopreempt #非抢占模式
virtual_server 192.168.18.240 80 { #设置一个virtual server:VIP:Vport
delay_loop 3 # service polling的delay时间,即服务轮询的时间间隔
lb_algo rr #LVS调度算法:rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS集群模式:NAT|DR|TUN
persistence_timeout 120 #会话保持时间(持久连接,秒),即以用户在120秒内被分配到同一个后端realserver
nat_mask 255.255.255.255
protocol TCP #健康检查用的是TCP还是UDP主要,后端有几台这里就要设置几个
real_server 192.168.18.251 80 { #后端真实节点主机的权重等设置,主要,后端有几台这里就要设置几个
weight 1 #给每台的权重,rr无效
inhibit_on_failure #表示在节点失败后,把他权重设置成0,而不是IPVS中删除
url {

path /
status_code 200
}
TCP_CHECK {
   connect_timeout 2 #连接超时时间
   nb_get_retry 3 #重连次数
delay_before_retry 1 #重连间隔
}

七、实战演练

实现基于keepalived高可用集群:


   一、环境准备:centos系统主从两台、yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信
   二、安装步骤:

1、iptables -F && setenforing 清空防火墙策略,关闭selinux 2、两台服务器都使用yum方式安装keepalived服务


   三、修改配置文件:

1.修改/etc/keepalived/keepalived.conf配置文件内容 2、对glob段进行定义,添加管理员邮箱等 3、对vrrp_instance 进行配置,配置一主一从,定义一个基于虚拟IP的实例


   四、检验高可用的效果

1、配置完成后,观察两侧IP的是情况,看是否虚拟IP在主上配置成功 2、检查主从服务日志,服务是否运行正常,监测机制是否有效 3、停掉主服务上的keepalived服务,看虚拟IP是否正常转移到从节点上 4、观察日志,了解整个切换过程,之后启动主节点服务,看虚拟IP能否被主服务再接管

实现keepalived企业级高可用基于LVS-DR模式的应用实战


   一、环境准备:两台centos系统做DR、一主一从,两台实现过基于LNMP的电子商务网站(提前分配好各个主机的角色并注意不要搞混IP地址)
    二、安装步骤:
       1、两台服务器都使用yum方式安装keepalived服务
       2、iptables -F && setenforing 清空防火墙策略,关闭selinux

   三、配置基于DR模式的LVS负载均衡集群:
       1、修改keepalived主(lvs-server-master)配置文件实现全局配置以及virtual_instance
   global_defs {
      notification_email {
      root@localhost
      }
      notification_email_from root@snow.com
      smtp_server 172.17.0.1
      smtp_connect_timeout 30
      router_id LVS_DEVEL
   }

   vrrp_instance VI_1 {
       state MASTER
       interface ens34
       virtual_router_id 87
       priority 100
       advert_int 1
       authentication {
           auth_type PASS
           auth_pass 666666
       }
       virtual_ipaddress {
           172.17.251.197
       }
   }

       2、修改keepalived主(lvs-server-master)配置文件实现virtual_server
   
   virtual_server 172.17.251.197 80 {
       delay_loop 6
       lb_algo wrr (调度算法)
       lb_kind DR (工作模式)
       nat_mask 255.255.255.255
       persistence_timeout 600
       protocol TCP

       real_server 172.17.253.114 80 {
           weight 1
           HTTP_GET {
               url {
                 path /
               }
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
           }
       }

   real_server 172.17.250.142 80{
           weight 1
           HTTP_GET {
               url {
                 path /
               }
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
           }
       }
   }
       3、修改keepalived从(lvs-server-backup)配置文件实现virtual_instance
   global_defs {
      notification_email {
      root@localhost
      }
      notification_email_from root@snow.com
      smtp_server 172.17.0.1
      smtp_connect_timeout 30
      router_id LVS_DEVEL
   }

   vrrp_instance VI_1 {
       state MASTER
       interface ens34
       virtual_router_id 87
       priority 100
       advert_int 1
       authentication {
           auth_type PASS
           auth_pass 666666
       }
       virtual_ipaddress {
           172.17.251.197
       }
   }

       4、修改keepalived从(lvs-server-backup)配置文件实现virtual_server
   
   virtual_server 172.17.251.197 80 {
       delay_loop 6
       lb_algo wrr
       lb_kind DR
       nat_mask 255.255.255.255
       persistence_timeout 600
       protocol TCP

       real_server 172.17.253.114 80 {
           weight 1
           HTTP_GET {
               url {
                 path /
               }
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
           }
       }

   real_server 172.17.250.142 80{
           weight 1
           HTTP_GET {
               url {
                 path /
               }
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
           }
       }
   }

注意:

1、在配置完keepalived配置文件之后需要检查real server中是否配置VIP到本地回环网卡lo上,并只广播自己。

2、在配置文件中需要注意借口不要写错

3、keepalived主(lvs-server-master)配置文件与从配置文件除了  state(状态)、interface(VIP接口)、 priority(权重)不同之外其他的内容都一样,所以可以在完成主配置文件后直接将主配置文件copy到从配置文件,修改对应的信息即可。