一、keepalived介绍

        为了保证业务不间断的对外提供服务,从而需要有单独的硬件(F5)或者软件来监控服务是否能正常的提供服务,keepalived就是一种能够监控后端服务是否能正常的提供服务的一种软件,keepalived软件是根据一种路由协议实现的,协议名叫做VRRP。

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。在VRRP中有一个免费的ARP是来解决路由器或者路由器中的缓存mac地址的问题免费ARP:通知同一个网段的主机更新地址表,缓存,mac地址

keepalived两种工作模式

        1.抢占模式

                如果backup工作在抢占模式下,当收到vrrp报文后,会将自己的优先级与通告的优先级进行比对,若比通告的优先级高,则会主动抢占为master,否则继续保持backup

        2.非抢占模式

                如果backup工作在非抢占模式下,只要master不发生故障,就算backup比master优先级高也不会抢占为master

keepalived核心功能

        1.VRRP:地址转移

        2.检查IPVS健康状态,若后端服务出现故障,能够自动的踢出和添加

        3.添加IPVS规则,直接在keepalived配置文件中就可以添加IPVS功能

二、使用keepalived实现VRRP的双主模型配置(单主则直接添加一个即可)

        该配置只是在两台不同的主机上配置keepalived,没有配置任何的服务,只是起到了VRRP能够在任何一台主机故障,虚拟IP地址还是可用

主机1

[root@centos7 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   notification_email {
         root@loaclhost  #这里填写可以真正发送邮件的邮件服务器     
   }
   notification_email_from keepalived@localhost  #发送人
   smtp_server 127.0.0.1   #主机地址
   smtp_connect_timeout 10  #超时时间
   router_id test1    #该ID不能与其他服务器一致
   vrrp_mcast_group4 224.255.255.255   #广播地址,可以使用任意广播地址
}
vrrp_instance VI_1 {   #指定VRRP
state MASTER    #工作模式
interface ens38   #物理网卡
virtual_router_id 11   #相同的VRRP应该一致,不同的VRRP不能一致
priority 100   #优先级,1-255
advert_int 1   #每隔多久发送一个ARP
authentication {
auth_type PASS   #认证机制,
auth_pass 12345678  #密码,最长8位字符
}
virtual_ipaddress {
192.168.1.200/24 dev ens38     #虚拟IP地址,网卡等信息
}
track_interface {
ens38    #监控的网卡,可以监控多个
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens38
virtual_router_id 22
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 87654321
}
virtual_ipaddress {
192.168.1.222/24 dev ens38
}
track_interface {
ens38
}
}

主机2

[root@centos7 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   notification_email {
root@loaclhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 10
   router_id test2
   vrrp_mcast_group4 224.255.255.255
}
vrrp_instance VI_1 {
state BACKUP
interface ens38
virtual_router_id 11
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.1.200/24 dev ens38
}
track_interface {
ens38
}
}
vrrp_instance VI_2 {
        state MASTER
        interface ens38
        virtual_router_id 22
        priority 100
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 87654321
        }       
        virtual_ipaddress {
                192.168.1.222/24 dev ens38
        }       
        track_interface {
                ens38
        }       
        
}

三、使用keepalived高可用IPVS

        准备环境,若需要测试则需要四台主机,两台做后端的提供web服务的机器,两台做高可用IPVS,这里只配置前端高可用的配置

[root@centos7 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
	root@loaclhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 10
   router_id test1
   vrrp_mcast_group4 224.255.255.255
}
vrrp_instance VI_1 {
	state MASTER
	interface ens38
	virtual_router_id 11
	priority 100
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 12345678
	}
	virtual_ipaddress {
		192.168.1.200/24 dev ens38
	}
	track_interface {
		ens38
	}
}
virtual_server 192.168.1.200 80 {     #IPVS的设置,需要指定使用哪一个虚拟主机
        delay_loop 1     #轮询间隔
        lb_algo rr       #轮询算法支持rr|wrr|lc|wlc|lblc|sh|dh
        lb_kind DR       #模型 DR|NAT|TUN
        persistence_timeout 10   超时时间
        protocol TCP   #使用协议,只支持TCP
        sorry_server 127.0.0.1 80   #当所有服务都不可用时,指定错误页面,一般指向本机
        real_server 192.168.1.153 80 {   #都断的服务器
                weight 1   #权重
                HTTP_GET {   #方法,也可以使用SSL_GET定义https协议
                        url {
                                path /   #检查的目录
                                status_code 200   #返回的状态码
                        }
                        nb_get_retry 3  #重试次数
                        delay_before_retry 10   #重试之前的延迟时长
                        connect_timeout 10   #请求超时时长
                }
        }
}

备用主机

[root@centos7 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
	root@loaclhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 10
   router_id test2
   vrrp_mcast_group4 224.255.255.255
}
vrrp_instance VI_1 {
	state BACKUP
	interface ens38
	virtual_router_id 11
	priority 98
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 12345678
	}
	virtual_ipaddress {
		192.168.1.200/24 dev ens38
	}
	track_interface {
		ens38
	}

}
virtual_server 192.168.1.200 80 {
        delay_loop 1
        lb_algo rr
        lb_kind DR
        persistence_timeout 10
        protocol TCP
        sorry_server 127.0.0.1 80
        real_server 192.168.1.153 80 {
                weight 1
                HTTP_GET {
                        url {
                                path /
                                status_code 200
                        }
                        nb_get_retry 3
                        delay_before_retry 10
                        connect_timeout 10
                }
        }
}

        在该模型下,也需要和IPVS配置NAT模型时更改的内核参数,和添加指向keepalived服务器的路由,参考更改配置如下,在多台后端服务器上都需要修改,若需要永久生效,则需要将配置更改到/etc/sysctl.conf文件中

                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
[root@centos7 ~]#ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 broadcast 192.168.1.200 up
[root@centos7 ~]#route add -host 192.168.1.200 dev lo:0

四、使用keepalived高可用nginx,因为keepalived内置并不能直接高可用nginx,所以需要依靠脚本文件来实现,这里只是简单的实现高可用,基本拓扑图如下图,但是DNS一般就是指的添加两条A记录,并不是自己搭建DNS服务器

keepalived+nginx拓扑图.jpg

相关配置文件

调用脚本

1.定义脚本
vrrp_script  脚本名 {
	script ""
	interval INT   #检测间隔
	weight  -INT|+INT   #表示满足条件后增加权重或减少权重,从而达到动态的切换
}
2.调用脚本
track_script {
	脚本1
	脚本2
}

两台主机的相关配置

keepalivedA

[root@centos7 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
	root@loaclhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 10
   router_id test1
   vrrp_mcast_group4 224.255.255.255

}
vrrp_script test {
	script "killall -0 nginx"
	interval 1
	weight -5
	fall 2
	rise 1
}
vrrp_instance VI_1 {
	state MASTER
	interface ens38
	virtual_router_id 11
	priority 100
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 12345678
	}
	virtual_ipaddress {
		192.168.1.200/24 dev ens38
	}
	track_interface {
		ens38
	}
	track_script {
		test
	}

}

keepalivedB

[root@centos7 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
	root@loaclhost
   }
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 10
   router_id test2
   vrrp_mcast_group4 224.255.255.255
}
vrrp_script test {
        script "killall -0 nginx"
        interval 1
        weight -5
	fall 2
	rise 1
}
vrrp_instance VI_1 {
	state BACKUP
	interface ens38
	virtual_router_id 11
	priority 98
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 12345678
	}
	virtual_ipaddress {
		192.168.1.200/24 dev ens38
	}
	track_interface {
		ens38
	}
       track_script {
                test
        }


}
vrrp_instance VI_2 {
        state MASTER
        interface ens38
        virtual_router_id 22
        priority 100
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 87654321
        }       
        virtual_ipaddress {
                192.168.1.222/24 dev ens38
        }       
        track_interface {
                ens38
        }       
        track_script {
                test
        }       
}