HA-keepalived

高可用集群(High Availability Cluster)

   集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。每一个单个的计算机系统都叫集群节点(node)。随着业务的增长,集群通过添加新的节点,满足资源的高可扩展性。

   计算机硬件和软件易错性不可避免,这样在节点上的服务会不可避免的中断。高可用集群的出现是为保证即使节点失效,而服务能不中断。

   高可用集群在一组计算机中,采用主备模式,主节点提供服务,备节点等待;一旦,主节点失效,备节点无需人工的无缝取代主节点提供服务,这样保证了服务的不中断。

   高可用集群软件的主要作用就是实现故障检查和业务切换的自动化,以提供不中断的服务。


高可用集群(HA)的衡量标准

   高可用性集群是通过系统的可靠性(reliability)和可维护性(maintainability)来度量的。

   通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性。

   HA=MTTF/(MTTF+MTTR)*100%

   HA衡量标准:

     ◇ 99% 一年宕机时间不超过4天

     ◇ 99.9% 一年宕机时间不超过10小时

     ◇ 99.99% 一年宕机时间不超过1小时

     ◇ 99.999% 一年宕机时间不超过6分钟


高可用集群软件

    Messaging and Membership Layer(信息与关系层):

     • heartbeat (v1,v2,v3)

     • corosync

     • cman

     • keepalived

     • ultramokey

    Cluster Resource Manager Layer(资源管理层,简称:CRM):

     • haresource,crm (heartbeat v1/v2)

     • pacemaker (heartbeat v3/corosync)

     • rgmanager (cman)


    常用组合:

     • keepalived+mysql-proxy

     • keepalived+nginx

     • corosync+pacemaker (现在最常用的组合)

     • cman + rgmanager (红帽集群套件中的组件,还包括gfs2,clvm)

     • keepalived+lvs (常用于lvs的高可用)

     • keepalived+mycat


keepalived+LVS

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


Keepalived 详解

1.Keepalived 定义 

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


2.VRRP 协议简介

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

• 在主机上使用动态路由协议(RIP、OSPF等) 

• 在主机上配置静态路由 


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


3.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通告信息(VRRP  Advertisement  message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到通告信 息),  多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性。由于安全性考虑,VRRP包使 用了加密协议进行加密。

  

4.VRRP 工作流程

(1).初始化:    

路由器启动时,如果路由器的优先级是255(最高优先级,路由器拥有路由器地址),要发送VRRP通告信息,并发送广播ARP信息通告路由器IP地址对应的 MAC地址为路由虚拟MAC,设置通告信息定时器准备定时发送VRRP通告信息,转为MASTER状态;否则进入BACKUP状态,设置定时器检查定时检 查是否收到MASTER的通告信息。


(2).Master

• 设置定时通告定时器; 

• 用VRRP虚拟MAC地址响应路由器IP地址的ARP请求; 

• 转发目的MAC是VRRP虚拟MAC的数据包; 

• 如果是虚拟路由器IP的拥有者,将接受目的地址是虚拟路由器IP的数据包,否则丢弃; 

• 当收到shutdown的事件时删除定时通告定时器,发送优先权级为0的通告包,转初始化状态;

• 如果定时通告定时器超时时,发送VRRP通告信息; 

• 收到VRRP通告信息时,如果优先权为0,发送VRRP通告信息;否则判断数据的优先级是否高于本机,或相等而且实际IP地址大于本地实际IP,设置定时通告定时器,复位主机超时定时器,转BACKUP状态;否则的话,丢弃该通告包; 


(3).Backup

• 设置主机超时定时器; 

• 不能响应针对虚拟路由器IP的ARP请求信息; 

• 丢弃所有目的MAC地址是虚拟路由器MAC地址的数据包;

• 不接受目的是虚拟路由器IP的所有数据包; 

• 当收到shutdown的事件时删除主机超时定时器,转初始化状态; 

• 主机超时定时器超时的时候,发送VRRP通告信息,广播ARP地址信息,转MASTER状态; 

• 收到VRRP通告信息时,如果优先权为0,表示进入MASTER选举;否则判断数据的优先级是否高于本机,如果高的话承认MASTER有效,复位主机超时定时器;否则的话,丢弃该通告包; 


5.ARP查询处理

    当内部主机通过ARP查询虚拟路由器IP地址对应的MAC地址时,MASTER路由器回复的MAC地址为虚拟的VRRP的MAC地址,而不是实际网卡的  MAC地址,这样在路由器切换时让内网机器觉察不到;而在路由器重新启动时,不能主动发送本机网卡的实际MAC地址。如果虚拟路由器开启的ARP代理  (proxy_arp)功能,代理的ARP回应也回应VRRP虚拟MAC地址


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


keepalived+LVS-DR模式:

keepalived:实现中间件(代理服务器的高可用)。

LVS:是中间件软件(即代理服务器软件),是用来实现集群的负载均衡。


实验环境:Real Server为node13和node14,负载均衡器DR为node11(主MASTER)和node12(备BACKUP)

node11:192.168.11.11

node12:192.168.11.12

node13:192.168.11.13

node14:192.168.11.14

以上四台为centos7.6系统,客户机位w10系统,虚拟IP为192.168.11.1


网络拓扑结构:

blob.png

实验过程:

node11上面做:

yum   -y   install    keepalived   ipvsadm

rpm   -qc    keepalived

cp  -av  /etc/keepalived/keepalived.conf{,.bak}     备份原始配置文件 

vim /etc/keepalived/keepalived.conf   打开配置文件内容

配置文件中意思解释:(红底色为实验需要修改的内容,其他的在实际环境中根据需要进行修改)

!Configuration File for keepalived

global_defs { 全局定义,说明:在实验测试环境中,以下内容可以随便写,但是master和backup的router_id必须相同

  notification_email {  设置通知邮箱

   root@localhost    管理员的邮箱地址  

   failover@firewall.loc

   sysadmin@firewall.loc           

  }

  notification_email_from  keepalived@localhost  通知邮件的发件人邮箱

  smtp_server 127.0.0.1      邮箱服务器IP地址

  smtp_connect_timeout  30    邮件服务器连接超时时间为30秒

  router_id  LVS_DEVEL    路由器ID名称,同一个keepalived高可用集群中master和backup的ID名称必须相同

  vrrp_skip_check_adv_addr

  #vrrp_strict       一定要注释此行否则无法访问调度器    

  vrrp_garp_interval 0

  vrrp_gna_interval 0

}


vrrp_instance VI_1 { vrrp虚拟路由冗余协议的实例设置 ,实例名称为VI_1

  state MASTER      状态,主为MASTER,备为BACKUP状态

  interface  ens33 //心跳检测网卡接口,要根据实际情况写网卡接口名,用ip  a查网卡接口名

  virtual_router_id 51 //master主和backup备两边必须一样,此处是集群的群号

  priority 100            //优先级,MASTER的值必须高于BACKUP的值,类似于现实生活中的竞选的票数

  advert_int  1    //检查间隔,单位秒。vrrp的组播地址是224.0.0.18

  authentication {         身份认证配置

  auth_type PASS      //认证类型为密码方式,主备要一致

  auth_pass 1111      //认证密码为1111,主备要一致

  }

  virtual_ipaddress {

   192.168.11.100                        //VIP,可多个IP,每行一个IP地址

   192.168.11.111

  }

}


virtual_server 192.168.11.100 80 { //LVS 配置(即调度器的配置),此行等同于ipvsadm  -At  192.168.11.100:80  -s  wrr命令

  delay_loop 3                                        //服务论询的时间间隔  

  lb_algo wrr            //LVS 调度算法   -w为指定权重weight

  lb_kind DR            // LVS 集群模式

  #persistence_timeout 50   一定要注释,不然无法访问负载均衡器

  protocol TCP

  

  real_server 192.168.11.13 80 { //RS后端真实服务器的IP及端口号,等同于ipvsadm -at 192.168.11.100:80 -r 192.168.11.13:80 -g -w 1命令

   weight 1

   TCP_CHECK { //RS健康检查

     connect_timeout 3  //连接超时时间为3秒

   }

  }

  real_server 192.168.11.14 80 {

   weight 3

   TCP_CHECK {

     connect_timeout 3

   }

  }

}

下面的代码全部用ctrl+v进入可视化模式注销
blob.png

systemctl  restart  keepalived    重启keepalived服务

blob.png

cd  /etc/keepalived    进入配置目录

scp keepalived.conf 192.168.11.12:/etc/keepalived  将node11(主)上面的keepalived传给node12(备)

blob.png


node12上面做:

yum  -y  install  ipvsadm  keepalived

vim  /etc/keepalived/keepalived.conf     修改成下图箭头所示那样

blob.png

保存退出后重启服务:systemctl restart keepalived


node13上面做:

yum  -y  install httpd

systemctl restart httpd && systemctl enable httpd

echo hello node13 > /var/www/html/index.html

curl 127.0.0.1

vim  lo.sh    创建lo.sh脚本,并写入其下内容

#!/bin/bash

ifconfig lo:1 192.168.11.100  netmask 255.255.255.255

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ip   a


chmod  -v  +x  lo.sh   给脚本加可执行权限

.  lo.sh   运行脚本


scp   lo.sh   root@192.168.11.14:/root/        将lo.sh脚本传给node14

ssh   root@192.168.11.14  '.   /root/lo.sh'     远程给192.168.11.14运行lo.sh脚本


node14上面做:

yum -y install httpd

systemctl restart httpd && systemctl enable httpd

echo hi node14 > /var/www/html/index.html

curl 127.0.0.1


node11上面要确保能访问到node13和node14的httpd网站页面:

curl  192.168.11.13

curl  192.168.11.14

blob.png

在node11上面做:

ip  a   查看设置的vip是否生效

blob.png

ipvsadm  -ln   查看定义的ipvs集群是否成功

blob.png


测试:在w7/10cmd中访问192.168.11.100测试:

curl  192.168.11.100

blob.png

抓包:

yum  install  -y  tcpdump   安装抓包软件tcpdump

tcpdump -i ens33  -nv vrrp

   -i    指定网卡

   -n    以数字的方式显示(ip,port)

   -v    显示详细信息

   -vv   显示更详细的信息

   -w    保存到文件

blob.png


keepalived通过vrrp协议进行组播的作用:

    是为了竞选出由哪台keepalived主机接管业务(使用VIP的)。谁的priority优先级高(即票数多),谁就有VIP地址。


当master和backup都在运行keepalived服务时:

node11(master)发送的组播信息:

src:192.168.11.11

dest:224.0.0.18


node12(backup)接收的组播信息:

src:192.168.11.11

dest:224.0.0.18


----

当node11这台master停止了keepalived服务:

node12发送的组播信息:

src:192.168.11.12

dest:224.0.0.18


keepalived集群中其他主机接收的组播信息:

src:192.168.11.12

dest:224.0.0.18


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


keepalived+script模式:

原理:通过脚本的执行结果来提高或降低自身的优先级完成VIP的切换(即master和backup之间的切换)

与上面实验分开,现在是一个全新的实验环境:

node11(主MASTER):192.168.11.11

node12(备BACKUP):192.168.11.12

实验测试:在node11和node12主机分别安装好keepalived和nginx(或httpd)软件

node11 主MASTER上面的做:
yum install -y keepalived ipvsadm httpd
systemctl start httpd && systemctl enable httpd
cp  -av  /etc/keepalived/keepalived.conf{,.bak}
   备份配置文件
vim /etc/keepalived/keepalived.conf       以下红色为需要修改的内容
global_defs {
  notification_email {
   root@localhost

   sysadmin@firewall.loc
 }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id dr1
  #vrrp_strict   一定要注释掉此行,否则无法通过VIP地址访问调度器
  }
  vrrp_script  down  { 定义名称为down的vrrp状态检测脚本                                            
   script "netstat -tnlp|grep :80 && exit 0 || exit 1" 通过网络进程端口号,配置脚本,引号内也可以是脚本的名称
   interval 3      间隔时间为3秒
   weight  -20     脚本返回非0,则降低优先级
   fall  2       连续检测2次失败才算真的失败
   rise 1      检测1次成功就算成功
  }

  vrrp_instance VI_1 { 配置名称为VI_1这个vrrp协议的实例,允许多个实例
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100

    advert_int 1
    #nopreempt   //不抢占VIP地址,有就注销,没有就不用管
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      192.168.11.100
    }
       
    track_script {  执行脚本
      down
    }

   }

virtual_server 192.168.11.100 80 {
  delay_loop 6
  lb_algo wrr
  lb_kind DR
  persistence_timeout 50
  protocol TCP

  real_server 192.168.11.13 80 {
    weight 1
    TCP_CHECK {
      connect_timeout 3
    }
  }

}

node12 备BACKUP 上面的做:
yum install -y keepalived ipvsadm httpd
systemctl start httpd && systemctl enable httpd
cp -av /etc/keepalived/keepalived.conf{,.bak}
vim  /etc/keepalived/keepalived.conf  
    以下红色为需要修改的内容
global_defs {
  notification_email {
   acassen@firewall.loc
   failover@firewall.loc
   sysadmin@firewall.loc
  }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
  vrrp_skip_check_adv_addr
  #vrrp_strict
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}

vrrp_instance VI_1 {
  state BACKUP
  interface ens33
  virtual_router_id 51
  priority 90

  advert_int 1
  authentication {
   auth_type PASS
   auth_pass 1111
  }
  virtual_ipaddress {
   192.168.11.100
  }
}

virtual_server 192.168.11.100 80 {
  delay_loop 6
  lb_algo wrr
  lb_kind DR
  persistence_timeout 50
  protocol TCP

  real_server 192.168.11.13 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    }
  }

}

测试:两边都开启httpd服务,当node11关闭httpd服务时node12会自己充当主DR接手IP,当node11重新开启httpd服务时node11会自动恢复主DR并获得IP。

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加(升优先级)
如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少(降优先级)
其他情况,原本配置的优先级不变,即配置文件中priority对应的值。

优先级不会不断的提高或者降低
可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况