本文部分参考博客:https://blog.51cto.com/1992tao/1869869

 

一、        VRRP协议

1.      技术优点;

VRRP是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。

VRRP具有如下优点:

1)      简化网络管理。在具有多播或广播能力的局域网(如以太网)中,借助VRRP能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。

2)      适应性强。VRRP报文封装在IP报文中,支持各种上层协议。

3)      网络开销小。VRRP只定义了一种报文——VRRP通告报文,并且只有处于Master状态的路由器可以发送VRRP报文。

2.      相关术语

1)      虚拟路由器:有一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当做默认网关。

2)      VRID:虚拟路由器的标识。有相同VRID的一组路由器构成一个虚拟路由器。

3)      Master路由器:虚拟路由器中承担报文转发任务的路由器;

4)      Backup路由器:Master路由器出现故障时,能够代替Master路由器工作的路由器。

5)      虚拟IP地址:虚拟路由器的IP地址。一个虚拟路由器可以拥有一个或多个IP地址。

6)      IP地址拥有者:接口IP地址与虚拟IP地址相同的路由器被称为IP地址拥有者;

7)      虚拟MAC地址:一个虚拟路由器拥有一个虚拟MAC地址。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址;

8)      优先级:VRRP根据优先级来确定虚拟路由器中每台路由器的地位。

9)      非抢占方式:如果Backup路由器工作在非抢占方式下,则只要Master路由器没有出现故障,Backup路由器即是随后被配置了更高的优先级也不会称为Master路由器;

10)  抢占方式:如果Backup路由器工作在抢占方式下,当它收到VRRP报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的Master路由器优先级高,就会主动抢占成为Master路由器;否则,保持Backup状态。

3.      VRRP工作过程

虚拟路由器示意图:

    Linux自学笔记——keepalived_第1张图片                                               

VRRP工作过程为:

    1)      虚拟路由器中的路由器根据优先级选举出Master。Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通知给与它连接的设备或者主机,从而承担报文转发任务;

    2)      Master路由器周期性发送VRRP报文,以公布其配置信息(优先级等)和工作状况;

    3)      如果Master路由器出现故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master;

    4)      虚拟路由器状态发生切换时,Master路由器由一台设备切换为另一台设备,新的Master路由器只是简单的发送一个携带虚拟路由器的MAC地址和虚拟IP地址信息的免费ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息。网络中的主机感知不到Master路由器已经切换为另外一台设备。

    5)      Backup路由器的优先级高于Master路由器时,由Backup路由器的工作方式决定是否重新选举Master。

       由此可见,为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能:

              Master路由器的选举;

              Master路由器状态的通告;

              同时,为了提高安全性,VRRP还提供了认证功能;

4.      Master路由器的选举

VRRP根据优先级来确定虚拟路由器中的每台路由器的角色(Master路由器或者Backup路由器)。优先级越高,则越有可能称为Master路由器。

初始化创建路由器工作在Backup状态,通过VRRP报文的交互获知虚拟路由器中其他成员的优先级;

    1)      如果VRRP报文中Master路由器的优先级高于自己的优先级,则路由器保持在Backup状态;

    2)      如果VRRP报文中Master路由器的优先级低于自己的优先级,采用抢占工作方式的路由器将抢占称为Master状态,周期性发送VRRP报文,采用非抢占工作方式的路由器仍保持Backup状态;

    3)      如果在一定时间内没有收到VRRP报文,则路由器切换为Master状态。

VRRP优先级的取值范围为0-255(数值越大表明优先级越高),可配置的范围是1-254,优先级0为系统保留给路由器放弃Master位置时候使用,255则是系统保留给ip地址拥有者使用。当路由为IP地址拥有者时,其优先级始终为255.因此,当虚拟路由器内存在IP地址拥有者时,只要其工作正常,则为Master路由器。

5.      Master路由器的状态的通告。

Master路由器周期性地发送VRRP报文,在虚拟路由器中公布其配置信息(优先级等)和工作状况。Backup路由器通过接收到VRRP报文的情况来判断Master路由器是否工作正常。

Master路由器主动放弃Master地位(如Master路由器退出虚拟路由器)时,会发送优先级为0的VRRP报文,致使Backup路由器快速切换变成Master路由器。这个切换的时间称为Skew time,计算方式为:(256-Backup路由器的优先级)/256,单位为秒。

当Master路由器发生网络故障而不能发送VRRP报文的时候,Backup路由器并不能立即知道其工作状况。Backup路由器等待一段时间之后,如果还没有接收到VRRP报文,那么会认为Master路由器无法正常工作,而把自己升级为Master路由器,周期性发送VRRP报文。如果此时多个Backup路由器竞争Master路由器的位置,将通过优先级来选举Master路由器。Backup路由器默认等待的时间称为Master_Down_Interval,取值为:(3×VRRP报文的发送时间间隔)+Skew time,单位为秒。

在 性 能 不 够稳定的网络中, Backup 路由器可能因为网络堵塞而在Master_Down_Interval期间没有收到Master路由器的报文,而主动抢占为Master位置,如果此时原Master路由器的报文又到达了,就会出现虚拟路由器的成员频繁的进行Master抢占现象。为了缓解这种现象的发生,特制定了延迟等待定时器。它可以使得Backup路由器在等待了Master_Down_Interval后,再等待延迟等待时间。如在此期间仍然没有收到VRRP报文,则此Backup路由器才会切换为Master路由器,对外发送VRRP报文。

6.      认证方式

VRRP提供了三种认证方式:

        1)      无认证:不进行任何VRRP报文的合法性认证,不提供安全性保障。

        2)      简单字符认证:在一个有可能收到安全威胁的网络中,可以将认证方式设置为简单字符认证。发送VRRP报文的路由器将认证字填入到VRRP报文中,而收到VRRP报文的路由器会将收到的VRRP报文中的认证字和本地配置的认证字进行比较。如果认证字相同,则认为接收到的报文是合法的VRRP报文;否则认为接收到的报文是一个非法报文。

        3)      MD5认证:在一个非常不安全的网络中,可以将认证方式设置为MD5认证。发送VRRP报文的路由器利用认证字和MD5算法对VRRP报文进行加密,加密后的报文保存在Authentication Header(认证头)中。收到的VRRP报文的路由器会利用认证字解密报文,检查改报文的合法性。

 

二、        Keepalived

1.      keepalived简介;

        1)      keepalived是VRRP协议在linux主机上以守护进程方式的实现;

        2)      能够根据配置文件自动生成ipvs规则;

        3)       对个RS做健康状态监测;

2.      组件

vrrp  stack

checkers

ipvs wrapper  -- > ipvs

 

3.      配置文件的组成部分;

GLOBAL CONFIGURATION

VRRPD CONFIGURATION

vrrp instance

vrrp synchronization group

LVS CONFIGURATION

4.      HA Cluster的配置前提;

        1)      本机的主机名,要于hostname(uname -n)获得名称保持一致;

            Centos 6:/etc/sysconfig/network

            Centos 7:hostnamectl  set-hostname  HOSTNAME

        2)      各节点时间同步;

        3)      确保iptables及selinux不会成为服务阻碍;

5.      配置格式;

virtual_ipaddress {

/ brd dev scope label

  192.168.200.17/24 dev eth1

  192.168.200.18/24 dev eth2 label eth2:1

}

nopreempt:非抢占模式;默认为抢占模式;

 

vrrp_sync_group VG_1 {

group {

              VI_1   # name of vrrp_instance (below)

             VI_2  # One for each moveable IP.

           }

    }

 

    vrrp_instance VI_1 {

eth0

 vip

}

 

vrrp_instance VI_2 {

eth1

dip

}

 

示例1:单主模型配置keepalived实现高可用

1.      配置环境准备;

两台主机,这里选择的两台centos7的主机,主机名分别为node1,node2,ip地址分别为192.168.19.141, 192.168.19.142;

为了两台主机通信的方便,首先配置两个节点通过主机名并基于密钥认证的ssh服务完成通信;

        1)      在两台节点主机上分别在hosts文件中添加名称解析;

        Linux自学笔记——keepalived_第2张图片

        2)      通过ssh生成密钥对;

        Linux自学笔记——keepalived_第3张图片

        3)      复制公钥文件至node2;

        Linux自学笔记——keepalived_第4张图片

        4)      再次尝试远程node2无需密码;

        Linux自学笔记——keepalived_第5张图片

在配置前还需达到以下几点要求:

        1)      本机的主机名,要于hostname(uname -n)获得名称保持一致;

            Centos 7:hostnamectl  set-hostname  HOSTNAME

        2)      各节点时间同步;

         image.png

        3)      确保iptables及selinux不会成为服务阻碍;

2.      安装keepalived,编辑node1的配置文件;

    Linux自学笔记——keepalived_第6张图片

    Note:编辑配置文件前记得先备份,再编辑,便于恢复;

3.      将node1编辑好的配置文件复制给node2,再次编辑node2的配置文件;

    Linux自学笔记——keepalived_第7张图片

    Note:主要修改以上内容,修改状态为备用节点,和优先级为99

4.      测试;

        1)      启动节点1上的keepalived;利用systemctl status keepalived查看日志;

         Linux自学笔记——keepalived_第8张图片    

        查看node1的ip地址,地址已经在使用;

        Linux自学笔记——keepalived_第9张图片

        2)      启动node2节点的keepalived,观察日志;

        Linux自学笔记——keepalived_第10张图片

        查看node2的ip地址:

        Linux自学笔记——keepalived_第11张图片

        3)      现在我们手动down掉node1的keepalived服务,可以发现配置的虚拟ip地址被移除;

        Linux自学笔记——keepalived_第12张图片

        查看node2的日志和ip地址,可以发现地址被成功配置在node2上:

        Linux自学笔记——keepalived_第13张图片

        4)      我们再次手动启动node1的keepalived服务,观察node1日志和地址转移情况,可以发现地址再次转移到node1上;

        Linux自学笔记——keepalived_第14张图片

        观察node2的日志和地址转移情况:可以发现地址再次被移除;

        Linux自学笔记——keepalived_第15张图片

 

示例2 :双主模型配置keepalived实现高可用;

1.       在上面的基础上编辑node1的配置文件,添加一个虚拟路由器;

    Linux自学笔记——keepalived_第16张图片

2.      配置node2的配置文件;

    Linux自学笔记——keepalived_第17张图片

3.      测试

        1)      重启两个节点的keepalived服务,观察日志文件,及地址转移情况;

        Node1的日志和地址转移情况:获得地址192.168.19.160;

        Linux自学笔记——keepalived_第18张图片

        Node2的日志和地址转移情况:获得地址192.168.19.161;

        Linux自学笔记——keepalived_第19张图片

        2)      跟上面一样,我们手动关闭node1的keepalived服务,观察日志和地址转移情况;

        Node1的日志和地址转移情况:ip地址被移除;

        Linux自学笔记——keepalived_第20张图片

        Node2的日志和地址转移情况:两个虚拟地址都转到了node2节点上;

        Linux自学笔记——keepalived_第21张图片

        3)      再次启动node1的keepalived服务,测试观察;

        Node1节点再次获得192.168.19.160地址;

       Linux自学笔记——keepalived_第22张图片 

        Node2节点上192.168.19.160这个地址被移除,只剩192.168.19.161这个地址:

        Linux自学笔记——keepalived_第23张图片

 

 

在vi中的主机状态发生改变生发送通知:   

        # notify scripts, alert as above

           notify_master |

           notify_backup |

           notify_fault |

           notify |

           smtp_alert

示例3:编辑通知脚本使其在主备节点发生转换时发送邮件;

1.      编辑脚本文件,并赋予脚本执行权限;

      Linux自学笔记——keepalived_第24张图片  

2.      编辑配置文件定义通知脚本;

     Linux自学笔记——keepalived_第25张图片

3.      重启node1,查看邮件;

    Linux自学笔记——keepalived_第26张图片 

 

示例4:Keepalived实现优先级动态调整;

Keepalived可以调用外部脚本进行资源监控,并根据监控结果实现优先级动态调整;

    Linux自学笔记——keepalived_第27张图片

1.      在node1上定义脚本,如果在/etc/keepalived/目录下存在down文件,将节点的优先级减10,编辑配置文件;然后也同时把编辑的内容添加到node2的配置文件中;

   Linux自学笔记——keepalived_第28张图片 

2.      在两个节点的/etc/keepalived目录下新建脚本文件,内容如下。并赋予执行权限;

   Linux自学笔记——keepalived_第29张图片 

3.      测试;

        1)      在node1的/etc/keepalived/目录下新建一个down文件,观察地址转移情况;

        Node1失去了地址:

        Linux自学笔记——keepalived_第30张图片

        Node2获得地址:

        Linux自学笔记——keepalived_第31张图片

        2)      删除down文件;node1重新获得了地址

        Linux自学笔记——keepalived_第32张图片

三、     配置keepalived高可用ipvs和nginx服务

具体用法可以使用man keepalived.conf命令查看。

示例1:配置单主模型keepalived高可用ipvs-dr集群

1.      准备实验环境

四台虚拟机,两台作为director,两台作为real server,在director上配置keepalived+lvs-dr实现高可用;

实验拓扑图如下:

   Linux自学笔记——keepalived_第33张图片 

两台director的vip为192.168.19.160(即虚拟ip地址),两台real server的vip也为192.168.19.160,RS1的rip为192.168.19.134,RS2的rip为192.168.19.143

        1)      配置RS1主机的vip地址及内核参数,在这里可编写一个脚本;

        Linux自学笔记——keepalived_第34张图片

        给脚本赋予执行权限,执行脚本,查看IP地址,路由以及内核参数;

        Linux自学笔记——keepalived_第35张图片

        2)      将RS1的配置脚本发送给RS2,并执行脚本查看;

        Linux自学笔记——keepalived_第36张图片

        3)      给RS1和RS2提供网页测试文件(一般centos6主机httpd默认已安装);

        RS1网页测试文件:

        image.png

        RS2网页测试文件:

        image.png

2.      配置node1(director1)上的keepalived,使其自动生成ipvsadm定义的规则;

        1)      配置node1上的keepalived配置文件;

        Linux自学笔记——keepalived_第37张图片

        2)      配置node2节点上的keepalived配置文件;

        Linux自学笔记——keepalived_第38张图片

        3)      启动两台rs server的web服务,和启动两台director的keepalived服务;

        Note:保证四台主机的iptables和selinux不会影响演示。

3.      测试;

        1)      查看node1的keepalived日志等信息,自动生成了ipvs规则;

        Linux自学笔记——keepalived_第39张图片

        2)      查看node2上的keepalived服务日志等信息,发现自动生成了ipvs规则,但没有获取到虚拟ip地址;

        Linux自学笔记——keepalived_第40张图片

        3)      用客户端访问测试;

        Linux自学笔记——keepalived_第41张图片

        4)      手动关闭RS1的web服务,再次测试;

        Node上的ipvs规则定义的后端主机只剩一个;

        Linux自学笔记——keepalived_第42张图片

        客户端测试:

        Linux自学笔记——keepalived_第43张图片 

        5)      重启RS1上的web服务,手动关闭node1的keepalived服务;

        Node2获取到ip地址,集群规则为两台RS:

        Linux自学笔记——keepalived_第44张图片

        客户端测试:依旧能负载均衡后端rs server

        Linux自学笔记——keepalived_第45张图片

        6)      如果后端的两台RS同时down掉,我们可以在director上定义一个sorry_server,用来提醒用户,集群服务出现故障。在上面的配置文件中,我们已经定义好了sorry server,现在提供sorry server网页文件和开启两台node的web服务。

        image.png

        7)      Down掉两台RS的web服务,再次测试;

        Linux自学笔记——keepalived_第46张图片

        再Down掉node1的keepalived服务;

        Linux自学笔记——keepalived_第47张图片

        8)      再次启动node1的keepalived,和RS1;

        Linux自学笔记——keepalived_第48张图片

        只要有一个rs启动,sorry server就会下线。

 

示例2:keepalived高可用nginx服务

1.      实验环境

四台虚拟主机,两台upstream server,两台nginx服务器作为反向代理调度器,并配置keepalived实现高可用nginx;

upstream server1:192.168.19.143;

upstream server2:192.168.19.134;

node1:192.168.19.141

node2:192.168.19.142

虚拟ip(vip):192.168.19.160

2.      两台node节点服务器配置;

        1)      在/etc/nginx/nginx.conf文件中,两台nginx服务器配置upstream模块,定义后端web服务器组并定义反向代理;(两台nginx配置相同)

        Linux自学笔记——keepalived_第49张图片

        2)      配置keepalived服务,在这里因为nginx的原因,所以无需再配置virtual server去定义后端主机;

        Node1节点:

        Linux自学笔记——keepalived_第50张图片

        Node2节点:

        Linux自学笔记——keepalived_第51张图片

3.      测试;

        1)      开启node1,node2节点上的nginx和keepalived服务;

        Node1:成功获取到地址;

        Linux自学笔记——keepalived_第52张图片

        Node2

        Linux自学笔记——keepalived_第53张图片

        2)      开启两台upstream server的web服务,用客户端测试;

        Linux自学笔记——keepalived_第54张图片

        3)      Down掉node1的keepalived服务,重新访问测试;

        Node1丢失ip地址:

        Linux自学笔记——keepalived_第55张图片

        客户端访问,服务不收影响;

        Linux自学笔记——keepalived_第56张图片

4.      如果是nginx服务出现故障而不是keepalived服务故障,这时IP地址不会出现转移,我们需要一个外部脚本监控nginx服务,一旦出现nginx服务故障,立即调用脚本,降低优先级转移ip地址;

        1)      Node1:编写监控nginx服务运行状况脚本;

        Linux自学笔记——keepalived_第57张图片

            Node1:编辑keepalived配置文件:

          Linux自学笔记——keepalived_第58张图片 

        2)      将脚本文件复制给node2下的/etc/keepalived/目录下,并编辑node2的keepalived配置文件;

        Linux自学笔记——keepalived_第59张图片

        3)      重启keepalived服务,手动kill掉node1上的nginx服务,ip地址丢失;

          Linux自学笔记——keepalived_第60张图片

        观察node2获取到了ip地址;

        Linux自学笔记——keepalived_第61张图片

        客户端测试,依旧可以访问;

        Linux自学笔记——keepalived_第62张图片

        4)      当nginx服务出现故障时,我们一种方法就是立即去手动修复或重启服务,如果不想手动去操作,可以编辑通知脚本,在主节点变为MASTER和BACKUP时,都重启nginx服务;

        Linux自学笔记——keepalived_第63张图片

        手动杀掉nginx进程,node1丢失地址,过了一会,又重新抢占了地址;

        Linux自学笔记——keepalived_第64张图片